12 de mai. de 2020

Invalid Secret Key when using a vault and JDK 1.8.0_171 Jboss EAP 7

Proteção do JBoss EAP

Olá, meu caro! Esse post é para registro e auxílio ao problema com a utilização do vault para encriptar senhas no domain.xml ou standalone.xml do Jboss Eap 7 ou outras versões como a 6. O problema foi solucionado em versões superiores a 7.0.  


Ambiente utilizado 
  • Red Hat JBoss Enterprise Application Platform (EAP) 7
  • openjdk version "1.8.0_252"
  • OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
  • OpenJDK Runtime Environment (build 1.8.0_252-b09)
  • Centos 7

Problema 
                                       

O script EAP e vault.sh lançam a seguinte exceção:

[root@wk vault]# ../vault.sh --keystore /opt/jboss-eap/bin/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr redhat --enc-dir /opt/jboss-eap/bin/vault/ --iteration 50 --salt 1234abcd
=========================================================================

  JBoss Vault

  JBOSS_HOME: /opt/jboss-eap

  JAVA: java

=========================================================================

May 11, 2020 7:07:08 AM java.io.ObjectInputStream filterCheck
INFO: ObjectInputFilter REJECTED: null, array length: -1, nRefs: 1, depth: 1, bytes: 70, ex: n/a
Problem occurred:
java.lang.Exception: WFLYSEC0045: Exception encountered:
	at org.jboss.as.security.vault.VaultSession.initSecurityVault(VaultSession.java:192)
	at org.jboss.as.security.vault.VaultSession.startVaultSession(VaultSession.java:210)
	at org.jboss.as.security.vault.VaultTool.execute(VaultTool.java:193)
	at org.jboss.as.security.vault.VaultTool.main(VaultTool.java:83)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.jboss.modules.Module.run(Module.java:329)
	at org.jboss.modules.Main.main(Main.java:507)
Caused by: org.jboss.security.vault.SecurityVaultException: java.lang.RuntimeException: PBOX00140: Unable to get keystore (/opt/jboss-eap/bin/vault/vault.keystore)
	at org.picketbox.plugins.vault.PicketBoxSecurityVault.init(PicketBoxSecurityVault.java:210)
	at org.jboss.as.security.vault.VaultSession.initSecurityVault(VaultSession.java:189)
	... 9 more
Caused by: java.lang.RuntimeException: PBOX00140: Unable to get keystore (/opt/jboss-eap/bin/vault/vault.keystore)
	at org.picketbox.plugins.vault.PicketBoxSecurityVault.getKeyStore(PicketBoxSecurityVault.java:691)
	at org.picketbox.plugins.vault.PicketBoxSecurityVault.init(PicketBoxSecurityVault.java:205)
	... 10 more
Caused by: java.io.IOException: Invalid secret key format
	at com.sun.crypto.provider.JceKeyStore.engineLoad(JceKeyStore.java:853)
	at java.security.KeyStore.load(KeyStore.java:1445)
	at org.picketbox.util.KeyStoreUtil.getKeyStore(KeyStoreUtil.java:201)
	at org.picketbox.util.KeyStoreUtil.getKeyStore(KeyStoreUtil.java:151)
	at org.picketbox.plugins.vault.PicketBoxSecurityVault.getKeyStore(PicketBoxSecurityVault.java:688)
	... 11 more



Resolução

Esse problema foi rastreado no BZ / JIRA a seguir e a correção será incluída no EAP 7.1 CP3 e no EAP 6.4 CP21. A correção de bug é o jboss-modules adicionando o pacote com.sun.crypto.provider internamente, para que a solução alternativa a seguir não seja mais necessária para as versões futuras:
  • EAP 6.4.z: https://bugzilla.redhat.com/show_bug.cgi?id=1569958
  • EAP 7.1.z: https://issues.jboss.org/browse/JBEAP-14661
Até o EAP 7.1 CP3 e o EAP 6.4 CP21 serem lançados, você pode solucionar o problema adicionando o com.sun.crypto.provider ao JBOSS_MODULES_SYSTEM_PKGS (que, por sua vez, adiciona o valor à propriedade do sistema jboss.modules.system.pkgs):
  • No standalone.conf ou domain.conf (dependendo do modo que está sendo usado), localizado em JBOSS_HOME/bin/ set ou inclua com.sun.crypto.provider no final da variável JBOSS_MODULES_SYSTEM_PKGS:


Esse problema ocorre no script vault.sh,  esse comando não lê o arquivo conf (standalone.conf ou domain.conf). Até que o patch seja lançado, use JAVA_OPTS para passar a propriedade de sistema jboss.modules.system.pkgs ao executar o vault.sh, por exemplo:
JAVA_OPTS="-Djboss.modules.system.pkgs=com.sun.crypto.provider" 
[root@wk vault]# JAVA_OPTS="-Djboss.modules.system.pkgs=com.sun.crypto.provider" ../vault.sh --keystore /opt/jboss-eap/bin/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr redhat --enc-dir /opt/jboss-eap/bin/vault/ --iteration 50 --salt 1234abcd
=========================================================================

  JBoss Vault

  JBOSS_HOME: /opt/jboss-eap

  JAVA: java

=========================================================================

May 11, 2020 7:11:19 AM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX00361: Default Security Vault Implementation Initialized and Ready
WFLYSEC0047: Secured attribute value has been stored in Vault.
Please make note of the following:
********************************************
Vault Block:vb
Attribute Name:password
Configuration should be done as follows:
VAULT::vb::password::1
********************************************
WFLYSEC0048: Vault Configuration in WildFly configuration file:
********************************************
...


Causa raiz
A causa principal disso é o RHSA-2018: 1191 gerenciado no bugzilla 1567126, que protegia como o keystore JCEKS carrega suas chaves no openjdk. Como resultado disso, é necessária uma nova dependência para ler a classe com.sun.crypto.provider.SealedObjectForKeyProtector (finalmente, foi decidido adicionar essa dependência globalmente ao jboss-modules).


Leitura recomendada
  • Como configurar o vault
  • Solução verificada RedHat.
...

Nenhum comentário:

Postar um comentário