Print
카테고리: [ Apache Tomcat ]
조회수: 21196

1. 개요

몇가지 Tomcat 보안 설정에 대하여 정리합니다.


2. HTTP method

Tomcat에서 HTTP method는 다음과 같다.

 HTTP method  HTTP Servlet class method  상세
 GET   doGet  Resource 를 읽는데 사용
 POST    doPost   새로운 Resource 생성(crerate)
 PUT    doPut  Resource 갱신(update)
 DELETE   doDelete  Resource 삭제(delete)
 HEAD   doHead  GET 과 유사하나 resource 의 body 가 아닌 metadata 만 load
 OPTIONS   doOptions  Client 와의 option 만 반환
 TRACE   doTrace  진단에 사용

 

TRACE의 경우는 Connector 설정의 allowTrace를 통해 관리한다. (7.0.50 기준으로 default false 임)

이외에 사용하지 않는 HTTP method 를 비활성화 하기 위해서는 각 웹 어플리케이션 내 web.xml 파일의 <security-constraint> element 하위 <http-method></http-mdthod> 에 포함시킨다. 


3. Remote filter

특정 IP Address 혹은 Hostname 로부터의 request 를 허용하거나 제한하는 설정이다. Engine, Host, Context 단위로 설정이 가능하며 allow 와 deny filter를 통해 remote를 정의한다. Remote 정의는 정규 표현식을 사용할 수 있다. (Tomcat 서버는 java.util.regex 사용) 
 
 속성  상세
 className   ① org.apache.catalina.valves.RemoteAddrValve.: IP 기반
 ② org.apache.catalina.valves.RemoteHostValve : Hostname 기반
 allow   Request 를 허용하고자 하는 IP Address 혹은 hostname
 deny   Request 를 거부하고자 하는 IP Address 혹은 hostname
 denyStatus   Request가 deny 되는 경우의 HTTP response code를 설정하는 것으로, default는 403 

 

아래 예는 IP Address 기준으로 192..168.0.1와 192.168.0.2만 request 처리를 허용하고, deny시 404로 응답하는 예이다. ${CATALINA_HOME}/conf/server.xml에 설정을 추가한다.

<Server>
  <Service>
    <Engine>
      <Host>
      …
      <Valve className="org.apache.catalina.valves.RemoteAddrValve" 
             allow="192.168.0.1|192.168.0.2"
             denyStatus="404"/>
      …
      </Host>
    </Engine>
  </Service>
</Server>

4. Directory list

기본 적으로 특정 directory를 URL 로 요청할 경우 directory 목록이 출력된다. 이를 방지하기 위하여 ${CATALINA_HOME}/conf/web.xml 에 listings parameter 설정을 확인한다. 
 
<servlet>
…
<init-param>
<param-name>listing</param-name>
<param-value>flase</param-value>
</init-param>
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.0.1"/>
…
</servlet>

6.0.x 이후는 default로 false이다.


5. Security manager

Security manager는 인증되지 않은 접근으로부터 자원을 보호하는 Java 매커니즘이다. 만일 어떠한 코드 내부에 System.exit(1) 이 포함되어 있다고 하자. 그리고 그 코드가 실행된다. 그러면 Tomcat 인스턴스는 종료된다. 이런 상황은 특정 메소드나 클래스의 명시적 호출을 방지하는 Security manager의 보안 정책 설정을 통해 해결할 수 있다. 코드 검증이 어려운 third-party 라이브러리나 특히 오픈 소스 라이브러리 사용 시 security manager의 사용을 고려해 볼 수 있다.
 
하지만 Security manager의 적용은 신중해야 한다. Security manager가 있는 경우 더 많은 effort가 투여되며, 애플리케이션과의 충돌이 발생할 수도 있다. 만일 다음과 같은 경우라면 적용을 고려해 볼 만 하다. (고려하라는 뜻이지 적용하라는 뜻이 아님) 
 
  • Tomcat 의 웹 콘솔이라고 할 수 있는 manager 를 통해서 관리하는 경우, 또는 원격으로 관리하는 경우
  • Public 인터넷 망에서 직접 접근이 가능한 경우
  • 중요한 개인 정보를 다루는 시스템인 경우

Security manager는 기동 및 종료 장에서 설명한 바와 같이 catalina.sh 실행 라인에 –security 옵션을 추가하는 것으로 활성화 시킬 수 있다. 그리고 정책(policy) 파일은 ${INST_HOME}/conf/tomcat.policy 파일이다.  


6. root 기동 금지

Tomcat을 root로 기동하면 보안취약점을 이용하여 시스템 관리자 권한을 빼앗길 수 있는 상황에 놓일 수 있다. 다음 Listener 설정은 root 기동을 방지하게 해준다. server.xml에 넣는다.

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