본 글은 24년도에 최초 작성된 게시물이다.
JBoss EAP 8이 출시는 2024년.
지금은 EAP 8.1까지 나왔다.
기존에 6버전 7버전에서 사용하던 데이터소스 암호화 스크립트가 무용지물이 되었다.
picketbox 모듈이 없어져서 그런데, WebLogic과는 다르게 JBoss의 데이터소스는 암호화가
자동적으로 이루어지는 것은 아니라서 이거저거 해보면서 정리를 좀 해야하겠다 싶어 작성해본다.
추가적으로 더 조사하다 좋은 방법을 알게되면 테스트를 진행하고 공유해봐야겠다.
1. elytron을 활용한 암호화 with jboss-cli.sh
1.1 Datasource를 처음 등록하는 경우에 바로 암호화 하는 방법
jboss-cli.sh을 통해서 management port를 통해 연결을 한 뒤부터 다음의 과정을 해주자
1) key_store 생성
/subsystem=elytron/credential-store=${store이름}:add(location="${파일이름}.jceks", relative-to=jboss.server.data.dir, credential-reference={clear-text=${원하는이름}},create=true)
e.g)
/subsystem=elytron/credential-store=gtplus_store:add(location="cstore.jceks", relative-to=jboss.server.data.dir, credential-reference={clear-text=pwd_enc},create=true)
2) alias 생성
/subsystem=elytron/credential-store=${생성한 KEY_STORE}:add-alias(alias=${DB암호화별칭(아무거나 가능)}, secret-value="${현재DB암호}")
e.g)
/subsystem=elytron/credential-store=gtplus_store:add-alias(alias=oracle19c_pwd_enc, secret-value="oracle!")
3) 데이터소스 생성 with credential-reference
data-source add --name=${데이터소스 이름} --jndi-name=${JNDI} --driver-name=${미리생성한 JDBC Driver} --connection-url=${DB 접근 주소 및 SID 등등..} --validate-on-match=false --background-validation=true --background-validation-millis=3600000 --valid-connection-checker-class-name=${DB별로 상이한 class checker} --exception-sorter-class-name=${DB별로 상이한 exception sorter} --user-name=${DB ID} --credential-reference={store=${생성한 KEY_STORE}, alias=${앞서 생성한 DB 암호화 별칭}}
e.g)
data-source add --name=testDS --jndi-name=testDS --driver-name=oracle19c --connection-url=jdbc:oracle:thin:@192.168.56.104:1521:orcl --validate-on-match=false --background-validation=true --background-validation-millis=3600000 --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter --user-name=oracle --credential-reference={store=gtplus_store, alias=oracle19c_pwd_enc}
1.2 기존에 Datasource가 등록되 있는 상태에서 암호화를 설정해야 할 때
(※ 1.2는 postgreSQL 설정이니, DB 뭐 쓰는지 파악하고 할 것.)
(앞서 작성한 1.1의 1) & 2)의 과정과 동일하나, 다시 적음)
1) key_store 생성
/subsystem=elytron/credential-store=${store이름}:add(location="${파일이름}.jceks", relative-to=jboss.server.data.dir,credential-reference={clear-text=${원하는이름}},create=true)
e.g)
/subsystem=elytron/credential-store=qwer_store:add(location="qwer_keyStore.jceks",relative-to=jboss.server.data.dir,credential-reference={clear-text=qwer},create=true)
2) alias 생성
/subsystem=elytron/credential-store=${생성한 KEY_STORE}:add-alias(alias=${DB암호화별칭(아무거나 가능)}, secret-value="${현재DB암호}")
e.g)
/subsystem=elytron/credential-store=qwer_store:add-alias(alias=qwer_postgreDS, secret-value="1234!")
3) 암호화 하고자 하는 dataSource의 password 속성을 undefine(=삭제)
/subsystem=datasources/data-source=${데이터소스}:undefine-attribute(name=password)
e.g)
/subsystem=datasources/data-source=postgreDS:undefine-attribute(name=password)
[standalone@192.168.56.101:9990 /] /subsystem=datasources/data-source=postgreDS:undefine-attribute(name=password)
{
"outcome" => "success",
"response-headers" => {
"operation-requires-reload" => true,
"process-state" => "reload-required"
}
}
4) credential-reference를 사용하여 alias 등록
/subsystem=datasources/data-source=postgreDS:write-attribute(name=credential-reference, value={store=${생성한 Store}, alias=${생성한별칭}})
e.g)
/subsystem=datasources/data-source=postgreDS:write-attribute(name=credential-reference, value={store=qwer_store, alias=qwer_postgreDS})
[standalone@192.168.56.101:9990 /] /subsystem=datasources/data-source=postgreDS:write-attribute(name=credential-reference, value={store=qwer_store, alias=qwer_postgreDS})
{
"outcome" => "success",
"response-headers" => {
"operation-requires-reload" => true,
"process-state" => "reload-required"
}
}
[standalone@192.168.56.101:9990 /] reload
[standalone@192.168.56.101:9990 /] data-source test-connection-in-pool --name=postgreDS
true
###데이터 소스 암호가 변경이 되면###
데이터 소스의 암호를 변경하고 테스트용도의 커넥션 풀을 날리면, 바로 ERROR이 발생할 것이다.
[DB 암호 바꾸기 전]

