관리가 잘 되어 있는 사이트라면 Tomcat 을 root 로 기동하여 운영하는 경우는 드물 것입니다. 비단 Tomcat 뿐 아니라 JBoss 나 WebLogic 의 경우도 마찬가지 일 것으로 생각합니다. (단, 반드시 root 를 요구하는 일부 웹 애플리케이션 서버도 있는 것으로 알고 있음)

별도 관리계정이 있는 상황에서 아마도 실수로, 한 차례 root 로 기동하게 되면 골치 아픈 일이 발생합니다. 설정 파일이나 내부 관리 파일 (특히 .으로 시작하여 잘 보이지 않는 파일들), 특히 로그 파일이 root 소유로 바뀌어 버리게 되는 경우인데요, 다시 원래의 관리계정으로 기동하려고 한다면 먼저 그 파일들을 하나하나 찾아서 chown 해줘야 하는 불편함이 발생합니다.

이에 기동 시점에 그 기동 계정이 root 인지 아닌지 확인하는 로직을 넣어서 사용하는 경우가 많이 있는데, 물론 그 방법은 좋은 방법이고 그와 별도로 Tomcat 자체에서 root 사용을 방지하게 하는 방법이 있기도 합니다.

server.xml 에 다음을 추가합니다.

<Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="root" />

 

그리고 root 로 기동을 하게 되면 다음과 같은 로그가 나오면서 기동에 실패합니다.

java.lang.Error: Start attempted while running as user [root]. Running Tomcat as this user has been blocked by the Lifecycle listener org.apache.catalina.security.SecurityListener (usually configured in CATALINA_BASE/conf/server.xml)
        at org.apache.catalina.security.SecurityListener.checkOsUser(SecurityListener.java:154)
        at org.apache.catalina.security.SecurityListener.doChecks(SecurityListener.java:142)
        at org.apache.catalina.security.SecurityListener.lifecycleEvent(SecurityListener.java:63)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:99)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:638)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:663)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:280)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)

 

단, 이 방법의 단점이 있습니다.

만일 기동 과정에서 로그 파일과 GC 로그 파일이 새로 생성되는 방식이라면 그 파일들은 root 소유로 생성이 됩니다. (해당 파일을 미리 backup 디렉토리로 옮긴 후에 최종 기동이 되는 경우가 이에 해당됩니다) 다만, 만일 기존 관리 계정으로 생성된 파일이 존재하고 해당 파일에 append 되는 방식이라면 파일 소유는 계속 기존 관리계정으로 유지됩니다.

이유는 이 방법의 경우 일단 Tomcat 서버가 시작이 되고, root 라면 서버가 중지되는 방식이기 때문입니다. 기동 이전에 root 여부를 확인하는 로직을 태우는 것이 더욱 확실하긴 하겠지요.