wildflyのDB接続情報（パスワード文字列）を暗号化する

表題の通り実施します。wildflyはデータソース（DB接続、コネクションプール）経由でDBに接続できる機能があります。また、単独でDBの接続情報（パスワード）を暗号化する機能があるため、今回は暗号化した上でDBに接続します。
<font color="red">
**暗号強度、接続情報をサーバ上に保持する、暗号／復号をwildlfly単独で完結しているなど対策として十分とは言えず、セキュリティ施策として推奨している内容ではありません。あくまでサーバ上に接続情報をテキストで保持しない程度の対策として見ていただければと存じます。**
</font>
**環境**
wildfly10
MySQL5.7
Java1.8

```
$ ./standalone.sh 
JBOSS_HOME: /Users/kusakai/Downloads/wildfly-10.1.0.Final

mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| innodb_version          | 5.7.18                       |
+-------------------------+------------------------------+

$ java -version
java version "1.8.0_131"
```

## データソースの実装部分（暗号化前）
接続先、ユーザ名、パスワードをテキストファイルとして保持しています。

```xml:standalone.xml
<subsystem xmlns="urn:jboss:domain:datasources:4.0">
  <datasources>
    <datasource jndi-name="java:/enc_test" pool-name="enc_pool" enabled="true">
      <connection-url>jdbc:mysql://localhost:3306/mysql_test</connection-url>
      <driver>mysql</driver>
      <security>
        <user-name>root</user-name>
        <password>kusakari</password>
      </security>
    </datasource>
    <drivers>
      <driver name="mysql" module="com.mysql" />
    </drivers>
  </datasources>
</subsystem>
```
**動作確認**

```sh:jboss-cli.sh
$ $JBOSS_HOME/bin/jboss-cli.sh
[disconnected /] connect
[standalone@localhost:9990 /] /subsystem=datasources/data-source=enc_pool:test-connection-in-pool
{
    "outcome" => "success",
    "result" => [true]
}
```

##  暗号化する
### 文字列の暗号化
wildflyに含まれるjarファイルで暗号化します
今回はパスワード文字列「kusakari」を暗号化する

```
$ cd $JBOSS_HOME/modules/system/layers/base/org/picketbox/main
$ java -classpath picketbox-4.9.6.Final.jar org.picketbox.datasource.security.SecureIdentityLoginModule kusakari
Encoded password: -341f8dfc4b67e481207a6df87216de44
```

### データソースとセキュリティドメインを修正
設定ファイル中にディレクティブを追加します
CLIでも実施できますが、手動で追加する

**データソース部分を修正**

```diff:standalone.xml
  <security>
-    <user-name>root</user-name>
-    <password>kusakari</password>
+    <security-domain>ds-encrypted</security-domain>
  </security>

```
**セキュリティドメイン部分を追加**

```xml:standalone.xml
<subsystem xmlns="urn:jboss:domain:security:1.2">
  <security-domains>
    <security-domain name="ds-encrypted" cache-type="default">
      <authentication>
        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
          <module-option name="username" value="root" />
          <module-option name="password" value="-341f8dfc4b67e481207a6df87216de44" />
          <module-option name="managedConnectionFactory-Name" value="jboss.jcs:service=LocalTxCM" />
        </login-module>
      </authentication>
    </security-domain>
  </security-domains>
</subsystem>
```
**動作確認**

```sh:jboss-cli.sh
[standalone@localhost:9990 /] /subsystem=datasources/data-source=enc_pool:test-connection-in-pool
{
    "outcome" => "success",
    "result" => [true]
}
```

今回はDBのパスワード暗号化のみ実施しました。wildflyにはこれ以外にもプロパティファイルに記載した値で設定ファイルの内容を置き換えるjboss-descriptor-property-replacementなども利用できそうです。

参考：https://www.amazon.com/WildFly-Administration-Guide-Francesco-Marchioni-ebook/dp/B00HOGN0C8