'server.xml'에 해당되는 글 2건

  1. 2010.09.02 Tomcat Web Server SSL 설정
  2. 2009.07.28 Apache + JBoss 연동 및 HTTPS(SSL 통신)
2010. 9. 2. 18:53

Tomcat Web Server SSL 설정

디지털 커머스의 증가와 중요한 데이터간의 이동이 필요함에 따라서 보안은 모든 어플리케이션에서 중요한 자리를 차자하고 있습니다. 일반적으로 client 와 서버간에 사용자를 확인하기 위한 방법으로 username 과 password 를 체크합니다. 이를 사용하는 보안 처리 기법으로 Secure Sockets Layer (SSL) 과 Java Authentication and Authorization Service (JAAS)를 사용할 수가 있습니다. 먼저 SSL로 보안인증을 거치는 방법을 보고 java 에서 지원하는 다른 사용자 인증서비스인 JAAS을 jsp와 서블릿에서 사용하는 법을 보겠습니다.


1. 톰켓에서 사용자 인증 처리하기

톰켓으로 사용자 인증처리를 하기전에 먼저 username, password, role 을 등록해야 합니다. 등록하는 방법은 아주 쉽습니다. 톰켓이 설치된 폴더에서 /conf 에 보면 tomcat-user.xml 파일이 있습니다. 없으면 에디터 창에서 새로 만들어도 됩니다. 

<?xml version='1.0' encoding='utf-8'?><?xml version='1.0' encoding='utf-8'?> 
<tomcat-users> 
    <role rolename="dbadmin"/> 
    <role rolename="manager"/> 
    <user username="hans" password="hansworld" roles="dbadmin,manager"/> 
    <user username="jojo" password="33dsk3" roles="manager"/> 
</tomcat-users> 

위 소스에서 hans는 dbadmin과 manager의 권한을 갖고 jojo는 manager의 권한을 갖습니다. 

다음으로 톰켓서버에서 SSL을 셋팅해야 합니다. 이는 username이나 password 가 http상에서 이동할 때 암호화 되어 이동하기 때문에 중간에 악의적인 의도로 가로채거나 훔쳐내는 것을 방지해 줍니다. SSL을 셋팅하기 위해선 2가지 절차를 거쳐야 합니다.

1. java sdk에서 지원해주는 keytool로 keystore 파일을 만듭니다. 이 파일은 보안 접속을 하는 서버가 디지털 인증을 암호화 해서 사용하는데 쓰여집니다. 
2. 톰켓의 conf/server.xml 파일에 SSL Connector에 있는 주석을 제거합니다.

keytool은 java가 설치된 in 에서 찾을 수 있습니다. 

%JAVA_HOME%inkeytool -genkey -alias tomcat -keyalg RSA 

위의 명령을 실해하면 keystore 파일이 생성되는데 몇가지 질문을 합니다. 처음으로 패스워드를 물어보는데 톰켓에서 기본적으로 "changeit" 란 패스워드로 셋팅되어 있습니다. 나머지는 원하지 않으면 그냥 엔터키만 치면 됩니다. 

Enter keystore password: changeit 
What is your first and last name? 
[Unknown]: Bruce Perry 
What is the name of your organizational unit? 
[Unknown]: 
What is the name of your organization? 
[Unknown]: 
What is the name of your City or Locality? 
[Unknown]: 
What is the name of your State or Province? 
[Unknown]: 
What is the two-letter country code for this unit? 
[Unknown]: 
Is CN=Bruce Perry, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? [no]: yes 
Enter key password for <tomcat>
(RETURN if same as keystore password):

다음에 conf/server.xml 에 있는 SSL Connector 요소에 있는 주석을 제거합니다.

<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<connector disableuploadtimeout="true" useurivalidationhack="false" secure="true" scheme="https" debug="0" acceptcount="100" enablelookups="true" maxprocessors="75" minprocessors="5" port="8443" classname="org.apache.coyote.tomcat4.CoyoteConnector">
<factory classname="org.apache.coyote.tomcat4.CoyoteServerSocketFactory" protocol="TLS" clientauth="false" />
</connector>

SSL은 일반 http 가 아닌 https 를 사용합니다. 또한 포트도 웹에서 80, 톰켓에서 8080 처럼 8443의 번호를 사용합니다.

https://localhost:8443/myhome/default.jsp


2. BASIC authentication BASIC Authentication

Basic 인증은 웹자원과 함께 사용되어온 보안 방법이고 거의 모든 브라우져가 이를 지원합니다. 일반적으로 사용자 이름과 비밀번호를 전송할 때 네트워크 상에서 Base64 인코딩 방식을 사용하는데 이는 디코딩하기 아주 쉽기때문에 보안적이라고 할 수 없습니다. 따라서 Basic Authentication 과 SSL 을 사용한 보안 방식을 사용합니다.

