Apache Tomcat 강화 및 보안 가이드

아파치 톰캣 서버의 보안을 강화하고 보호하는 모범 사례를 안내하는 실용적인 정보입니다.

톰캣은 널리 사용되는 서블릿 및 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를 구성하는 방법을 배울 수 있습니다.