MouseOver Studio

MouseOver Studio header image 2

Protegendo nossos data sources no JBoss com senhas criptografadas

February 14th, 2008 por Diego Carrion · 2 comentários

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.

Tags: criptografia · jboss · seguridade

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