1. 먼저 처음에 설명했지만 username, password, role을 conf/tomcat-users.xml 에서 설정합니다.
2. security-constraint element 로 인증에 필요한 자원을 web.xml 파일에 기술합니다.
3. "BASIC"이라고 auth-method요소 사이에 적습니다. 이 auth-method 요소는 login-config요소에 들어갑니다.

<!-- Beginning of web.xml deployment descriptor -->
<security-CONSTRAINT>
<web-RESOURCE-COLLECTION>
<web-RESOURCE-NAME>JSP database component</web-RESOURCE-NAME> 
<url-PATTERN>/myhome.jsp</url-PATTERN> 
<http-METHOD>GET</http-METHOD> 
<http-METHOD>POST</http-METHOD> 
</web-RESOURCE-COLLECTION>
<auth-CONSTRAINT>
<role-NAME>dbadmin</role-NAME> 
</auth-CONSTRAINT>
<user-DATA-CONSTRAINT>
<transport-GUARANTEE>CONFIDENTIAL</transport-GUARANTEE> 
</user-DATA-CONSTRAINT>
</security-CONSTRAINT>
<login-CONFIG>
<auth-METHOD>BASIC</auth-METHOD> 
</login-CONFIG>
<security-ROLE>
<role-NAME>dbadmin</role-NAME> 
</security-ROLE>
<!-- Rest of web.xml deployment descriptor -->

web.xml 을 이렇게 편집한 후에 https://localhost:8443/myhome.jsp 로 들어가보면 아이디와 비밀번호를 입력하라는 창이 뜹니다. 여기서 만일 role 이 dbadmin 이 아니라면 아이디와 비밀번호가 맞아도 인증에 실패하게 됩니다. 반드시 해당 사용자가 인증에 필요한 role을 가지고 있어야 합니다.


3. Form-Based Authentication 의 사용 

서블릿은 일반 BASIC authentication 말고도 사용자 기반 인증인 Form-Based Authentication 제공합니다. 이는 톰켓에서 보여주는 BASIC authentication 의 단순화를 덜어주며 일반적으로 사용하는 form 방식을 사용하기 때문에 이용하기도 편합니다. 이역시 SSL 과 HTTPS를 사용하여 네트워크상에서 이동하는 데이터들을 보호합니다.

먼저 web.xml 셋팅을 보겠습니다. 파일의 맨 처음부분에 보안 관련 element를 기술하게 됩니다. security-constraint 부분은 BASIC authentication 과 같습니다. login-config 셋팅부분이 약간 다르긴 하지만 그렇게 크게 다르지는 않습니다.

<login-CONFIG>
<auth-METHOD>FORM</auth-METHOD>
<form-LOGIN-CONFIG>
<form-LOGIN-PAGE>/login.html</form-LOGIN-PAGE>
<form-ERROR-PAGE>/loginError.jsp</form-ERROR-PAGE>
</form-LOGIN-CONFIG>
</login-CONFIG>

실제 jsp에서 
<form>테그를 사용하여 사용자 정보를 전송하는데 이때 주의할 점은 form 태그의 action 요소의 값을 'j_security_ckeck' 로 하고 사용자 이름과 비밀번호의 이름을 'j_username' 과 'j_password'로 해야합니다. 로그아웃 시에는 HttpSession 객체의 invalidate() 메소드를 호출하면 됩니다.</form>


출처 : http://dreamholic.egloos.com/

Trackback 0 Comment 0
2009. 7. 28. 14:58

Apache + JBoss 연동 및 HTTPS(SSL 통신)

JBoss를 아파치와 연동을 하는 부분을 시도해보겠다. 일단 준비물은 아래와 같다.

1. httpd-2.2.11
     (apache 2.2.11 openssl을 이용하여 https 서비스가 가능게 설치된것)
2. JBoss 5.1.0 GA 
     (5.x 버전이면 크게 상관이 없을듯하다. 4.x 버젼과 조금은 차이가 있지만....)
3. mod_jk 1.2.28

 
1. %APACHE_HOME/conf/httpd.conf 수정
 
  1. .. 생략 .. (파일 마지막 부분)   
  2. # Secure (SSL/TLS) connections   
  3. Include conf/extra/httpd-ssl.conf  <---- ssl 통신(https)을 사용한다면...주석해제..   
  4. #   
  5. # Note: The following must must be present to support   
  6. #       starting without SSL on platforms with no /dev/random equivalent   
  7. #       but a statically compiled-in mod_ssl.   
  8. #   
  9. <IfModule ssl_module>  
  10. SSLRandomSeed startup builtin   
  11. SSLRandomSeed connect builtin   
  12. </IfModule>  
  13.   
  14. # Include mod_jk configuration file   
  15. Include conf/mod-jk.conf                         <------- mod_jk 설정 파일 추가   
  16.   
  17. # http 프로토콜로 클라이언트가 요청시 https로 리와이트 시켜주는 부분   
  18. # ssl통신(https) 사용안하면 추가해주지 않아도 됨   
  19. RewriteEngine On   
  20. RewriteCond %{HTTPS} !=on   
  21. RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

 
