Usar uma chave do Cloud HSM para exibir o tráfego do Apache

Este guia fornece instruções para configurar um servidor Apache para usar uma Chave do Cloud HSM para assinatura TLS no Debian 11 (Bullseye). Talvez seja necessário modifique esses comandos para que funcionem com sua distribuição do SO ou Linux.

Encontre uma versão do blueprint baseada no Terraform deste tutorial no repositório do GitHub kms-solutions.

Antes de começar

Como pré-requisito, conclua a configuração documentada em Configuração do OpenSSL.

Após a conclusão da configuração do OpenSSL, verifique se uma versão recente do Apache está instalada:

sudo apt-get update
sudo apt-get install apache2

Configuração

Criar uma chave de assinatura hospedada no Cloud KMS

Crie uma chave de assinatura EC-P256-SHA256 do Cloud KMS na sua projeto do Google Cloud, no keyring configurado anteriormente Para OpenSSL:

gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
  --project "PROJECT_ID" --location "LOCATION" \
  --purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
  --protection-level "hsm"

Criar um certificado autoassinado com o OpenSSL

Gere um certificado autoassinado com a chave de assinatura hospedada no Cloud KMS. Você pode usar o OpenSSL para usar um URI PKCS #11 em vez de um caminho de arquivo e identificar a chave pelo rótulo. Na biblioteca PKCS #11 do Cloud KMS, o rótulo da chave é o nome da CryptoKey.

openssl req -new -x509 -days 3650 -subj '/CN=CERTIFICATE_NAME/' \
  DIGEST_FLAG -engine pkcs11 -keyform engine \
  -key PKCS_KEY_TYPE=KEY_IDENTIFIER > PATH_TO_CERTIFICATE

Substitua:

  • CERTIFICATE_NAME: um nome para o certificado.
  • DIGEST_FLAG: o algoritmo de resumo usado pela chave de assinatura assimétrica. Use -sha256, -sha384 ou -sha512, dependendo da chave.
  • PKCS_KEY_TYPE: o tipo de identificador usado para identificar a chave. Para usar a versão mais recente da chave, use pkcs11:object com o nome da chave. Para use uma versão de chave específica, use pkcs11:id com o ID completo do recurso da a versão da chave.
  • KEY_IDENTIFIER: um identificador da chave. Se você estiver usando pkcs11:object, use o nome da chave, por exemplo, KEY_NAME. Se você estiver usando pkcs11:id, use o ID de recurso completo da chave ou da versão da chave, por exemplo, projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION.
  • PATH_TO_CERTIFICATE: o caminho em que você quer salvar o arquivo de certificado.

Se esse comando falhar, é possível que PKCS11_MODULE_PATH tenha sido definido incorretamente ou que você não tenha as permissões corretas para usar a chave de assinatura do Cloud KMS.

Agora você terá um certificado como este:

-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----

Configurar o servidor Apache

  1. Crie um diretório em /etc/apache2 para armazenar seu certificado autoassinado em:

    sudo mkdir /etc/apache2/ssl
    sudo mv ca.cert /etc/apache2/ssl
    
  2. Edite os arquivos de configuração de host virtual 000-default.conf localizados em /etc/apache2/sites-available para fornecer o caminho do arquivo do certificado. verificar se SSLEngine está ativado.

    Este é um exemplo de configuração que detecta na porta 443:

      <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            SSLEngine on
            SSLCertificateFile /etc/apache2/ssl/ca.cert
            SSLCertificateKeyFile "PKCS_KEY_TYPE=KEY_IDENTIFIER"
      </VirtualHost>
    
  3. Adicione as variáveis de ambiente ao arquivo para verificar se elas foram exportadas corretamente o arquivo /etc/apache2/envvars usando o editor de texto de sua preferência. Talvez seja necessário editar o arquivo como raiz usando sudo. Adicione as seguintes linhas ao fim do arquivo:

    export PKCS11_MODULE_PATH="<var>PATH_TO_LIBKMSP11</var>"
    export KMS_PKCS11_CONFIG="<var>PATH_TO_PKCS11_CONFIG</var>"
    export GRPC_ENABLE_FORK_SUPPORT=1
    

    Substitua:

    • PATH_TO_LIBKMSP11: o caminho para libkmsp11.so.
    • PATH_TO_PKCS11_CONFIG: o caminho para pkcs11-config.yaml.

    GRPC_ENABLE_FORK_SUPPORT é necessário para que o gRPC inclua suporte à bifurcação e execute corretamente a biblioteca PKCS #11 do Cloud KMS como parte do servidor Apache.

    Se você quiser fazer a autenticação usando uma chave de conta de serviço, também será necessário exportar um valor para a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS.

Execute seu servidor

Habilite o módulo Apache SSL, ative a configuração virtualhost e adicione um teste da página da Web na pasta DocumentRoot:

sudo a2enmod ssl
sudo a2ensite 000-default.conf
echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' | \
  sudo tee /var/www/html/index.html

Reinicie o servidor Apache e teste com curl se a configuração funciona conforme o esperado. A sinalização --insecure é necessária para ignorar verificações de certificado assinadas.

sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1

Se você encontrar erros, o registro de erros do Apache será um bom ponto de partida para ver o que deu errado. Problemas de autenticação são uma fonte comum de erros. Se você encontrar erros PERMISSION_DENIED, verifique se você está totalmente autenticado se o arquivo de credenciais tem as permissões corretas. Para garantir que você está totalmente autenticado, execute o seguinte comando:

gcloud auth application-default login

Para confirmar que a autenticação foi concluída, a saída precisa incluir a linha Credentials saved to file: [/path/to/credentials.json].