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" />