Páginas

terça-feira, 7 de abril de 2015

Protegendo Senha no JBoss EAP 6.x utilizando o VAULT

Como proteger suas senhas no arquivo XML do JBoss ?
Uma dúvida comum a todos que configuram o JBoss é como proteger a senha dentro dos arquivos XML, já que eles são arquivos de texto simples e podem facilmente ser lido. A solução para isso está no VAULT do JBoss.




Atualmente no JBoss EAP 6.x utiliza-se apenas um arquivo XML para todas as configurações, seja ele o "standalone.xml" ou "domain.xml". Como algumas configurações, como por exemplo: Datasource, JMS ou acessos remotos exige a necessidade de utilizar senha, estas ficam expostas diretamente no arquivo XML sem qualquer proteção.

Por isso foi criado o VAULT. Ele é capaz de criptografar e proteger qualquer dado, seja ele a senha ou até mesmo o usuário no seu arquivo XML do JBoss.

Sua utilização é simples, porém deve ser feita com cuidados para que funcione perfeitamente.

Abaixo irei explicar o passo a passo desta configuração, utilizarei como exemplo uma configuração de um DataSource.

Configurando o VAULT do JBoss

1- Crie um diretório para o VAULT utilizar, este diretório deve ser criado fora da árvore de diretório do JBoss. Para isso, execute o comando abaixo:

[root@localhost] mkdir /opt/vault

2-  Para configurar o VAULT, é necessário criar uma chave do tipo Keystore, por isso, é necessário ter esse recurso disponível no seu Sistema Operacional. Para criar a chave, execute o comando abaixo:

[root@localhost] cd /opt/vault
[root@localhost] keytool -genkey -alias vault -keystore vault.keystore -keyalg RSA -keysize 1024 -storepass minhasenha@2015 -keypass minhasenha@2015 -dname "CN=Marco,OU=4jboss,O=4jboss,L=Rio de Janeiro,ST=RJ,C=BR" 
[root@localhost] chown -R jboss.jboss /opt/vault

Ao final deste comando, um arquivo com nome vault.keystore deverá existir no diretório /opt/vault.

3-  Neste passo iremos utilizar o VAULT do JBoss para iniciar as configurações. Para isso execute o comando abaixo:

[jboss@localhost] cd /opt/jboss/bin
[jboss@localhost] ./vault.sh


Após executar o comando, digite 0 para iniciar um menu interativo que solicitará os ítens abaixo:

  • Informar o diretório onde está o vault : Deverá informar o diretório criado no item 1 (/opt/vault)
  • Informar a URL do arquivo keystore: Deverá informar o caminho completo do arquivo gerado no item 2 (/opt/vault/vault.keystore)
  • Informa Senha:utilizar a mesma senha na criação do arquivo vault.keystore, no meu caso a senha utilizada foi (minhasenha@2015)
  • Repetir a senha informada no item anterior
  • Informar o salt: O salt é utilizado para criptografia da senha, no meu caso utilizarei o seguinte salt (87654321)
  • Informar o número de interações: Este número é a quantidade de vezes que o algoritmo de criptografia irá rodar, no meu caso utilizarei o seguinte valor (50).
  • Informar um alias para o keystore, no meu caso utilizei o nome (vault).

Ao finalizar o menu interativo, será gerado uma máscara que deverá ser armazenada em um arquivo texto para utilizar na configuração do arquivo XML mais a frente. A máscara será algo como a mostrada abaixo:

********************************************
...
</extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="/opt/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-3alVZ5uk4NKskjdRBfgSCo"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="87654321"/>
  <vault-option name="ITERATION_COUNT" value="50"/>
  <vault-option name="ENC_FILE_DIR" value="/opt/vault/"/>
</vault><management> ...
********************************************

