보안 컴플라이언스 준수를 위해 JBoss EAP 7의
standalone.xml또는domain.xml파일 내에 저장되는 DB 패스워드를 암호화하는 방법을 정리합니다.org.picketbox모듈을 이용하여 암호화된 문자열을 생성하고, Security Domain을 통해 데이터소스와 연동합니다.
0. 배경 및 준비 (Context)
JBoss 설정 파일에 비밀번호를 평문으로 저장하면 보안 감사 시 지적 대상이 됩니다. 이를 해결하기 위해 JBoss는 Security Domain을 통해 인증 과정을 위임하는 방식을 제공합니다.
Test Environment
- OS: CentOS 7.2
- WAS: JBoss EAP 7.2
- JDK: 1.8
1. 비밀번호 암호화 문자열 생성 (Encryption)
가장 먼저 실제 DB 패스워드를 암호화된 문자열로 변환해야 합니다. JBoss 내부 모듈인 picketbox를 Java로 실행하여 변환합니다.
암호화 스크립트 (create_encrypt_pw.sh)
JBoss 패치(CP)가 적용되면 .overlays 디렉토리에 라이브러리가 변경될 수 있습니다. 아래 스크립트는 패치 여부를 자동으로 감지하여 적절한 jar 파일을 찾아 실행합니다.
#!/bin/sh
# 1. 환경 변수 설정 (사용자 환경에 맞게 수정 필수)
export JAVA_HOME="/SW/was/java1.8"
export PATH="$JAVA_HOME/bin:$PATH"
JBOSS_HOME="/SW/was/JBoss7.2"
# 2. 라이브러리 경로 탐색 (Overlay 지원)
OVERLAY_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/.overlays"
SEARCH_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/org/picketbox/main"
if [ -d "$OVERLAY_DIRECTORY" ]; then
# 최신 패치 디렉토리 확인
PATCH_SUBDIRECTORY=$(ls -dt $OVERLAY_DIRECTORY/* | grep "CP" | head -n 1)
if [ -n "$PATCH_SUBDIRECTORY" ]; then
echo "Info: Patch directory detected: $PATCH_SUBDIRECTORY"
SEARCH_DIRECTORY="$PATCH_SUBDIRECTORY/org/picketbox/main"
fi
fi
# 3. Classpath 설정
export CLASSPATH=$(find "$SEARCH_DIRECTORY" -name "*.jar" -print | tr '\n' ':')$CLASSPATH
# 4. 암호화 실행
echo ""
read -p "Enter Database Password : " PASSWORD
echo ""
echo "####################################################"
java org.picketbox.datasource.security.SecureIdentityLoginModule "$PASSWORD"
echo "####################################################"
echo ""
실행 결과 예시
Encoded password: 9fdd42c2a7390d3
출력된 Encoded password 값을 복사해 둡니다.
2. Security Domain 설정 (standalone.xml)
생성한 암호화 패스워드를 사용하는 보안 도메인을 정의합니다. security 서브시스템 내에 작성합니다.
설정 내용
<subsystem xmlns="urn:jboss:domain:security:2.0">
<security-domains>
<security-domain name="encryptedSecurityDB" cache-type="default">
<authentication>
<login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
<module-option name="username" value="sa"/>
<module-option name="password" value="9fdd42c2a7390d3"/> <!-- 암호화된 값 -->
<module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM"/>
</login-module>
</authentication>
</security-domain>
</security-domains>
</subsystem>
username: DB 접속 계정 ID (평문)password: 위에서 생성한 암호화된 패스워드managedConnectionFactoryName:jboss.jca:service=LocalTxCM(고정값 사용)
3. Datasource 연동 설정
이제 데이터소스가 평문 비밀번호 대신 위에서 만든 Security Domain을 바라보도록 수정합니다.
수정 전 (Before)
<datasource ...>
...
<security>
<user-name>sa</user-name>
<password>admin1234</password>
</security>
</datasource>
수정 후 (After)
user-name과 password 태그를 삭제하고 security-domain 태그를 추가합니다.
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
<driver>h2</driver>
<security>
<security-domain>encryptedSecurityDB</security-domain>
</security>
</datasource>
4. 검증 (Verification)
- 설정 저장 후 JBoss 서버를 재기동(Reload)합니다.
- 관리 콘솔 또는 CLI에서 Test Connection을 수행하여 연결 성공 여부를 확인합니다.
- 연결 성공 시, 설정 파일에 비밀번호 평문이 남아있지 않은지 재확인합니다.
Next Step:
만약 비밀번호 뿐만 아니라 키스토어 패스워드 등 JBoss 설정 전반의 민감 정보를 보호해야 한다면, Vault(볼트) 구성을 추가로 검토해 보십시오.