Utiliser une clé Cloud HSM pour diffuser le trafic Apache

Ce guide fournit des instructions pour configurer un serveur Apache afin d'utiliser un Clé Cloud HSM pour la signature TLS sur Debian 11 (Bullseye). Vous devrez peut-être modifier ces commandes pour qu'elles fonctionnent avec votre système d'exploitation ou votre distribution Linux.

Vous trouverez une version du plan basée sur Terraform de ce tutoriel dans la dépôt GitHub kms-solutions.

Avant de commencer

Avant de commencer, effectuez la configuration décrite dans Configuration d'OpenSSL

Une fois la configuration d'OpenSSL terminée, assurez-vous qu'une version récente d'Apache est installée :

sudo apt-get update
sudo apt-get install apache2

Configuration

Créer une clé de signature hébergée par Cloud KMS

Créez une clé de signature EC-P256-SHA256 Cloud KMS dans votre projet Google Cloud, dans le trousseau de clés que vous avez précédemment configuré pour 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"

Créer un certificat autosigné avec OpenSSL

Générer un certificat autosigné avec l'instance hébergée par Cloud KMS clé de signature. Vous pouvez utiliser OpenSSL pour utiliser un URI PKCS #11 au lieu d'un chemin de fichier. et identifier la clé par son étiquette. Dans la clé Cloud KMS PKCS #11 l'étiquette de clé correspond au nom de la 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

Remplacez les éléments suivants :

  • CERTIFICATE_NAME : nom du certificat.
  • DIGEST_FLAG: algorithme de condensé utilisé par la signature asymétrique . Utilisez -sha256, -sha384 ou -sha512 selon la clé.
  • PKCS_KEY_TYPE: type d'identifiant utilisé pour identifier la clé. Pour utiliser la dernière version de clé, utilisez pkcs11:object avec le nom de la clé. À utilisez une version de clé spécifique, utilisez pkcs11:id avec l'ID de ressource complet de version de clé.
  • KEY_IDENTIFIER : identifiant de la clé. Si vous utilisez pkcs11:object, utilisez le nom de la clé (par exemple, KEY_NAME). Si vous utilisez pkcs11:id, indiquez l'ID de ressource complet de la clé ou de la clé. version (par exemple, projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
  • PATH_TO_CERTIFICATE: chemin d'accès où vous souhaitez enregistrer le certificat .

Si cette commande échoue, il est possible que PKCS11_MODULE_PATH ait été défini de manière incorrecte. vous ne disposez peut-être pas des autorisations nécessaires pour utiliser l'API Cloud KMS clé de signature.

Vous devriez maintenant avoir un certificat semblable à celui-ci :

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

Configurer le serveur Apache

  1. Créez un répertoire dans /etc/apache2 pour stocker votre certificat autosigné dans :

    sudo mkdir /etc/apache2/ssl
    sudo mv ca.cert /etc/apache2/ssl
    
  2. Modifiez les fichiers de configuration de l'hôte virtuel 000-default.conf situés dans /etc/apache2/sites-available pour fournir le chemin d'accès au fichier de certificat et vous assurer que SSLEngine est activé.

    Voici un exemple de configuration écoutant sur le port 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. Assurez-vous qu'Apache exporte correctement les variables d'environnement en les ajoutant au fichier /etc/apache2/envvars à l'aide de l'éditeur de texte de votre choix. Vous devrez peut-être modifier le fichier en tant que racine à l'aide de sudo. Ajoutez les lignes suivantes à la ligne à la fin du fichier:

    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
    

    Remplacez les éléments suivants :

    • PATH_TO_LIBKMSP11: chemin d'accès à libkmsp11.so.
    • PATH_TO_PKCS11_CONFIG : chemin d'accès à pkcs11-config.yaml.

    GRPC_ENABLE_FORK_SUPPORT est nécessaire pour que gRPC prenne en charge la duplication et exécute correctement la bibliothèque PKCS #11 de Cloud KMS au sein du serveur Apache.

    Si vous souhaitez vous authentifier à l'aide d'une clé de compte de service, vous devez également exporter une valeur pour la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS.

Exécuter votre serveur

Activez le module SSL Apache, activez la configuration virtualhost et ajoutez une page Web de test dans votre dossier 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

Redémarrez votre serveur Apache et vérifiez que la configuration fonctionne comme prévu en procédant au test avec curl. L'option --insecure est nécessaire pour ignorer les vérifications de certificat autosigné.

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

Si vous rencontrez des erreurs, le journal d'erreurs Apache est un bon point de départ pour identifier le problème. Les problèmes d'authentification sont une source fréquente d'erreurs. Si des erreurs PERMISSION_DENIED s'affichent, assurez-vous d'être entièrement authentifié et que le fichier d'identifiants dispose des autorisations appropriées. Pour vous assurer d'être entièrement authentifié, exécutez la commande suivante :

gcloud auth application-default login

Pour confirmer que l'authentification a réussi, le résultat doit inclure le ligne Credentials saved to file: [/path/to/credentials.json].