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:
- 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 enmodules/org/picketbox/main
. No obstante, siempre podrás buscarla con unfind
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
-
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>
- 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.