Quero saber se existe uma maneira de configurar o Tomcat server.xml
para usar a criptografia SSL com uma chave privada armazenada remotamente em um servidor. Posso imaginar que a configuração do servidor seria algo assim
Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
proxyPort=""
keystoreFile="{./script-return}/keystore.jks"
keystorePass="12345"
keystoreType="jks"
truststorePass="12345"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
Mas a keystoreFile
diretiva aponta para um script que extrai a chave privada do servidor remoto.
Existe uma maneira na configuração do Tomcat de apontar para um script de shell para extrair a chave?
Eu encontrei algo sobreTrustManagermas posso ver que o caminho deve apontar para um caminho do sistema de arquivos, o que não é uma alternativa para mim.
Responder1
"Extrair a chave" anula completamente o objetivo de usar um HSM - significa que a chave privada ainda estaria armazenada na memória do Tomcat (portanto, seria possível roubar usando, por exemplo, Heartbleed), e qualquer pessoa que olhasse para ela server.xml
ainda poderia roubá-la porsimplesmente executando exatamente o mesmo comandocomo o Tomcat faz.
Sua ideia só faz sentido se você conseguir fazer o Tomcatenviar solicitações de assinaturapara o HSM. Isso aumentará um pouco a latência (devido ao fato de cada conexão TLS ter que atingir o HSM), mas é a única abordagem que realmente adiciona alguma segurança.
(Ele nem precisa ser um HSM real; pode até ser o SoftHSM2 rodando no mesmo sistema, e ainda seria mais seguro, desde que mantivesse firmemente a chave em uma conta de usuário e o Tomcat na outra.)
Usando um módulo PKCS#11 no mesmo sistema
Você pode avançar nesta seção, mas as etapas básicas para usar o PKCS#11 com o Tomcat são:
- Crie um arquivo com:
/etc/java-<name>.cfg
nome =<hsm_nome>
(Ajuste o caminho da biblioteca de acordo com sua distribuição. A documentação completa deste arquivo de configuração pode ser encontrada noGuia Java PKCS#11.)
biblioteca = /usr/lib/p11-kit-proxy.so - Adicione uma nova linha ao seu
java.security
arquivo:provedor.de.segurança.NUM=sun.security.pkcs11.SunPKCS11 /etc/java-<nome>.cfg
- Execute o keytool e certifique-se de que ele mostra o conteúdo do seu HSM:
keytool --list --storetype PKCS11
Por fim, configure o Tomcat para usar o PKCS#11:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-hsm_name" keystorePass="[HSM PIN here]" />
Usando um módulo PKCS#11 de um servidor remoto
Okit p11O pacote vem com dois componentes que podem conseguir isso:
O
p11-kit-proxy.so
módulo PKCS#11, que atua como multiplexador e pode ser configurado para carregar diversos outros módulos conforme configuração. Entre outras coisas, ele pode se comunicar com um módulo fora de processo através de um tubo.A
p11-kit remote
ferramenta, que atua como a outra extremidade do tubo para suporte ao módulo fora de processo do kit p11. Ele pode ser usado por SSH ou qualquer outro túnel.
Então, primeiro no lado do HSM:
- Instale o p11-kit e escolha ou crie uma conta de usuário que o utilizará.
- Crie um arquivo nessa conta de usuário para informar ao p11-kit sobre seu módulo HSM PKCS#11. O conteúdo do arquivo consiste em uma linha:
~/.config/pkcs11/modules/<name>.module
módulo: /usr/lib/<hsm_pkcs11_name>.então
(Como alternativa, você pode criar isso no diretório de todo o sistema/usr/share/p11-kit/modules/
.) - Certifique-se
p11-kit list
ep11tool --list-tokens
trabalhe com o HSM.
Observação: as etapas 2 a 3 não são realmente necessárias para este plano; eles estão lá apenas para que possíveis problemas possam ser percebidos desde o início. Se descobrir que o p11-kit é incompatível com o módulo HSM, você economizará algum trabalho. (E se for compatível, você poderá usá-lo p11tool
para gerenciá-lo.)
Então, do lado do Tomcat:
- Instale o p11-kit também.
- Crie um par de chaves SSH para Tomcat e coloque-o na conta HSM
authorized_keys
para uso SSH sem senha. - Crie novamente um arquivo no diretório inicial da conta do usuário Tomcat, mas desta vez o conteúdo do arquivo deve ser semelhante a este:
~/.config/pkcs11/modules/<name>.module
remoto: |ssh usuário@hsmserver p11-kit remoto /usr/lib/<hsm_pkcs11_name>.então
- Mais uma vez, certifique-se
p11-kit list
ep11tool --list-tokens
trabalhe. Eles deveriam estabelecer magicamente uma conexão SSH e mostrar informações sobre o HSM remoto. - Para agilizar o acesso remoto, habilite a multiplexação de conexão em SSH via
~/.ssh/config
:Hospedarservidor hsm
ControlPath ~/.ssh/S.%r@%h:%p
ControlMaster auto
ControlPersist 1h
Se tudo funcionar, tente usar keytool
com o módulo p11-kit-proxy PKCS#11:
- Crie um
/etc/java-p11-kit.cfg
arquivo com:nome = biblioteca p11-kit
(Ajuste o caminho da biblioteca de acordo com sua distribuição. A documentação completa deste arquivo de configuração pode ser encontrada noGuia Java PKCS#11.)
= /usr/lib/p11-kit-proxy.so - Adicione uma nova linha ao seu
java.security
arquivo:provedor.de.segurança.NUM=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
- Execute o keytool e certifique-se de que ele mostra o conteúdo do seu HSM:
keytool --list --storetype PKCS11
Por fim, configure o Tomcat para usar o módulo p11-kit-proxy PKCS#11:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-p11-kit" keystorePass="[HSM PIN here]" />