4 - Para iniciar o armazenamento das senhas no VAULT digite 0 (store a secure attribute), e um outro menu iterativo iniciará:

  • Informar a senha no campo attribute value:  Inserir neste ponto a senha do Datasource, no meu caso a senha é (4jbossPass#@2015)
  • Informar a senha novamente
  • Informar o nome para a senha: Este nome será um identificador do VAULT para a senha armazenada, no meu caso o nome será (4jbossDS)
  • Informar o nome do atributo da senha: password: Informar o campo que este item do VAUKT substituirá no arquivo XML , no meu caso será o campo (password)
Ao finalizar será gerada os dados necessário para substituir o password no arquivo XML. Será algo como mostrado abaixo:

********************************************
Vault Block:4jbossDS
Attribute Name:password
Configuration should be done as follows:
VAULT::4jbossDS::password::1
********************************************

5 - Para sair do menu iterativo, digite 2.

Configurando o arquivo XML para receber os dados do VAULT

Abaixo será exibido o trecho do arquivo XML referente ao DataSource, com os valores originais para o password:

 <subsystem xmlns="urn:jboss:domain:datasources:1.1">
                <datasources>
                    <datasource jta="false" jndi-name="java:/4jbossDS" pool-name="4jbossDS" enabled="true" use-ccm="false">
                        <connection-url>jdbc:oracle:thin:@127.0.0.1:1521:4jboss</connection-url>
                        <driver>oracle</driver>
                        <pool>
                            <min-pool-size>1</min-pool-size>
                            <max-pool-size>30</max-pool-size>
                            <prefill>true</prefill>
                        </pool>
                        <security>
                            <user-name>app_4jboss</user-name>
                            <password>4jbossPass#@2015</password>
                        </security>
                        <validation>
                            <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                            <validate-on-match>true</validate-on-match>
                            <background-validation>false</background-validation>
                        </validation>
                        <statement>
                            <share-prepared-statements>false</share-prepared-statements>
                        </statement>
                    </datasource>
                    <drivers>
                        <driver name="oracle" module="drivers.oracle">
                            <driver-class>oracle.jdbc.OracleDriver</driver-class>
                        </driver>
                    </drivers>
                </datasources>
            </subsystem> 


Agora o mesmo trecho com os dados do VAULT para substituir o password pela senha criptografada:

 <subsystem xmlns="urn:jboss:domain:datasources:1.1">
                <datasources>
                    <datasource jta="false" jndi-name="java:/4jbossDS" pool-name="4jbossDS" enabled="true" use-ccm="false">
                        <connection-url>jdbc:oracle:thin:@127.0.0.1:1521:4jboss</connection-url>
                        <driver>oracle</driver>
                        <pool>
                            <min-pool-size>1</min-pool-size>
                            <max-pool-size>30</max-pool-size>
                            <prefill>true</prefill>
                        </pool>
                        <security>
                            <user-name>app_4jboss</user-name>
                            <password>${VAULT::4jbossDS::password::1}</password>
                        </security>
                        <validation>
                            <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                            <validate-on-match>true</validate-on-match>
                            <background-validation>false</background-validation>
                        </validation>
                        <statement>
                            <share-prepared-statements>false</share-prepared-statements>
                        </statement>
                    </datasource>
                     <drivers>
                        <driver name="oracle" module="drivers.oracle">
                            <driver-class>oracle.jdbc.OracleDriver</driver-class>
                        </driver>
                    </drivers>
                </datasources>
            </subsystem> 


Agora para o JBoss conseguir ler os dados do VAULT, ele precisará de algumas informações, as mesmas geradas no final do item 4, só que estas informações são configuradas em locais diferentes quando se usa o modo Standalone e o modo Domain, por isso será explicado como realizar a configuração em cada um deles:


Modo Standalone

Insira a tag gerada no final do item 3 no arquivo standalone.xml logo após a tag extensions e antes da tag management, conforme mostrado abaixo:

 ..... 
  </extensions>
<vault>
  <vault-option name="KEYSTORE_URL" value="/opt/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-3alVZ5uk4NKskjdRBfgSCo"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="87654321"/>
  <vault-option name="ITERATION_COUNT" value="50"/>
  <vault-option name="ENC_FILE_DIR" value="/opt/vault/"/>
</vault>
    <management>
.....

 Modo Domain

Insira a tag gerada no final do item 3 no arquivo host.xml  antes da tag
management, conforme mostrado abaixo: 

<host name="master" xmlns="urn:jboss:domain:1.5">

<vault>
  <vault-option name="KEYSTORE_URL" value="/opt/vault/vault.keystore"/>
  <vault-option name="KEYSTORE_PASSWORD" value="MASK-3alVZ5uk4NKskjdRBfgSCo"/>
  <vault-option name="KEYSTORE_ALIAS" value="vault"/>
  <vault-option name="SALT" value="87654321"/>
  <vault-option name="ITERATION_COUNT" value="50"/>
  <vault-option name="ENC_FILE_DIR" value="/opt/vault/"/>
</vault>
    <management>
.....

Protegendo o usuário do Banco de Dados com o VAULT

No caso acima, vimos como proteger a senha do DataSource utilizando o VAULT, mas em alguns momentos tambem é interessante proteger o usuário do Banco de Dados, para isso, execute os passos abaixo:

1- Execute o comando abaixo para iniciar o VAULT do JBoss:

[jboss@localhost] cd /opt/jboss/bin
[jboss@localhost] ./vault.sh

2- Informe os dados do VAULT, conforme da primeira vez em que ele foi executado. No meu caso os dados foram os a seguir:

Informar o diretório onde está o vault: /opt/vault
Informar a URL do arquivo keystore: /opt/vault/vault.keystore
Informar a senha: minhasenha@2015    
Informar a senha novamente: minhasenha@2015
Informar o salt: 87654321
Informar o numero de interações: 50
Informar um alias: vault

3- Para inserir um novo item ao VAULT, digite 0 e insira os valores conforme solicitado. No meu caso os itens serão os a seguir:

Informar a senha no campo attribute value: app_4jboss
Informar a senha novamente: app_4jboss
Informar o nome para a senha: 4jbossUser
Informar o nome do atributo da senha: user-name

Ao finalizar, será gerado os dados para utilizar no arquivo XML, no meu caso os dados são o a seguir:

Vault Block:4jbossUser
Attribute Name:user-name
Configuration should be done as follows:
VAULT::4jbossUser::password::1 

4 - Para sair do menu iterativo digite 2.

5 - Após estes passos, basta substituir a tag do username do DataSource pelo valor gerado pelo VAULT, conforme mostrado a  seguir:


 <subsystem xmlns="urn:jboss:domain:datasources:1.1">
                <datasources>
                    <datasource jta="false" jndi-name="java:/4jbossDS" pool-name="4jbossDS" enabled="true" use-ccm="false">
                        <connection-url>jdbc:oracle:thin:@127.0.0.1:1521:4jboss</connection-url>
                        <driver>oracle</driver>
                        <pool>
                            <min-pool-size>1</min-pool-size>
                            <max-pool-size>30</max-pool-size>
                            <prefill>true</prefill>
                        </pool>
                        <security>
                            <user-name>${VAULT::4jbossUser::password::1}</user-name>
                            <password>${VAULT::4jbossDS::password::1}</password>
                        </security>
                        <validation>
                            <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                            <validate-on-match>true</validate-on-match>
                            <background-validation>false</background-validation>
                        </validation>
                        <statement>
                            <share-prepared-statements>false</share-prepared-statements>
                        </statement>
                    </datasource>
                     <drivers>
                        <driver name="oracle" module="drivers.oracle">
                            <driver-class>oracle.jdbc.OracleDriver</driver-class>
                        </driver>
                    </drivers>
                </datasources>
            </subsystem> 



Editando um dado no VAULT

Para os casos em que a senha seja alterada, ou até mesmo o usuário seja modificado, teremos que editar o valor salvo no VAULT pelo novo valor, para isso, basta executar o mesmo procedimento feito para cadastrar, utilizando os mesmos dados, alterando apenas  o valor da senha.
O VAULT irá substituir o valor antigo pelo novo valor e será necessário alterar a tag no arquivo XML pela nova tag gerada pelo VAULT.


Acredito que estas configurações possam ajudar bastante, principalmente em ambientes de produção onde é extremamente necessário ocultar dados como as senhas de Banco.

Até a próxima.

Nenhum comentário :

Postar um comentário