こんにちは。平田です。
JBoss EAP 7.1から利用可能なElytronサブシステムでは、パスワードなどを平文で指定せずに安全に管理するための仕組みとしてCredential Storeという機能が用意されています。
今回は、Credential Storeを使ってデータソースのパスワードを管理してみます。
従来のsecurityサブシステム向けにもPassword Vaultという同様の仕組みがありましたが、より簡単に使えるそうです。
使い方はマニュアル How to Configure Server Security の4.1 Credential Storeに書かれています。
最初にCredential Store(機密情報を書き込むファイル)を作成するわけですが、Credential Storeへのアクセス自体にパスワードが必要となります。このパスワードをマスクするツールがEAPに同梱されています。
$ cd $JBOSS_HOME $ bin/elytron-tools.sh mask -x p@ssw0rd -s 20180607 -i 2 MASK-24DhgSlssSlUd5h.yHA6sq;20180607;2
次に、サーバを起動し、CLIにてCredential Storeを作成します。
$ bin/jboss-cli.sh -c /subsystem=elytron/credential-store=secrets:add( \ location="credential-stores/secrets.jceks", \ relative-to=jboss.server.data.dir, \ credential-reference={clear-text=MASK-24DhgSlssSlUd5h.yHA6sq;20180607;2}, \ create=true )
次に、今回 Credential Store で管理するデータソースのパスワード(ExampleDSの接続パスワード “sa”)を書き込みます。
/subsystem=elytron/credential-store=secrets:add-alias(alias=example-ds-password, secret-value=sa)
最後に、ExampleDSのパスワード指定を、Credential Storeに変更します。
/subsystem=datasources/data-source=ExampleDS:undefine-attribute(name=password) /subsystem=datasources/data-source=ExampleDS:write-attribute( \ name=credential-reference, \ value={store=secrets, alias=example-ds-password} \ ) :reload
データソースの接続性テストを使い、パスワードを参照して接続できるか確認します。
data-source test-connection-in-pool --name=ExampleDS true
standalone.xmlのデータソース定義部分から平文パスワードを取り除くことができました。
<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> <user-name>sa</user-name> <credential-reference store="secrets" alias="example-ds-password"/> </security> </datasource>