[DB 암호를 바꾼 뒤 jboss-cli.sh에서 reload를 해준 뒤의 상황]

[standalone@xxx.xxx.xx.xxx:xxxx /] /subsystem=datasources/data-source=testDS:test-connection-in-pool
{
"outcome" => "failed",
"failure-description" => "WFLYJCA0040: failed to invoke operation:
java.lang.IllegalStateException: WFLYJCA0047:
Connection is not valid Caused by: jakarta.resource.ResourceException:
jakarta.resource.ResourceException:
IJ031084: Unable to create connection Caused by: jakarta.resource.ResourceException:
IJ031084: Unable to create connection
Caused by: java.sql.SQLException: ORA-01017: invalid username/password; logon denied",
"rolled-back" => true
}
이러한 경우에는 다음의 과정을 통해서 해결하자
1) 기존 alias 삭제 (생성한 key_store는 삭제 안해도 된다.)

/subsystem=elytron/credential-store=gtplus_store:remove-alias(alias=oracle19c_pwd_enc)
2) alias 재생성

/subsystem=elytron/credential-store=gtplus_store:add-alias(alias=oracle19c_pwd_enc, secret-value="${변경된암호}")
ex) /subsystem=elytron/credential-store=gtplus_store:add-alias(alias=oracle19c_pwd_enc, secret-value="oracle")
##변경하였으면 jboss-cli 내부에서 reload를 실행해주자
reload
[실제 적용]
[standalone@xxx.xxx.xx.xxx:xxxx /] /subsystem=elytron/credential-store=gtplus_store:add-alias(alias=oracle19c_pwd_enc, secret-value="oracle")
{"outcome" => "success"}
[standalone@xxx.xxx.xx.xxx:xxxx /] reload
[standalone@xxx.xxx.xx.xxx:xxxx /] /subsystem=datasources/data-source=testDS:test-connection-in-pool
{
"outcome" => "success",
"result" => [true]
}
reload를 수행하고서 다시금 테스트 커넥션을 날리면 잘 수행되는 것을 확인할 수 있다.
[설정파일 상세]
<subsystem xmlns="urn:jboss:domain:datasources:7.0">
<datasources>
<datasource jndi-name="testDS" pool-name="testDS">
<connection-url>jdbc:oracle:thin:@xxx.xxx.xx.xxx:1521:orcl</connection-url>
<driver>oracle19c</driver>
<security>
<user-name>oracle</user-name>
<credential-reference store="gtplus_store" alias="oracle19c_pwd_enc"/>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<validate-on-match>false</validate-on-match>
<background-validation>true</background-validation>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
</datasource>
<datasources>
....
<subsystem xmlns="urn:wildfly:elytron:18.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
......
<credential-stores>
<credential-store name="gtplus_store" relative-to="jboss.server.data.dir" location="cstore.jceks" create="true">
<credential-reference clear-text="pwd_enc"/>
</credential-store>
</credential-stores>
</subsystem>
2. Authentication Context 를 활용한 암호화
개인적인 의견으로는 이 방법의 경우, 암호화라고 하기엔 좀 애매한 감이 없지않게 존재한다.
관리 콘솔 상에서 ID와 PWD는 보이지 않으나, 설정 파일 상에는 고스란히 정보가 남아있기 때문이다.
Secure a Datasource Using an Authentication Context
You can also use an Elytron authentication context to provide usernames and passwords.
Use the following steps to configure and use an authentication context for datasource security.
※ 아래의 커맨드 또한 jboss-cli.sh을 통하여 동작하는 내용입니다.
1) 유저명 / 패스워드 삭제
/subsystem=datasources/data-source=${생성한데이터소스이름}:undefine-attribute(name=password)
/subsystem=datasources/data-source=${생성한데이터소스이름}:undefine-attribute(name=user-name)
ex)
/subsystem=datasources/data-source=testDS:undefine-attribute(name=password)
/subsystem=datasources/data-source=testDS:undefine-attribute(name=user-name)
2) elytron 활성화
/subsystem=datasources/data-source=${생성한데이터소스이름}:write-attribute(name=elytron-enabled,value=true)
ex)
/subsystem=datasources/data-source=testDS:write-attribute(name=elytron-enabled,value=true)
3) reload
reload
4) authentication-configuration 추가
/subsystem=elytron/authentication-configuration=${원하는config이름}:add(authentication-name=${DB_ID},credential-reference={clear-text=${DB_PWD}})
ex)
/subsystem=elytron/authentication-configuration=testDSAuthConfig:add(authentication-name=oracle,credential-reference={clear-text=oracle!})
5) authentication-context 추가
6) authentication-context를 데이터소스 상에 설정
/subsystem=datasources/data-source=${대상이되는 데이터소스}:write-attribute(name=authentication-context,value=${5)에서 생성한 Context이름})
/subsystem=datasources/data-source=testDS:write-attribute(name=authentication-context,value=testDSAuthContext)
<subsystem xmlns="urn:jboss:domain:datasources:7.0">
<datasources>
<datasource jndi-name="java:/testDS" pool-name="testDS">
<connection-url>jdbc:oracle:thin:@192.168.56.104:1521:orcl</connection-url>
<driver>oracle19c</driver>
<security>
<elytron-enabled>true</elytron-enabled>
<authentication-context>testDSAuthContext</authentication-context>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<validate-on-match>true</validate-on-match>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
</datasource>
<drivers>
<driver name="oracle19c" module="com.oracle.jdbc">
<driver-class>oracle.jdbc.OracleDriver</driver-class>
</driver>
</drivers>
</datasources>
</subsystem>
....
<subsystem xmlns="urn:wildfly:elytron:18.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
<authentication-client>
<authentication-configuration name="testDSAuthConfig" authentication-name="oracle">
<credential-reference clear-text="oracle!"/>
</authentication-configuration>
<authentication-context name="testDSAuthContext">
<match-rule authentication-configuration="testDSAuthConfig"/>
</authentication-context>
</authentication-client>
만약 DB 패스워드가 변경된다고 하면
<credential-reference clear-text="oracle!"/>
이 부분에서 oracle! 이라고 적혀있는 곳을 수정해주면 된다.
===참고===
2번 내용.
=========
'WAS > JBoss&WildFly' 카테고리의 다른 글
| DB connection pool 적용 우선순위? (0) | 2026.04.30 |
|---|---|
| [EAP6/7] 데이터 소스 비밀번호 암호화 using picketbox (0) | 2026.04.13 |
| [jboss 8.1] patch (0) | 2026.04.09 |
| JBoss 배포 cli command (0) | 2026.04.09 |
| jboss - cubrid 연동 (0) | 2026.04.03 |