JBoss EAP 6.4 ๋๋ฉ์ธ ๋ชจ๋(Domain Mode)์์ ํ๋ฌธ์ผ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ์์ค ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด Vault๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
host.xml๊ณผdomain.xml์ ์ค์ ๋ถ๋ฆฌ ์์น์ ์ดํดํ๊ณ , ์ด์คํ๋ ํ๊ฒฝ์์ ์๋น์ค ์ค๋จ ์์ด ์ ์ฉํ๋ ์์ฐจ์ ๋ฐฐํฌ ์ ๋ต์ ๋ค๋ฃน๋๋ค.
0. ๋ฐฐ๊ฒฝ ๋ฐ ์ํคํ ์ฒ (Context)
๋ณด์ ๊ฐ์ฌ ์๊ฑด ์ถฉ์กฑ์ ์ํด DB ํจ์ค์๋ ์ํธํ๋ ํ์์ ๋๋ค. ๋๋ฉ์ธ ๋ชจ๋์์๋ ๋ค์๊ณผ ๊ฐ์ ์ค์ ๋ถ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
- host.xml: ๋ฌผ๋ฆฌ์ ์ธ Keystore ํ์ผ์ ์์น์ ์ํธํ ํค ํด๋ ์ค์ (Vault ์ ์ธ)
- domain.xml: ์ค์ ์ํธํ๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์์ค ์ค์ (Vault ์ฐธ์กฐ)
1. Vault ํ๊ฒฝ ์ค๋น (Keystore ์์ฑ)
์ํธํ ํค๋ฅผ ์ ์ฅํ Java Keystore๋ฅผ ์์ฑํฉ๋๋ค. JDK์ keytool์ ์ฌ์ฉํฉ๋๋ค.
# Keystore ์์ฑ (์๊ณ ๋ฆฌ์ฆ: DESede ๋๋ AES)
keytool -genkey -alias vault -keyalg DESede -keystore vault.keystore -keysize 168 -storepass [ํค์คํ ์ด_๋น๋ฐ๋ฒํธ] -validity 3650
vault.keystore ํ์ผ์ ๋ง์คํฐ(Master)์ ์ฌ๋ ์ด๋ธ(Slave) ์๋ฒ ๋ชจ๋ ๋์ผํ ๊ฒฝ๋ก(์: EAP_HOME/vault/)์ ๋ณต์ฌํด ๋์ด์ผ ํฉ๋๋ค.
2. Vault ์ด๊ธฐํ ๋ฐ ๋น๋ฐ๋ฒํธ ์ํธํ
JBoss์์ ์ ๊ณตํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ Vault๋ฅผ ์ด๊ธฐํํ๊ณ , ์ค์ DB ํจ์ค์๋๋ฅผ ์ํธํ๋ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค.
๋ํํ ๋ชจ๋ ์คํ (Interactive)
$JBOSS_HOME/bin/vault.sh
์ ๋ช ๋ น ์คํ ํ ์ต์ 0 (Store a secured attribute)์ ์ ํํ์ฌ ์งํํ๊ฑฐ๋, ์๋์ ๊ฐ์ด CLI ํ๋ผ๋ฏธํฐ๋ก ํ ๋ฒ์ ์คํํ ์๋ ์์ต๋๋ค.
# CLI ํ๋ผ๋ฏธํฐ ์์
$JBOSS_HOME/bin/vault.sh \
--keystore vault.keystore \
--keystore-password [ํค์คํ ์ด_๋น๋ฐ๋ฒํธ] \
--alias vault \
--vault-block ds_vault \
--attribute db_password \
--sec-attr [์ค์ _DB_๋น๋ฐ๋ฒํธ] \
--enc-dir /path/to/vault/ \
--iteration 120 \
--salt 1234abcd
๊ฒฐ๊ณผ ํ์ธ: ์ถ๋ ฅ๋๋ VAULT::ds_vault::db_password::1 ํํ์ ๋ฌธ์์ด๊ณผ, ํ๋ฉด์ ํ์๋๋ XML ์ค์ ๋ธ๋ก์ ๋ณต์ฌํด ๋ก๋๋ค.
3. host.xml ์ค์ (Vault ์ ์ธ)
๋ฌผ๋ฆฌ์ ์ธ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ธ์ํด์ผ ํ๋ ๋ชจ๋ ํธ์คํธ ์ปจํธ๋กค๋ฌ(Master, Slave)์ host.xml ํ์ผ์ ์์ ํฉ๋๋ค.
<!-- host.xml์ <management> ์น์
๋ด, ๋๋ <vault> ์น์
-->
<vault>
<vault-option name="KEYSTORE_URL" value="/path/to/vault/vault.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-..."/> <!-- ๋ง์คํน๋ ๋น๋ฐ๋ฒํธ -->
<vault-option name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT" value="1234abcd"/>
<vault-option name="ITERATION_COUNT" value="120"/>
<vault-option name="ENC_FILE_DIR" value="/path/to/vault/" />
</vault>
4. domain.xml ์ค์ (Datasource ์ ์ฉ)
์ด์ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ์ domain.xml์์ ๋ฐ์ดํฐ์์ค ๋น๋ฐ๋ฒํธ ๋ถ๋ถ์ ์์์ ์์ฑํ Vault ๋ฌธ์์ด๋ก ๋์ฒดํฉ๋๋ค.
<datasource ...>
<security>
<user-name>dbuser</user-name>
<password>${VAULT::ds_vault::db_password::1}</password>
</security>
</datasource>
5. ์ด์ ํ๊ฒฝ ์ ์ฉ ์ ๋ต (Deployment Strategy)
์ด์คํ(HA)๋ ์ด์ ํ๊ฒฝ์์ ์๋น์ค ์ค๋จ์ ๋ฐฉ์งํ๊ธฐ ์ํด, host.xml ์ค์ ๊ณผ domain.xml ์ค์ ์ ๋ถ๋ฆฌํ์ฌ ์ ์ฉํ๋ ์ ๋ต์ด ํ์ํฉ๋๋ค.
Scenario A: ๋ฌด์ค๋จ ์์ฐจ ์ ์ฉ (Rolling Update)
Host Controller(HC) ์ค์ ์ธ host.xml์ ์ฌ๊ธฐ๋์ด ํ์ํ์ง๋ง, domain.xml ๋ณ๊ฒฝ์ ๋ฆฌ๋ก๋(Reload)๋ก ๋ฐ์๋ ์ ์์์ ์ด์ฉํฉ๋๋ค.
- Slave ์๋ฒ(Server2) ์์
:
- Slave HC ์ค์ง
- Slave
host.xml์ Vault ์ค์ ์ถ๊ฐ ๋ฐvault.keystoreํ์ผ ๋ฐฐํฌ - Slave HC ์ฌ๊ธฐ๋ (์ด๋ Server2 ์ธ์คํด์ค๋ค๋ ์ฌ๊ธฐ๋๋จ)
- Master ์๋ฒ(Server1) ์์
:
- Master HC ์ค์ง (๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ ์ค์ง)
- Master
host.xml์ Vault ์ค์ ์ถ๊ฐ ๋ฐvault.keystoreํ์ผ ๋ฐฐํฌ - Master HC ์ฌ๊ธฐ๋
- Datasource ๋ณ๊ฒฝ:
- Master๊ฐ ๊ธฐ๋๋ ์ํ์์
domain.xml์ ๋ฐ์ดํฐ์์ค ํจ์ค์๋๋ฅผ${VAULT::...}๋ก ๋ณ๊ฒฝ - JBoss CLI ๋๋ ์ฝ์์์ Datasource Disable/Enable ์ํ (๋๋ reload)
- Master๊ฐ ๊ธฐ๋๋ ์ํ์์
Scenario B: ์ ์ฒด ์ค๋จ ํ ์ ์ฉ (Cold Restart)
๊ฐ์ฅ ์์ ํ๊ณ ํ์คํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ์ง๋ณด์ ์๊ฐ(Maintenance Window)์ด ํ๋ณด๋์์ ๋ ๊ถ์ฅํฉ๋๋ค.
- ๋ชจ๋ JBoss ํ๋ก์ธ์ค(Master/Slave) ์ข ๋ฃ
- ๋ชจ๋ ์๋ฒ์
host.xml์์ ๋ฐ ํค์คํ ์ด ๋ฐฐํฌ - Master ์๋ฒ์
domain.xml์์ - Master ๊ธฐ๋ → Slave ๊ธฐ๋ ์์๋ก ์ ์ฒด ์ฌ์์
6. ๊ฒ์ฆ (Verification)
- ์๋ฒ ๊ธฐ๋ ๋ก๊ทธ(server.log)์ Vault ๊ด๋ จ ์๋ฌ(
PBOX000...)๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. - ๊ด๋ฆฌ ์ฝ์์์ Datasource์ Test Connection์ ์ํํ์ฌ DB ์ฐ๊ฒฐ์ด ์ ์์ ์ธ์ง ํ์ธํฉ๋๋ค.