아파치 톰캣 서버의 보안을 강화하고 보호하는 모범 사례를 안내하는 실용적인 정보입니다.
톰캣은 널리 사용되는 서블릿 및 JSP 컨테이너 서버 중 하나이며, 다음과 같이 트래픽이 많은 웹사이트에서 활용되고 있습니다.
- LinkedIn.com
- Dailymail.co.uk
- Comcast.net
- Walmart.com
- Reuters.com
- Meetup.com
- Webs.com
아래 그림은 Java 애플리케이션 서버 시장에서 톰캣의 점유율을 보여줍니다.
출처: 배관공
기술적으로 톰캣을 프런트엔드 서버로 사용하여 웹사이트 요청을 직접 처리할 수 있지만, 실제 운영 환경에서는 아파치(Apache)나 Nginx 같은 웹 서버를 프런트엔드로 두고 톰캣으로 요청을 라우팅하는 것이 일반적입니다.
웹 서버를 사용하여 요청을 처리하면 성능과 보안 측면에서 이점을 얻을 수 있습니다. 특히 아파치 HTTP를 프런트엔드 웹 서버로 사용하는 경우 보안에 더욱 신경 써야 합니다.
기본 톰캣 구성은 민감한 정보를 노출할 수 있으며, 이는 해커가 응용 프로그램 공격을 준비하는 데 악용될 수 있습니다.
이 가이드는 톰캣 7.x 버전과 UNIX 환경을 기준으로 테스트되었습니다.
대상 독자
이 가이드는 미들웨어 관리자, 애플리케이션 지원 담당자, 시스템 분석가 또는 톰캣 보안 강화에 관심 있는 모든 사람을 위해 만들어졌습니다.
톰캣 및 UNIX 명령어에 대한 기본적인 지식은 필수입니다.
참고 사항
HTTP 헤더를 확인하는 데 사용할 수 있는 몇 가지 도구가 필요합니다. 두 가지 방법을 소개합니다.
인터넷 연결 애플리케이션을 테스트하는 경우, 다음과 같은 HTTP 헤더 도구를 사용하여 결과를 확인할 수 있습니다.
인트라넷 애플리케이션의 경우, Google Chrome이나 Firefox 개발자 도구를 활용할 수 있습니다.
수정하려는 파일은 항상 백업해두는 것이 좋습니다.
이 가이드에서는 톰캣 설치 폴더를 $tomcat으로 지칭합니다.
이제 보안 강화 절차를 시작해 보겠습니다.
서버 배너 제거
HTTP 헤더에서 서버 배너를 제거하는 것은 가장 먼저 해야 할 보안 강화 조치 중 하나입니다.
서버 배너는 사용 중인 제품과 버전을 노출시켜 정보 유출의 위험을 높입니다.
기본 톰캣 페이지는 다음과 같이 표시됩니다.
이제 서버 헤더에서 제품 및 버전 정보를 숨기도록 하겠습니다.
- $tomcat/conf 폴더로 이동합니다.
- vi 편집기를 사용하여 server.xml 파일을 수정합니다.
- 커넥터 포트 설정에 다음 내용을 추가합니다.
Server =” “
예시:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" Server =" " redirectPort="8443" />
- 파일을 저장하고 톰캣을 재시작합니다. 이제 애플리케이션에 접속할 때 서버 헤더 값이 비어 있어야 합니다.
보안 관리자를 사용하여 톰캣 시작
보안 관리자는 브라우저에서 실행되는 신뢰할 수 없는 애플릿으로부터 사용자를 보호하는 역할을 합니다.
보안 관리자 없이 톰캣을 실행하는 것보다 보안 관리자와 함께 실행하는 것이 훨씬 안전합니다. 톰캣 공식 문서에서 관련 정보를 확인할 수 있습니다. 톰캣 보안 관리자.
이 방법의 장점은 구성 파일을 변경할 필요가 없다는 점입니다. startup.sh 파일을 실행하는 방식을 변경하면 됩니다.
–security 인수를 사용하여 톰캣을 시작하기만 하면 됩니다.
[[email protected] bin]# ./startup.sh -security Using CATALINA_BASE: /opt/tomcat Using CATALINA_HOME: /opt/tomcat Using CATALINA_TMPDIR: /opt/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar Using Security Manager Tomcat started. [[email protected] bin]#
SSL/TLS 활성화
HTTPS를 통해 웹 요청을 처리하는 것은 클라이언트와 톰캣 간의 데이터 보안을 위해 필수적입니다. 웹 애플리케이션에 HTTPS를 적용하려면 SSL 인증서를 구성해야 합니다.
키 저장소와 인증서가 준비되었다고 가정하고, server.xml 파일의 커넥터 포트 섹션에 다음 행을 추가할 수 있습니다.
SSLEnabled="true" scheme="https" keystoreFile="ssl/bloggerflare.jks" keystorePass="chandan" clientAuth="false" sslProtocol="TLS"
키 저장소 파일 이름과 비밀번호는 실제 값으로 변경해야 합니다.
키 저장소 및 CSR 생성 과정에 대한 자세한 내용은 이 가이드에서 확인할 수 있습니다.
HTTPS 강제 적용
HTTPS 강제 적용은 SSL을 활성화한 경우에만 적용됩니다. 그렇지 않으면 애플리케이션이 정상적으로 작동하지 않을 수 있습니다.
SSL을 활성화한 후에는 사용자와 톰캣 애플리케이션 서버 간의 보안 통신을 위해 모든 HTTP 요청을 HTTPS로 리디렉션하는 것이 좋습니다.
- $tomcat/conf 폴더로 이동합니다.
- vi 편집기를 사용하여 web.xml 파일을 수정합니다.
- </web-app> 태그 앞에 다음 코드를 추가합니다.
<security-constraint> <web-resource-collection> <web-resource-name>Protected Context</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
- 파일을 저장하고 톰캣을 재시작합니다.
쿠키에 Secure & HttpOnly 플래그 추가
보안 쿠키 설정이 되어 있지 않으면 웹 애플리케이션 세션 및 쿠키가 도난 또는 변조될 위험이 있습니다. 이 플래그는 응답 헤더에 추가됩니다.
web.xml 파일의 session-config 섹션에 다음 코드를 추가하면 됩니다.
<cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config>
구성 화면:
파일을 저장하고 톰캣을 재시작한 후 HTTP 응답 헤더를 확인합니다.
권한이 없는 계정으로 톰캣 실행
톰캣은 권한이 없는 별도의 사용자로 실행하는 것이 좋습니다. 이렇게 하면 한 계정이 손상되었을 때 다른 실행 중인 서비스들을 보호할 수 있습니다.
- UNIX 사용자를 생성합니다. 여기서는 ‘tomcat’이라고 가정합니다.
useradd tomcat
- 실행 중인 톰캣을 중지합니다.
- $tomcat 폴더의 소유권을 ‘tomcat’ 사용자로 변경합니다.
chown -R tomcat:tomcat tomcat/
톰캣을 시작하고 ‘tomcat’ 사용자로 실행 중인지 확인합니다.
기본/불필요한 애플리케이션 제거
기본적으로 톰캣에는 프로덕션 환경에서 필요하지 않을 수 있는 다음과 같은 웹 애플리케이션이 포함되어 있습니다.
톰캣 기본 애플리케이션을 제거하여 보안 위험을 줄이고 시스템을 깔끔하게 유지하는 것이 좋습니다.
- root – 기본 시작 페이지
- docs – 톰캣 문서
- examples – 데모용 JSP 및 서블릿
- manager, host-manager – 톰캣 관리
이러한 애플리케이션은 $tomcat/webapps 폴더에서 확인할 수 있습니다.
[[email protected] webapps]# ls -lt drwxr-xr-x 14 tomcat tomcat 4096 Sep 29 15:26 docs drwxr-xr-x 7 tomcat tomcat 4096 Sep 29 15:26 examples drwxr-xr-x 5 tomcat tomcat 4096 Sep 29 15:26 host-manager drwxr-xr-x 5 tomcat tomcat 4096 Sep 29 15:26 manager drwxr-xr-x 3 tomcat tomcat 4096 Sep 29 15:26 ROOT [[email protected] webapps]#
SHUTDOWN 포트 및 명령어 변경
기본적으로 톰캣은 8005 포트로 종료되도록 설정되어 있습니다.
텔넷으로 IP:port에 접속하여 SHUTDOWN 명령어를 입력하면 톰캣 인스턴스를 종료할 수 있다는 사실을 알고 계셨습니까?
Chandans # telnet localhost 8005 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. SHUTDOWN Connection closed by foreign host. Chandans #
매우 위험합니다!
기본 설정은 보안상 큰 위험을 초래할 수 있습니다.
톰캣 종료 포트 및 기본 명령어를 예측하기 어렵게 변경하는 것이 좋습니다.
- server.xml 파일에서 다음 내용을 수정합니다.
<Server port="8005" shutdown="SHUTDOWN">
8005 – 사용하지 않는 다른 포트로 변경
SHUTDOWN – 복잡한 값으로 변경
예시:
<Server port="8867" shutdown="NOTGONNAGUESS">
기본 404, 403, 500 페이지 교체
찾을 수 없음, 접근 금지, 서버 오류 등에 대한 기본 페이지는 톰캣의 버전 정보를 노출할 수 있습니다.
기본 404 페이지를 살펴보겠습니다.
이러한 문제를 해결하기 위해 먼저 일반 오류 페이지를 생성하고, 오류 발생 시 해당 페이지로 리디렉션하도록 web.xml 파일을 구성할 수 있습니다.
- $tomcat/webapps/$application 폴더로 이동합니다.
- vi 편집기를 사용하여 error.jsp 파일을 생성합니다.
<html> <head> <title>Error Page</title> </head> <body> That's an error! </body> </html>
- $tomcat/conf 폴더로 이동합니다.
- web.xml 파일에 다음 내용을 추가합니다. </web-app> 태그 앞에 추가해야 합니다.
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <error-page> <error-code>403</error-code> <location>/error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page>
- 톰캣 서버를 재시작하여 설정을 적용합니다.
훨씬 나아졌습니다!
java.lang.Exception에 대한 설정도 위와 동일하게 적용할 수 있습니다. 이렇게 하면 Java 예외 발생 시 톰캣 버전 정보가 노출되는 것을 방지할 수 있습니다.
web.xml 파일에 다음 내용을 추가하고 톰캣 서버를 재시작합니다.
<error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page>
이 가이드가 톰캣 보안에 대한 아이디어를 제공해 주기를 바랍니다. 톰캣 관리에 대해 더 자세히 알아보고 싶다면 다음 온라인 강좌를 확인해 보세요. 온라인 코스.
또한, 여기에서 톰캣 종료 시 암호 요청을 중지하도록 WAS를 구성하는 방법을 배울 수 있습니다.