Hash de contraseñas de datasources en Jboss/Wildfly como alternativa al vault

Hay un término medio entre dejar las contraseñas en claro en un fichero de configuración y utilizar el -a veces- incordio de vault en Jboss. La alternativa está en generar un hash de la contraseña que queremos proteger y referenciarla utilizando un dominio de seguridad.

Los pasos son los siguientes:

  1. Generar la contraseña con la utilidad Picketbox. Podemos encontrarla en versiones de Wildfly 8+ en modules/system/layers/base/org/picketbox/main/picketbox-VERSION.jar. Para versiones más antiguas como Jboss AS 7.1 podéis encontrarla en modules/org/picketbox/main. No obstante, siempre podrás buscarla con un find para ver si en la versión de Jboss que estés utilizando está presente. En mi caso estoy con Wildfly 10.0.0 Final:
    java -cp modules/system/layers/base/org/picketbox/main/picketbox-4.9.4.Final.jar \
    org.picketbox.datasource.security.SecureIdentityLoginModule SuperPass55
    

    Con lo que obtengo:

    Encoded password: -640027b18827bb8b4f2d405c828175fe
    
  2. Crear el dominio de seguridad en nuestro fichero de configuración de Jboss y especificar la contraseña codificada además del usuario que se va a utilizar para conectar con la Base de Datos:

    <security-domain name="datasourcepass-security-domain" cache-type="default">
        <authentication>
            <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                <module-option name="username" value="databaseuser"/>
                <module-option name="password" value="-640027b18827bb8b4f2d405c828175fe"/>
            </login-module>
        </authentication>
    </security-domain>
    
  3. Finalmente en nuestro datasource, especificar el dominio de seguridad en el que está el hash de nuestra contraseña:
    <subsystem xmlns="urn:jboss:domain:datasources:4.0">
        <datasources>
            <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS">
                <connection-url>jdbc:mysql://dev-node1:3306</connection-url>
                <driver>mysql</driver>
                <pool>
                    <min-pool-size>10</min-pool-size>
                    <max-pool-size>50</max-pool-size>
                    <prefill>true</prefill>
                </pool>
                <security>
                    <security-domain>datasourcepass-security-domain</security-domain>
                </security>
            </datasource>
        </datasources>
    </subsystem>
    

En caso de cambiar la contraseña del datasource, tendríamos que generar de nuevo el hash y sustituir el valor correspondiente en el dominio de seguridad. La definición del pool como tal no necesitaríamos tocarla ya que hace referencia a ese dominio.