2. %APACHE_HOME/conf/mod-jk.conf 생성
 
  1. # Load mod_jk module   
  2. # Specify the filename of the mod_jk lib   
  3. LoadModule jk_module modules/mod_jk.so   
  4.   
  5. # Where to find workers.properties   
  6. JkWorkersFile conf/workers.properties   
  7.   
  8. # Where to put jk logs   
  9. JkLogFile logs/mod_jk.log   
  10.   
  11. # Set the jk log level [debug/error/info]   
  12. JkLogLevel info   
  13.   
  14. # Select the log format   
  15. JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"   
  16.   
  17. # JkOptions indicates to send SSK KEY SIZE   
  18. # Note: Changed from +ForwardURICompat.   
  19. # See http://tomcat.apache.org/security-jk.html   
  20. JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories   
  21.   
  22. # JkRequestLogFormat   
  23. JkRequestLogFormat "%w %V %T"   
  24.   
  25. # You can use external file for mount points   
  26. # It will be checked for updates each 60 secondes   
  27. # The format of the file is : /url=worker  
  28. # /examples/*=loadbalancer   
  29. JkMountFile conf/uriworkermap.properties  
 
 
3. %APACHE_HOME/conf/workers.properties 생성
 
  1. # Define list of workers that will be used   
  2. # for mapping requests   
  3. # The configuration directives are valid   
  4. # for the mod_jk version 1.2.18 and later   
  5. worker.list=xbrlworker  
  6.   
  7. # Define Node1   
  8. # modify the host as your host IP or DNS name   
  9. worker.xbrlworker.port=8009  
  10. worker.xbrlworker.host=localhost  
  11. worker.xbrlworker.type=ajp13  

 
4. %APACHE_HOME/conf/uriworkermap.properties 생성
 
  1. # Simple worker configuration file   
  2. #   
  3.   
  4. # Mount the Servlet context to the ajp13 worker   
  5. /jmx-console=xbrlworker  
  6. /jmx-console/*=xbrlworker   
  7. /web-console=xbrlworker  
  8. /web-console/*=xbrlworker  

 
5. %JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml 수정
 
  1. <Service name="jboss.web">  
  2. ... 생략 ...   
  3.       <!-- A HTTP/1.1 Connector on port 8080 -->  
  4.       <!-- URIEncoding="UTF-8" 추가 -->  
  5.       <Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}"  
  6.                connectionTimeout="20000" redirectPort="8443"  URIEncoding="UTF-8" />  
  7. ... 생략 ...   
  8. <!-- SSL/TLS Connector configuration using the admin devl guide keystore   
  9.       <Connector protocol="HTTP/1.1" SSLEnabled="true"  
  10.            port="8443" address="${jboss.bind.address}"  
  11.            scheme="https" secure="true" clientAuth="false"  
  12.            keystoreFile="${jboss.server.home.dir}/conf/chap8.keystore"  
  13.            keystorePass="rmi+ssl" sslProtocol = "TLS" />  
  14.       -->  
  15.       <!-- jvmRoute="xbrlworker" 추가 -->  
  16.       <Engine name="jboss.web" defaultHost="localhost" jvmRoute="xbrlworker" >  
  17. ... 생략 ...  

 
6. %APACHE_HOME/conf/extra/httpd-ssl.conf 수정
(https 통신을 위한 설정 - https가 필요없다면 하지 않아도 된다.)

  1. ... 생략 ... (파일 마지막 부부분 </VirtualHost> 위에 JKMountFile 설정 ...)   
  2. JkMountFile conf/uriworkermap.properties   
  3. </VirtualHost>  

 
7. apache 구동

    # apachectl start  

 
8. JBoss 구동

  
  # run.sh &

※ 주의
 JBoss만 구동하여 외부에서 접속하기 위해서는 구동시 -b 옵션으로 서버IP를 설정해야 하지만, 아파치와 연동시 -b 옵션을 주게되면 아파치와 연동이 안된다.
 %APACHE_HOME/conf/workers.properties 파일에서 설정한 host 부분때문인것 같은데, host 부분이 localhost로 되어있기때문에 127.0.0.1의 호출로 JBoss를 연결하지 못하기 때문인듯하다. 외부에서 직접 JBoss의 접속을 사용하지 않는다면 그냥 설정한데로 사용하면 될듯!!!

 
9. https://[서버]/jmx-console/ 테스트

10. https://[서버]/web-console/ 테스트
위 테스트는 https 를이용하여 접속한것이기 때문에 주소창이 빨강색으로 표시된다.
https 를 사용하지 않고 하는 방법은 위에 https 설정만 빼고 하면 된다.


출처 : http://tylee82.tistory.com/

Trackback 0 Comment 0