1. Introduzione
Panoramica
Cloud Functions è una soluzione di calcolo leggera che consente agli sviluppatori di creare funzioni autonome a uso specifico, che rispondano a eventi Cloud senza la necessità di gestire un ambiente server o di runtime.
Puoi utilizzare le chiavi di crittografia gestite dal cliente (CMEK) di Cloud Key Management Service per proteggere Cloud Functions e i dati at-rest correlati. Il deployment di una funzione con una chiave CMEK protegge i dati associati utilizzando una chiave di crittografia sotto il tuo controllo totale. Questo tipo di crittografia consente di soddisfare i requisiti di conformità in determinati settori, ad esempio i servizi finanziari. Poiché la chiave è di tua proprietà e non è controllata da Google, nessuno (incluso te) può accedere ai dati protetti da queste chiavi di crittografia quando le chiavi sono disattivate o distrutte.
Per Cloud Functions, CMEK cripta quanto segue:
- Codice sorgente della funzione caricato per il deployment e archiviato da Google in Cloud Storage, utilizzato nel processo di compilazione.
- I risultati del processo di compilazione della funzione, inclusa l'immagine del contenitore creata dal codice sorgente della funzione, ogni istanza della funzione di cui è stato eseguito il deployment.
- Dati a riposo per i canali di trasporto degli eventi interni (solo 1ª gen.).
Per saperne di più su quali dati vengono criptati, consulta la documentazione CMEK della funzione Cloud Functions.
Cosa creerai
Questo codelab mostra come eseguire il deployment di una funzione Cloud Functions (1ª o 2ª gen.) criptata utilizzando CMEK. Questo codelab utilizza una funzione Cloud pubblica, ovvero una che non richiede l'autenticazione, a scopo dimostrativo. Puoi richiamare una funzione CMEK autenticata come qualsiasi altra funzione Cloud che richiede l'autenticazione.
Obiettivi didattici
- Come creare una chiave CMEK su un keyring simmetrico esistente
- Come creare un repository Artifact Registry
- Come configurare CMEK in una funzione Cloud sia per la 1ª che per la 2ª generazione
2. Configurazione e requisiti
Prerequisiti
- Hai eseguito l'accesso alla console Cloud
- Hai eseguito in precedenza il deployment di una funzione Cloud attivata da HTTP (per verificare di aver attivato i ruoli e le API appropriati)
Attiva Cloud Shell
- Nella console Cloud, fai clic su Attiva Cloud Shell .
Se è la prima volta che avvii Cloud Shell, viene visualizzata una schermata intermedia che descrive di cosa si tratta. Se viene visualizzata una schermata intermedia, fai clic su Continua.
Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.
Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto con un browser.
Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto.
- Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list
Output comando
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Esegui il seguente comando in Cloud Shell per verificare che il comando gcloud conosca il tuo progetto:
gcloud config list project
Output comando
[core] project = <PROJECT_ID>
In caso contrario, puoi impostarlo con questo comando:
gcloud config set project <PROJECT_ID>
Output comando
Updated property [core/project].
3. Creare un nuovo keyring e una nuova chiave per Cloud Functions
Assicurati che l'API Cloud KMS sia abilitata eseguendo il seguente comando:
gcloud services enable cloudkms.googleapis.com
Innanzitutto, crea le variabili di ambiente per contenere il nome del keyring, il nome della chiave, la regione e altre variabili utilizzate in questo codelab.
KEYRING_NAME="keyring-functions" REGION="us-central1" KEY_NAME="key-encrypted-function" PROJECT_ID=$(gcloud config get-value project) PROJECT_NUMBER="$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')" USER_EMAIL="$(gcloud config list account --format "value(core.account)")"
Crea un keyring, ovvero la risorsa principale per le chiavi e le versioni delle chiavi Cloud KMS.
gcloud kms keyrings create $KEYRING_NAME --location $REGION
Infine, ora puoi creare una chiave simmetrica nel nuovo keyring all'interno di Cloud KMS.
gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"
4. Crea un repository Artifact Registry in formato Docker abilitato per CMEK
In questa sezione creerai un repository in formato Docker in Artifact Registry in cui è abilitato CMEK. Questa chiave sarà la stessa utilizzata per il deployment della funzione Cloud Functions.
Per prima cosa, devi avere l'account di servizio per Artifact Registry. Puoi crearlo eseguendo questo comando:
gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID
Utilizza il seguente comando per concedere il ruolo IAM Autore crittografia/decrittografia CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter
) all'account di servizio Artifact Registry per disporre delle autorizzazioni per la chiave:
gcloud kms keys add-iam-policy-binding \ $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
Concedi il ruolo all'entità che creerà il repository nel registry degli elementi, ad esempio il tuo account attivo attuale. Puoi verificare il tuo account attivo corrente eseguendo gcloud auth list.
gcloud kms keys add-iam-policy-binding \ $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \ --member user:$USER_EMAIL \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
Ora puoi creare un repository in formato Docker abilitato per CMEK.
Nota: la regione deve essere la stessa della chiave CMEK.
REPO_NAME=my-cmek-encrypted-repo KEY_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/keyRings/"$KEYRING_NAME"/cryptoKeys/"$KEY_NAME" gcloud artifacts repositories create $REPO_NAME \ --repository-format=docker \ --location=$REGION \ --kms-key=$KEY_FULLPATH \ --async
Puoi visualizzare il nuovo repository Artifact Registry eseguendo questo comando:
gcloud artifacts repositories describe $REPO_NAME --location=$REGION
5. Concedi agli account di servizio l'accesso alla chiave (2ª gen.)
Questa sezione illustra la creazione di account di servizio per le funzioni di 2ª generazione. Se stai creando una funzione di 1ª generazione, vai alla sezione successiva.
Devi concedere a diversi agenti di servizio l'accesso alla chiave concedendo il ruolo IAM Autore crittografia/decrittografia CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter
). Questi agenti di servizio vengono utilizzati per ottenere l'accesso al codice sorgente archiviato in Cloud Storage, archiviare le immagini delle funzioni in un repository protetto da CMEK in Artifact Registry ed eseguire il deployment di una funzione Cloud Functions criptata con CMEK.
Procedura per le funzioni di 2ª gen.
- Concedi all'agente di servizio Cloud Run l'accesso alla chiave:
CLOUDRUN_SA=service-$PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$CLOUDRUN_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Concedi all'agente di servizio Eventarc l'accesso alla chiave:
EVENTARC_SA=service-$PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$EVENTARC_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Concedi all'agente di servizio Artifact Registry l'accesso alla chiave:
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$AR_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Concedi agli agenti di servizio Cloud Storage l'accesso alla chiave:
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$STORAGE_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Nella sezione successiva scoprirai come creare e implementare una funzione con crittografia CMEK.
6. Concedi ai service account l'accesso alla chiave (1ª gen.)
Questa sezione illustra la creazione di account di servizio per le funzioni di 1ª generazione. Se hai già creato account di servizio per una funzione di 2ª generazione, vai alla sezione successiva.
Devi concedere l'accesso alla chiave a diversi agenti di servizio concedendo il ruolo IAM Autore crittografia/decriptazione CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter
). Questi agenti di servizio vengono utilizzati per ottenere l'accesso al codice sorgente archiviato in Cloud Storage, archiviare le immagini delle funzioni in un repository protetto da CMEK in Artifact Registry e per eseguire il deployment di una funzione Cloud criptata con CMEK.
Procedura per le funzioni di 1ª gen.
- Concedi all'agente di servizio Cloud Functions l'accesso alla chiave:
FUNCTION_SA=service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$FUNCTION_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Concedi all'agente di servizio Artifact Registry l'accesso alla chiave:
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$AR_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
- Concedi agli agenti di servizio Cloud Storage l'accesso alla chiave:
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com gcloud kms keys add-iam-policy-binding $KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION \ --member=serviceAccount:$STORAGE_SA \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Nella sezione successiva scoprirai come creare una funzione criptata con CMEK ed eseguirne il deployment.
7. Crea una funzione criptata con CMEK (2a generazione)
Questa sezione illustra la creazione di funzioni di 2a generazione. Puoi passare alla sezione successiva per le istruzioni relative alla 1ª generazione.
Ora che hai un repository Artifact Registry configurato con CMEK abilitato e hai concesso a Cloud Functions l'accesso alla tua chiave, puoi eseguire il deployment di una funzione criptata utilizzando la chiave CMEK.
Procedura per le funzioni di 2ª gen.:
Crea il codice sorgente della funzione
Sebbene questo codelab utilizzi Node.js, puoi utilizzare qualsiasi runtime supportato.
Innanzitutto, crea una directory e accedi tramite cd.
mkdir ~/cmek-function-2ndgen && cd $_
Poi, crea il file package.json.
touch package.json echo '{ "dependencies": { "@google-cloud/functions-framework": "^2.1.0" } } ' > package.json
Quindi, crea il file di origine index.js.
touch index.js echo 'const functions = require("@google-cloud/functions-framework"); functions.http("helloWorld", (req, res) => { res.send(`Hello ${req.query.name || req.body.name || "World"}!`); });' > index.js
Esegui il deployment della funzione Cloud di 2ª generazione utilizzando la crittografia CMEK
Nota:l'esempio seguente mostra come eseguire il deployment di una funzione utilizzando le origini della directory corrente. Assicurati di trovarti nella stessa directory del codice sorgente della funzione.
FUNCTION_NAME=protect-me-cmek-2ndgen ENTRY_POINT=helloWorld REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME gcloud beta functions deploy $FUNCTION_NAME \ --gen2 \ --region $REGION \ --kms-key $KEY_FULLPATH \ --docker-repository $REPO_FULLPATH \ --source . \ --trigger-http \ --allow-unauthenticated \ --runtime nodejs16 \ --entry-point $ENTRY_POINT
Puoi vedere la chiave CMEK dall'output risultante eseguendo questo comando
gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
Testa la funzione di 2ª gen.
Puoi testare la funzione eseguendo il curl:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')" curl $FUNCTION_URL
con le seguenti conseguenze:
Hello World!
Se la chiave di crittografia è abilitata, la funzione restituirà l'esito positivo al chiamante. Tuttavia, una volta disattivata la chiave di crittografia, il chiamante riceverà un errore.
Nella sezione successiva scoprirai cosa succede quando richiami la funzione dopo che il tasto è stato disabilitato.
8. Creare una funzione con crittografia CMEK (1ª gen.)
Questa sezione illustra la creazione di funzioni di 1a generazione. Se hai già creato una funzione di 2ª generazione, vai alla sezione successiva.
Ora che hai un repository Artifact Registry configurato con CMEK abilitata e hai concesso a Cloud Functions l'accesso alla tua chiave, puoi eseguire il deployment di una funzione criptata utilizzando la chiave CMEK.
Passaggi per le funzioni di 1a generazione:
Crea il codice sorgente per la funzione di 1a generazione
Anche se questo codelab utilizza Node.js, puoi utilizzare qualsiasi runtime supportato.
Innanzitutto, crea una directory e accedi tramite cd.
mkdir ~/cmek-function-1stgen && cd $_
A questo punto, crea il file package.json.
touch package.json echo '{ "name": "function-cmek-codelab", "version": "0.0.1" }' > package.json
Quindi, crea il file di origine index.js.
touch index.js echo "exports.helloWorld = (req, res) => { let message = req.query.message || req.body.message || 'Hello World!'; res.status(200).send(message); };" > index.js
Esegui il deployment della funzione Cloud di 1ª gen. utilizzando la crittografia CMEK
Nota:l'esempio seguente mostra come eseguire il deployment di una funzione utilizzando le origini della directory corrente. Assicurati di trovarti nella stessa directory del codice sorgente della funzione.
FUNCTION_NAME=protect-me-cmek-1stgen ENTRY_POINT=helloWorld REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME gcloud functions deploy $FUNCTION_NAME \ --region $REGION \ --kms-key $KEY_FULLPATH \ --docker-repository $REPO_FULLPATH \ --source . \ --trigger-http \ --allow-unauthenticated \ --runtime nodejs16 \ --entry-point $ENTRY_POINT
Puoi vedere la chiave CMEK dall'output risultante eseguendo questo comando
gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName
Testa la funzione di 1ª gen.
Puoi testare la tua funzione usando il comando curl:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')" curl $FUNCTION_URL
con le seguenti conseguenze:
Hello World!
Se la chiave di crittografia è abilitata, la funzione restituirà l'esito positivo al chiamante. Tuttavia, una volta disattivata la chiave di crittografia, il chiamante riceverà un errore.
Nella sezione successiva scoprirai cosa succede quando richiami la funzione dopo che il tasto è stato disabilitato.
9. Richiama una funzione con crittografia CMEK in cui la chiave di crittografia è stata disattivata
In questa sezione finale, invaliderai la chiave e richiamerai di nuovo la funzione per visualizzare l'errore risultante.
Disattivare la chiave di crittografia
Puoi eseguire questo comando per disattivare la chiave. Poiché questo codelab crea una sola versione della chiave, devi disattivare la versione 1.
gcloud kms keys versions disable 1 \ --key=$KEY_NAME \ --keyring=$KEYRING_NAME \ --location=$REGION
e dovresti vedere le informazioni risultanti:
algorithm: GOOGLE_SYMMETRIC_ENCRYPTION createTime: '2023-04-11T03:30:49.111832653Z' generateTime: '2023-04-11T03:30:49.111832653Z' name: projects/dogfood-gcf-saraford/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function/cryptoKeyVersions/1 protectionLevel: SOFTWARE state: DISABLED
Richiamare la funzione con una chiave disattivata
Ora curl
di nuovo la funzione.
curl $FUNCTION_URL
e questa volta non riceverai una risposta Hello World.
Nei log della funzione Cloud vedrai
User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function
Tentativo di visualizzare le risorse quando la chiave CMEK è disattivata
In questa sezione viene indicato che le seguenti risorse non sono disponibili quando la chiave CMEK è disattivata:
- Codice sorgente della funzione
- Build dell'immagine container dal codice sorgente
Ad esempio, se visiti la scheda Origine della funzione Cloud, viene visualizzato un errore durante il recupero dell'archivio. Visualizzerai un errore simile se provi a visualizzare il file ZIP contenente il codice sorgente direttamente in Cloud Storage.
Inoltre, non avrai accesso all'utilizzo dell'immagine del contenitore per la funzione da Artifact Registry. Ad esempio, se tenti di eseguire il deployment dell'immagine container in Cloud Run, riceverai un errore che indica che l'immagine non è stata trovata.
Per un elenco completo delle risorse criptate, consulta la documentazione delle funzioni CMEK.
10. Complimenti
Complimenti, hai completato il codelab.
Argomenti trattati
- Come creare una chiave CMEK su un keyring simmetrico esistente
- Come creare un repository Artifact Registry
- Come configurare CMEK in una funzione Cloud
Per ulteriori informazioni
Puoi trovare ulteriori informazioni su Cloud Functions e CMEK nei seguenti link:
- Articolo Protezione di Cloud Functions mediante CMEK
- Documentazione sulle chiavi di crittografia gestite dal cliente