Normalmente quando trabalhamos com aplicações que acessam o bancos de dados temos um arquivo xml com a configuração do nosso data source (usuário, senha, ip do banco, nome do schema, …), algo assim:
<datasources>
<local-tx-datasource>
<jndi-name>UnknowDS</jndi-name>
<connection-url>
jdbc:mysql://localhost:3306/unknow
</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>unknow</user-name>
<password>desconhecido</password>
<exception-sorter-class-name>
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
O problema com data sources como o do exemplo é que a senha da base se encontra explicitamente no arquivo xml. Se por algum motivo alguma pessoa não desejada ler o arquivo, ela vai descobrir a senha da base sem o mínimo esforço. Felizmente, o JBoss possui uma classe chamada SecureIdentityLoginModule que consegue criptografar uma senha e posteriormente ao reconhecer que a senha no data source é criptograda, descriptografar ela automaticamente para fazer o login na base, tudo isso de maneira muitos simples.
O primeiro passo é criptografar a senha. Para isso vamos ir no console na pasta home do JBoss e rodar o seguinte comando (substituindo *senha* pela senha desejada) :
java -cp lib/jboss-common.jar:server/default/lib/jbosssx.jar:server/default/lib/jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule *senha*
O console respondera com uma mensagem similar a essa:
Encoded password: 3edbf2d83a1d270c795cf4eabe7274d2
O segundo passo é abrir o arquivo login-config.xml situado na pasta conf do server em uso e adicionar o seguinte dentro do nodo policy, colando a senha criptografada na tag module-option com parametro name igual a password:
<application-policy name="MySecurityDomain">
<authentication>
<login-module flag="required"
code="org.jboss.resource.security.SecureIdentityLoginModule" >
<module-option name="username">
unknow
</module-option>
<module-option name="password">
5dfc52b51bd35553df8592078de921bc
</module-option>
<module-option name="managedConnectionFactoryName">
jboss.jca:name=UnknowDS,service=LocalTxCM
</module-option>
</login-module>
</authentication>
</application-policy>
O último passo é ir na configuração do nosso data source e substituir
<user-name>unknow</user-name>
<password>desconhecido</password>
por
<security-domain>MySecurityDomain</security-domain>
Agora temos uma senha criptografada e mais segura.
Somente umas coisas para lembrar no caso que aconteça algum erro: o valor da tag security-domain no data source tem que ser igual ao valor do parametro name na tag aplication-policy no arquivo login-config.xml. Na tag module-option com name igual a managedConnectionFactoryName, o valor name do jboss.jca deve ser igual ao nome do nosso data source e o service compativel com o tipo do mesmo. Em outras palavras, se nosso data source for xa, o service devera ser XATxCM . No nosso caso o data source e local então o service fica como LocalTxCM .
Para mais informação, pode acessar a página no wiki do JBoss.
2 respostas ate agora ↓
1 Luiz Ávila // Feb 17, 2008 at 11:08 am
Cara, muito boa essa dica, apesar de acesso indesejado ao servidor de aplicacoes pode ter mais problemas alem de vialação da senha do banco de dados.
2 Diego Carrion // Feb 17, 2008 at 12:42 pm
Concordo com você Luiz, é outro ponto a considerar.
Obrigado por participar
Deixar um comentário