Tomcat 보안 개요

Security 2009. 3. 12. 14:39

1. Tomcat 컨테이너 구조

톰켓은 다음그림과 같이 중첩된 컨테이너 구조로 되어 있습니다. Server 라는 컨테이너가 가장 바깥쪽의 컨테이너 이고 그 안에 Service라는 컨테이너가 있으며톰켓은 디폴트로 Catalina Service 컨테이너를 정의하고 있습니다.

Catalina Service 컨테이너에는 다수의 Connector와 하나의 Engine이 정의됩니다. Connector는 외부의 HTTP/HTTPS/AJP 요청을 직접 받아들이는 컴포넌트입니다. 정의된 모든 Connector로부터 수신된 요청은 Engine으로 전달됩니다.

Engine 컨테이너에는 다수의 Host 컨테이너들과 Realm 그리고 Valve들로 구성됩니다.

Host 컨테이너에는 다수의 Context들과 Valve들로 구성됩니다. Valve는 요청 체인의 일부분을 구성하는 컴포넌트로 Engine 컨테이너 및 Host컨테이너에서 정의합니다.

요청 체인의 예를 들면 아마도 다음과 같은 구조일 것입니다.

ConnectoràEngineàValveàValve… àHostà ValveàValve…

àContextàServlet FilteràServlet







설정 파일 예:

Serverport는 서버를 shutdown 시킬 때 사용되는 포트입니다. 8005 포트로 소켓을 열고 “SHUTDOWN”이란 문자열을 전송하면 톰켓이 종료됩니다. , shutdown은 동일 시스템에서만 가능합니다.

<Server port="8005" shutdown="SHUTDOWN">

……

<Service name="Catalina">

……

<Connector port="80" ……/>

……

<Connector port="8443" …… scheme="https" clientAuth="false" sslProtocol="TLS" />

……

<Connector port="8009" …… protocol="AJP/1.3" />

……

<Engine name="Catalina" defaultHost="localhost">

<Valve className="org.apache.catalina.valves.RequestDumperValve"/>

<Realm className="org.apache.catalina.realm.MemoryRealm" />

<Host name="localhost" appBase="webapps" ……>

<Valve className="org.apache.catalina.authenticator.SingleSignOn" />

<Context path="/ROOT" … docBase="C:\webroot" />

<Context path="/abc" … docBase="C:\abc" />

</Host>

</Engine>

</ Service>

</Server>

2. Tomcat 인증 메커니즘

톰켓에서 제공하는 인증 방법은 다음과 같이 네 가지가 있습니다. BASIC DIGEST 인증은 브라우저가 보안이 설정된 영역(페이지)에 접근을 시도하면, 웹 서버는 클라이언트 인증을 요청합니다. 브라우저는 이에 대한 응답을 위하여 사용자에게 사용자 인증 정보 입력을 요청합니다. 브라우저가 입력 받은 인증을 위한 정보를 가지고 다시 페이지를 요청합니다. 인증이 성공적으로 수행되면 웹 페이지가 다운로드 됩니다.

- BASIC

- DIGEST

- Form

- HTTPS Client Certification

2.1 BASIC 인증

브라우저에서 다이얼로그로부터 입력 받은 ID/PWD base64로 인코드 하여 서버에 전달합니다. 암호화되지 않은 사용자 비밀번호가 그대로 전달되며 한번 로그인 후에 인증 정보가 브라우저의 Cache에 저장되어 있으므로 브라우저 종료 전에 로그아웃 방법 없습니다.

2.2 DIGEST 인증

브라우저에서 비밀번호의 digest(해쉬) 값을 전달합니다. 비밀번호가 전달되지 않으므로 BASIC 인증 보다 더 안전한 방법입니다. 하지만 톰켓에서는 서버에 비밀번호를 일반 텍스트 문자로 관리해야 합니다. 또한 BASIC 인증과 같이 브라우저 Cache 문제를 가지고 있습니다.

2.3 Form 인증

브라우저가 인증 프로세스에 직접적으로 관여하지 않습니다. 인증은 사용자가 작성한 Html From 페이지를 통하여 인증정보를 전달합니다. 다만 form action 속성 및 사용자 ID, 비밀 번호 입력 필드의 이름이 다음과 같은 규칙을 따르도록 작성하시면 됩니다.

j_security_check : <form> 태그의 action 속성값

j_username : 사용자 이름 입력 필드 태그의 name 속성

