Usa una chiave Cloud HSM per gestire il traffico Apache

Questa guida fornisce istruzioni per configurare un server Apache per utilizzare un Chiave Cloud HSM per la firma TLS in Debian 11 (Bullseye). Potresti dover modificare questi comandi affinché siano compatibili con la distribuzione del tuo sistema operativo o Linux.

Puoi trovare una versione del progetto basata su Terraform di questo tutorial nel Repository GitHub di kms-solutions.

Prima di iniziare

Come prerequisito, completa la configurazione descritta in Configurazione di OpenSSL.

Una volta completata la configurazione di OpenSSL, assicurati che sia disponibile una versione recente di Apache installato:

sudo apt-get update
sudo apt-get install apache2

Configurazione

Crea una chiave di firma ospitata da Cloud KMS

Crea una chiave di firma Cloud KMS EC-P256-SHA256 nel tuo progetto Google Cloud, nel keyring configurato in precedenza per 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"

Creare un certificato autofirmato con OpenSSL

Genera un certificato autofirmato con Cloud KMS ospitata chiave di firma. Puoi usare OpenSSL per usare un URI PKCS #11 anziché un percorso file e identificare la chiave tramite la relativa etichetta. In Cloud KMS PKCS #11 di archiviazione, l'etichetta della chiave è il nome della 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

Sostituisci quanto segue:

  • CERTIFICATE_NAME: un nome per il certificato.
  • DIGEST_FLAG: l'algoritmo digest utilizzato dalla firma asimmetrica chiave. Utilizza -sha256, -sha384 o -sha512 a seconda della chiave.
  • PKCS_KEY_TYPE: tipo di identificatore utilizzato per identificare la chiave. Per usare la versione più recente della chiave, usa pkcs11:object con il nome della chiave. Per utilizzare una versione della chiave specifica, utilizza pkcs11:id con l'ID risorsa completo della versione della chiave.
  • KEY_IDENTIFIER: un identificatore per la chiave. Se utilizzi pkcs11:object, usa il nome della chiave, ad esempio KEY_NAME. Se usi pkcs11:id, usa l'ID risorsa completo della chiave o della chiave dell'immagine, ad esempio projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION.
  • PATH_TO_CERTIFICATE: il percorso in cui vuoi salvare il file del certificato.

Se questo comando non riesce, PKCS11_MODULE_PATH potrebbe essere stato impostato in modo errato oppure potresti non avere le autorizzazioni corrette per utilizzare Cloud KMS chiave di firma.

Ora dovresti avere un certificato simile al seguente:

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

configura il server Apache

  1. Crea una directory in /etc/apache2 in cui archiviare i file autofirmati certificato in:

    sudo mkdir /etc/apache2/ssl
    sudo mv ca.cert /etc/apache2/ssl
    
  2. Modifica i file di configurazione dell'host virtuale 000-default.conf in /etc/apache2/sites-available per fornire il percorso del file del certificato e assicurarti che SSLEngine sia attivo.

    Ecco un esempio di configurazione in ascolto sulla 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. Assicurati che Apache esegua correttamente l'esportazione delle variabili di ambiente aggiungendole a il file /etc/apache2/envvars utilizzando l'editor di testo che preferisci. Potresti devi modificare il file come root utilizzando sudo. Aggiungi le seguenti righe alla sezione fine del file:

    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
    

    Sostituisci quanto segue:

    • PATH_TO_LIBKMSP11: il percorso di libkmsp11.so.
    • PATH_TO_PKCS11_CONFIG: il percorso verso pkcs11-config.yaml.

    GRPC_ENABLE_FORK_SUPPORT è necessario per consentire a gRPC di includere il supporto per i fork e di eseguire correttamente la libreria PKCS #11 di Cloud KMS all'interno del server Apache.

    Se vuoi eseguire l'autenticazione utilizzando una chiave dell'account di servizio, devi inoltre esporta un valore per l'ambiente GOOGLE_APPLICATION_CREDENTIALS .

Esegui il server

Abilita il modulo SSL di Apache, abilita la configurazione virtualhost e aggiungi un pagina web di test nella cartella 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

Riavvia il server Apache e verifica con curl che la configurazione funzioni previsto. Il flag --insecure è necessario per ignorare il certificato autofirmato controlli.

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

Se riscontri errori, il log degli errori di Apache è un buon punto di partenza per capire cosa è andato storto. I problemi di autenticazione sono una causa comune di errori. Se vedi errori PERMISSION_DENIED, assicurati di aver eseguito l'autenticazione completa e che il file delle credenziali abbia le autorizzazioni corrette. Per assicurarti di essere completamente autenticati:

gcloud auth application-default login

Per confermare l'esito positivo dell'autenticazione, l'output deve includere il comando riga Credentials saved to file: [/path/to/credentials.json].