Usa una chiave Cloud HSM per gestire il traffico Apache

Questa guida fornisce istruzioni per configurare un server Apache per l'utilizzo di una chiave Cloud HSM per la firma TLS su Debian 11 (Bullseye). Potresti dover modificare questi comandi in modo che funzionino con il tuo sistema operativo o la distribuzione Linux.

Prima di iniziare

Come prerequisito, completa la configurazione documentata in OpenSSL setup.

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

sudo apt-get update
sudo apt-get install apache2

Configurazione

Crea una chiave di firma ospitata su Cloud KMS

Crea una chiave di firma EC-P256-SHA256 di Cloud KMS 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"

Crea un certificato autofirmato con OpenSSL

Genera un certificato autofirmato con la chiave di firma ospitata da Cloud KMS. Puoi utilizzare OpenSSL per usare un URI PKCS #11 anziché un percorso file e identificare la chiave in base all'etichetta. Nella libreria PKCS #11 di Cloud KMS, 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 chiave di firma asimmetrica. Usa -sha256, -sha384 o -sha512 a seconda della chiave.
  • PKCS_KEY_TYPE: il 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 specifica della chiave, usa pkcs11:id con l'ID risorsa completo della versione della chiave.
  • KEY_IDENTIFIER: un identificatore per la chiave. Se utilizzi pkcs11:object, utilizza il nome della chiave, ad esempio KEY_NAME. Se utilizzi pkcs11:id, usa l'ID risorsa completo della chiave o della versione della chiave, 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, è possibile che PKCS11_MODULE_PATH non sia stato impostato correttamente o che tu non disponga delle autorizzazioni corrette per utilizzare la chiave di firma di Cloud KMS.

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 il certificato autofirmato in:

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

    Ecco una configurazione di esempio 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 esporta correttamente le variabili di ambiente aggiungendole al file /etc/apache2/envvars utilizzando l'editor di testo che preferisci. Potrebbe essere necessario modificare il file come root utilizzando sudo. Aggiungi le seguenti righe alla 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 per libkmsp11.so.
    • PATH_TO_PKCS11_CONFIG: il percorso per pkcs11-config.yaml.

    GRPC_ENABLE_FORK_SUPPORT è necessario affinché gRPC includa il supporto per le diramazioni ed esegua correttamente la libreria Cloud KMS PKCS #11 come parte del server Apache.

    Se vuoi eseguire l'autenticazione utilizzando una chiave dell'account di servizio, devi esportare anche un valore per la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS.

Esegui il server

Abilita il modulo SSL Apache, abilita la configurazione virtualhost e aggiungi una 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 come previsto. Il flag --insecure è necessario per ignorare i controlli dei certificati autofirmati.

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

In caso di errori, il log degli errori Apache è un buon punto di partenza per capire cosa non ha funzionato. I problemi di autenticazione sono una fonte di errori comune. Se vedi errori PERMISSION_DENIED, assicurati di essere completamente autenticato e che il file delle credenziali disponga delle autorizzazioni corrette. Per assicurarti di avere l'autenticazione completa, esegui questo comando:

gcloud auth application-default login

Per confermare che l'autenticazione è riuscita, l'output deve includere la riga Credentials saved to file: [/path/to/credentials.json].