2013년 1월 3일 목요일

JBoss JDBC Password encryption 방법

웹로직과 달리 JBoss 에서 JDBC connection password clear text 저장되는 점을 보완하는 방법을 기술한다.

JBoss 에서 패스워드 encryption 방법은 크게 Secured Identity 방식과 PBE (Configured Identity with Password Based Encryption) 방식으로 나뉜다.

전자는 별도로 제공하는 encryption 모듈이며, 후자는 Jboss 도메인의 JAAS (JAVA Authentication and Authorization Service) 이용한 방식이다.
방식 모두 encryption 패스워드를 추출한 *-ds.xml 기입하는 방식이나, encryption 시에 사용하는 메소드의 차이를 보인다.

도메인 전체에서 Jaas 사용하여 보안을 강화하는 경우는 PBE 방식이 간결할 수도 있으나, 단순히 데이터 소스의 패스워드만 암호화 하기 위해서는 Secured Identity 방식을 사용하는 것이 간편하다.

문서의 encryption 방식은 JBoss5.1 이상의 버전에서 유효하다.

1.    Secured Identity 방식
1)    데이터 소스의 패스워드 암호화
SecureIdentityLoginModule 이용하여 clear text 패스워드를 암호화 한다.
해당 모듈은 jbosssx.jar 내에 존재한다.
1-1)       jboss-as 디렉토리로 이동한다 (엔진 디렉토리)
1-2)       다음의 명령어를 수행한다.
java cp client/jboss-logging-spi.jar:lib/jbosssx.jar org.jboss.resource.security.SecureIdentityLoginModule [패스워드]
(리턴된 결과값을 임의의 파일에 저장한다.)
2)    보안 도메인 설정
생성한 패스워드를 가지고 별도의 보안 도메인을 설정한다.
2-1) 도메인 디렉토리 내에 conf/login-coinfig.xml 파일에 다음과 같이 Application Authentication policy 추가 생성한다.
<policy>  ...     
<!-- Example usage of the SecureIdentityLoginModule -->
      <application-policy name="EncryptDBPassword">
          <authentication>
              <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
                  <module-option name="username">admin</module-option>
                  <module-option name="password">5dfc52b51bd35553df8592078de921bc</module-option>
                  <module-option name="managedConnectionFactoryName">jboss.jca:name=PostgresDS,service=LocalTxCM</module-option>
              </login-module>
          </authentication>
      </application-policy>
  </policy>

=====================================
** SecureIdentityLoginModule 의 각 module-option 상세 설명
1.     username : database 의 접속 계정
2.     password : 1-2) 항에서 암호화한 패스워드 문자열
3.     managedConnectionFactoryName
1)     jboss.jca:name : 데이터소스의 JNDI Name
2)     jboss.jca.service : 트랜잭션 타입 지정
>> 트랜잭션 타입의 종류 <<
NoTxCM : 트랜잭션 없음
LocalTxCM : 싱글 리소스 트랜잭션 지원
TxCM : 싱글 리소스나 분산 트랜잭션 지원
XATxCM : 분산 트랜잭션 지원
=====================================















3)    생성한 보안 도메인을 이용하여 데이터 소스 구성
3-1) 구성된 *-ds.xml 상에 <user-name>, <password> 항목을 삭제
3-2) login-config.xml 에서 설정한 application-policy 이름을 가진 <security-domain> 항목 입력



<?xml version="1.0" encoding="UTF-8"?>
<datasources>
    <local-tx-datasource>
        <jndi-name>PostgresDS</jndi-name>
        <connection-url>jdbc:postgresql://127.0.0.1:5432/test?protocolVersion=2</connection-url>
        <driver-class>org.postgresql.Driver</driver-class>
        <min-pool-size>1</min-pool-size>
        <max-pool-size>20</max-pool-size>

        <!-- REPLACED WITH security-domain BELOW 주석처리
        <user-name>admin</user-name>
        <password>password</password>
        -->

        <security-domain>EncryptDBPassword</security-domain>

        <metadata>
            <type-mapping>PostgreSQL 8.0</type-mapping>
        </metadata>
    </local-tx-datasource>
</datasources>
         

2.    PBE 구성 방식 (Configured Identity with Password Based Encryption)
1)    패스워드 암호화 : PBEUtils 이용하여 암호화된 패스워드를 생성한다.
java -cp jbosssx.jar org.jboss.security.plugins.PBEUtils SALT ITERATION-COUNT DOMAIN-PASSWORD DATASOURCE-PASSWORD

============================================
** PBEUtils 인자값 상세설명
1.     SALT : JaasSecurityDomain 에 기재할 Salt 속성값 (8자 이상으로 구성)
2.     ITERATION COUNT : JaasSecurityDomain IteraionCount 속성값
3.     DOMAIN-PASSWORD : JaasSecurityDomain KeyStorePass 속성과 매칭되는 패스워드
4.     DATASOURCE-PASSWORD : JaasSecurityDomains 패스워드를 이용하여 암호화 되어야할 데이터소스의 패스워드  
 ============================================================









2)    login-config.xml 보안 도메인 추가생성
 
<application-policy name = "EncryptedHsqlDbRealm">
   <authentication>
      <login-module code = "org.jboss.resource.security.JaasSecurityDomainIdentityLoginModule"
       flag = "required">
          <module-option name = "username">sa</module-option>
          <module-option name = "password">E5gtGMKcXPP</module-option>
          <module-option name =
"managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
          <module-option name =
"jaasSecurityDomain">jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword</module-option>
       </login-module>
    </authentication>
 </application-policy>

3)    *-ds 추가한 보안 도메인을 이용하여 데이터소스 설정
l  상세 사항은 $JBOSS_HOME/server/$PROFILE/docs/examples/jca/hsqldb-encrypted-ds.xml 파일을 참고한다.


<application-policy name = "EncryptedHsqlDbRealm"> <authentication>
<login-module code = "org.jboss.resource.security.JaasSecurityDomainIdentityLoginModule"
flag = "required">
<module-option name = "username">sa</module-option>
<module-option name = "password">E5gtGMKcXPP</module-option>
<module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
<module-option name = "jaasSecurityDomain">jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword</module-option>
</login-module>
</authentication>
</application-policy>
where the encrypted password was generated using:
java -cp jbosssx.jar org.jboss.security.plugins.PBEUtils abcdefgh 13 master ''
Encoded password: E5gtGMKcXPP
-->
<mbean code="org.jboss.security.plugins.JaasSecurityDomain"
name="jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword">
<constructor>
<arg type="java.lang.String" value="ServerMasterPassword"></arg>
</constructor>
<!-- The opaque master password file used to decrypt the encrypted
database password key -->
<attribute name="KeyStorePass">{CLASS}org.jboss.security.plugins.FilePassword:${jboss.server.home.dir}/conf/server.password</attribute>
<attribute name="Salt">abcdefgh</attribute>
<attribute name="IterationCount">13</attribute>
</mbean>

<!-- This mbean can be used when using in process persistent db -->
<mbean code="org.jboss.jdbc.HypersonicDatabase"
name="jboss:service=Hypersonic,database=localDB">
<attribute name="Database">localDB</attribute>
<attribute name="InProcessMode">true</attribute>
</mbean>


</datasources>
l  주의 : 패스워드 생성시 Salt /IterationCount 동일한 값을 사용하여야 한다.

참고자료

댓글 없음:

댓글 쓰기