j_password : 비밀번호 입력 필드 태그의 name 속성

2.4 HTTPS Client Certification 인증

클라이언트 인증서를 이용하여 인증을 수행합니다.

3. Security Realm

웹 응용프로그램을 위한 Credential 저장소로 웹 어플리케이션 사용자 인증을 위하여 사용하는 사용자이름, 비밀번호 및 각 사용자와 관련된 역할(Role)리스트를 관리하는 데이터베이스입니다. RealmServlet 스팩에 정의된 표준 메커니즘이며, 표준 인터페이스이며 톰켓 5.0에는 다음과 같은 Credential이 구현되어 있습니다.

- File based, in-memory realm

- JDBC Realm

- JNDI-based Realm

- JAAS-based Realm

4. Configuration Authentication

보호되어야 하는 웹 페이지에 대한 접근 제한을 설정합니다. 설정은 WEB-INF 폴더에 있는 web.xml 파일에서 정의합니다.

다음은 웹 응용프로그램 전체에 대하여 user 라는 권한(Role)을 가진 사용자만 접근할 수 있도록 설정한 예 입니다. 사용자 인증을 위하여 사용한 방법은 FORM 인증 방법이고 “/login.jsp” 파일을 로그인 Form 페이지로 설정하고 있습니다. 여기서 realm-name Realm을 가리키는 이름이 아닙니다. 실제로 Realm과 관계가 업습니다. 다만 브라우저가 BASIC DIGEST 인증을 위하여 인증 창을 띄울 때 영역: ” 이라는 텍스트 문구에 보여지는 문자열입니다.

<web-app ...>

<security-constraint>

<web-resource-collection>

<web-resource-name>Entire Application</web-resource-name>

<url-pattern>/*</url-pattern>

</web-resource-collection>

<auth-constraint>

<role-name>user</role-name>

</auth-constraint>

</security-constraint>

<login-config>

<auth-method>FORM</auth-method>

<realm-name>Single Sign-on Example</realm-name>

<form-login-config>

<form-login-page>/login.jsp</form-login-page>

<form-error-page>/notAuthenticated.jsp</form-error-page>

</form-login-config>

</login-config>

5. Configuration Realm

Realmserver.xml 파일의 <Engine> 컨테이너 설정 내에서 정의하며 하나만 정의해야 합니다.

다음 예는 톰켓에서 제공하는 메모리기반 Realm을 설정한 것이며, 인증 관련 정보는 “$CATALINA_HOME/conf/tomcat-users.xml“ 파일에 설정합니다.

메모리기반 Realm의 단점은 수행 중에 변경할 수 없다는 것입니다. 예를 들어 어던 사용자의 권한을 변경하고자 한다면 xml파일을 편집하고 Tomcat을 다시 구동해야 합니다.

<Realm className="org.apache.catalina.realm.MemoryRealm" />

$CATALINA_HOME/conf/tomcat-users.xml :

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>

<role rolename="tomcat"/>

<role rolename="role1"/>

<role rolename="manager"/>

<role rolename="admin"/>

<user username="tomcat" password=" tomcat " roles="tomcat"/>

<user username="both" password=" tomcat " roles="tomcat,role1"/>

<user username="role1" password=" tomcat " roles="role1"/>

<user username="admin" password=" tomcat " roles="admin,manager"/>

</tomcat-users>

6. 사용자 인증정보 이용

접근제어가 필요한 페이지에 대하여 인증이 성공적으로 수행되면 Servlet JSP 페이지에서 HttpServletRequest 객체의 메소드를 이용하여 로그인한 사용자의 정보를 이용할 수 있습니다.

- public java.lang.String getRemoteUser()

로그인 시 사용한 사용자 로그인 ID를 조회합니다.

- public boolean isUserInRole(java.lang.Stringrole)

로그인한 사용자가 인자로 주어진 role에 해당하는 Role을 가지고 있는지 확인합니다.

- public java.security.Principal getUserPrincipal()

로그인한 사용자의 Principal을 조회합니다.

'Security' 카테고리의 다른 글

웹해킹 분석과 웹쉘 탐지 및 대응방법 2  (0) 2009.04.05
웹 해킹 서버 분석과 웹쉘 대응방법 1편  (0) 2009.04.05
centos5 geoip patch하기  (0) 2008.07.30
MySQL DB 보안(1)  (0) 2007.06.11
FreeBSD 보안 하드닝 Tip  (0) 2007.06.11
, .