1. Einführung
Übersicht
Cloud Functions ist eine einfache Computing-Lösung für Entwickler zum Erstellen eigenständiger und zweckgebundener Funktionen, mit denen auf Cloud-Ereignisse reagiert werden kann, ohne einen Server oder eine Laufzeitumgebung verwalten zu müssen.
Sie können kundenverwaltete Verschlüsselungsschlüssel (Customer-Managed Encryption Keys, CMEK) für den Cloud Key Management Service verwenden, um Cloud Functions und zugehörige inaktive Daten zu schützen. Wenn Sie eine Funktion mit einem CMEK bereitstellen, werden die zugehörigen Daten mit einem Verschlüsselungsschlüssel geschützt, über den Sie die vollständige Kontrolle haben. Mit dieser Art der Verschlüsselung können Sie Complianceanforderungen in bestimmten Branchen wie Finanzdienstleistungen erfüllen. Da Sie der Inhaber des Schlüssels sind und er nicht von Google verwaltet wird, kann niemand (auch Sie nicht) auf die Daten zugreifen, die mit diesen Verschlüsselungsschlüsseln geschützt sind, wenn die Schlüssel deaktiviert oder gelöscht wurden.
Bei Cloud Functions werden mit CMEK folgende Daten verschlüsselt:
- Der Funktionsquellcode, der für die Bereitstellung hochgeladen und von Google in Cloud Storage gespeichert wird, wird für den Build-Prozess verwendet.
- Die Ergebnisse des Funktionsbuild-Prozesses, einschließlich des Container-Images, das aus dem Funktionsquellcode erstellt wurde, und jede Instanz der Funktion, die bereitgestellt wird.
- Ruhende Daten für interne Ereignistransportkanäle (nur 1. Generation).
Weitere Informationen dazu, welche Daten verschlüsselt werden, finden Sie in der CMEK-Dokumentation für Cloud Functions.
Aufgaben
In diesem Codelab erfahren Sie, wie Sie eine Cloud Functions-Funktion (1. oder 2. Generation) bereitstellen, die mit CMEK verschlüsselt ist. In diesem Codelab wird zu Demozwecken eine öffentliche Cloud Functions-Funktion verwendet, für die keine Authentifizierung erforderlich ist. Sie können eine authentifizierte CMEK-fähige Funktion wie jede andere Cloud Functions-Funktion aufrufen, für die eine Authentifizierung erforderlich ist.
Lerninhalte
- CMEK-Schlüssel in einem vorhandenen symmetrischen Schlüsselbund erstellen
- Artifact Registry-Repository erstellen
- CMEK für eine Cloud Functions-Funktion der 1. und 2. Generation konfigurieren
2. Einrichtung und Anforderungen
Vorbereitung
- Sie sind in der Cloud Console angemeldet.
- Sie haben bereits eine durch HTTP ausgelöste Cloud Functions-Funktion bereitgestellt (um zu prüfen, ob Sie die entsprechenden Rollen haben und die APIs aktiviert sind).
Cloud Shell aktivieren
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren
.

Wenn Sie die Cloud Shell zum ersten Mal starten, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter.

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

Diese virtuelle Maschine enthält alle Entwicklungstools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser erledigt werden.
Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.
- Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project
Befehlsausgabe
[core] project = <PROJECT_ID>
Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:
gcloud config set project <PROJECT_ID>
Befehlsausgabe
Updated property [core/project].
3. Neuen Schlüsselbund und Schlüssel für Cloud Functions erstellen
Prüfen Sie mit dem folgenden Befehl, ob die Cloud KMS API aktiviert ist:
gcloud services enable cloudkms.googleapis.com
Erstellen Sie zuerst Umgebungsvariablen für den Schlüsselbundnamen, den Schlüsselnamen, die Region und andere Variablen, die in diesem Codelab verwendet werden.
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)")"
Erstellen Sie als Nächstes einen Schlüsselbund. Das ist die Stammressource für Cloud KMS-Schlüssel und -Schlüsselversionen.
gcloud kms keyrings create $KEYRING_NAME --location $REGION
Schließlich können Sie jetzt einen symmetrischen Schlüssel in Ihrem neuen Schlüsselbund in Cloud KMS erstellen.
gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"
4. CMEK-fähiges Artifact Registry-Repository im Docker-Format erstellen
In diesem Abschnitt erstellen Sie ein Repository im Docker-Format in Artifact Registry, das CMEK-fähig ist. Dieser Schlüssel ist derselbe Schlüssel, der zum Bereitstellen Ihrer Cloud Functions-Funktion verwendet wird.
Zuerst benötigen Sie das Dienstkonto für Artifact Registry. Sie können es mit diesem Befehl erstellen:
gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID
Weisen Sie dem Artifact Registry-Dienstkonto mit dem folgenden Befehl die IAM-Rolle „CryptoKey-Verschlüsseler/Entschlüsseler“ (roles/cloudkms.cryptoKeyEncrypterDecrypter) zu, um Berechtigungen für den Schlüssel zu erhalten:
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
Weisen Sie die Rolle dem Prinzipal zu, der das Repository in Artifact Registry erstellt, z.B. Ihrem derzeit aktiven Konto. Sie können Ihr derzeit aktives Konto mit dem Befehl `gcloud auth list` prüfen.
gcloud kms keys add-iam-policy-binding \
$KEY_NAME --location $REGION --keyring=$KEYRING_NAME \
--member user:$USER_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter
Jetzt können Sie ein Repository im Docker-Format erstellen, das CMEK-fähig ist.
Hinweis:Die Region muss dieselbe Region wie der CMEK-Schlüssel sein.
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
Sie können Ihr neues Artifact Registry-Repository mit diesem Befehl aufrufen:
gcloud artifacts repositories describe $REPO_NAME --location=$REGION
5. Dienstkonten Zugriff auf den Schlüssel gewähren (2. Generation)
In diesem Abschnitt wird beschrieben, wie Sie Dienstkonten für Funktionen der 2. Generation erstellen. Wenn Sie eine Funktion der 1. Generation erstellen, fahren Sie mit dem nächsten Abschnitt fort.
Sie müssen mehreren Dienst-Agents Zugriff auf den Schlüssel gewähren, indem Sie die IAM-Rolle „CryptoKey-Verschlüsseler/Entschlüsseler“ (roles/cloudkms.cryptoKeyEncrypterDecrypter) zuweisen. Diese Dienst-Agents werden verwendet, um auf den in Cloud Storage gespeicherten Quellcode zuzugreifen, Funktions-Images in einem CMEK-geschützten Repository in Artifact Registry zu speichern und eine CMEK-verschlüsselte Cloud Functions-Funktion bereitzustellen.
Schritte für Funktionen der 2. Generation
- Gewähren Sie dem Cloud Run-Dienst-Agent Zugriff auf den Schlüssel:
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
- Gewähren Sie dem Eventarc-Dienst-Agent Zugriff auf den Schlüssel:
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
- Gewähren Sie dem Artifact Registry-Dienst-Agent Zugriff auf den Schlüssel:
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
- Gewähren Sie den Cloud Storage-Dienst-Agents Zugriff auf den Schlüssel:
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
Im nächsten Abschnitt erfahren Sie, wie Sie eine CMEK-verschlüsselte Funktion erstellen und bereitstellen.
6. Dienstkonten Zugriff auf den Schlüssel gewähren (1. Generation)
In diesem Abschnitt wird beschrieben, wie Sie Dienstkonten für Funktionen der 1. Generation erstellen. Wenn Sie bereits Dienstkonten für eine Funktion der 2. Generation erstellt haben, fahren Sie mit dem nächsten Abschnitt fort.
Sie müssen mehreren Dienst-Agents Zugriff auf den Schlüssel gewähren, indem Sie die IAM-Rolle „CryptoKey-Verschlüsseler/Entschlüsseler“ (roles/cloudkms.cryptoKeyEncrypterDecrypter) zuweisen. Diese Dienst-Agents werden verwendet, um auf den in Cloud Storage gespeicherten Quellcode zuzugreifen, Funktions-Images in einem CMEK-geschützten Repository in Artifact Registry zu speichern und eine CMEK-verschlüsselte Cloud Functions-Funktion bereitzustellen.
Schritte für Funktionen der 1. Generation
- Gewähren Sie dem Cloud Functions-Dienst-Agent Zugriff auf den Schlüssel:
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
- Gewähren Sie dem Artifact Registry-Dienst-Agent Zugriff auf den Schlüssel:
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
- Gewähren Sie den Cloud Storage-Dienst-Agents Zugriff auf den Schlüssel:
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
Im nächsten Abschnitt erfahren Sie, wie Sie eine CMEK-verschlüsselte Funktion erstellen und bereitstellen.
7. CMEK-verschlüsselte Funktion erstellen (2. Generation)
In diesem Abschnitt wird beschrieben, wie Sie Funktionen der 2. Generation erstellen. Eine Anleitung für Funktionen der 1. Generation finden Sie im nächsten Abschnitt.
Nachdem Sie ein Artifact Registry-Repository mit aktiviertem CMEK konfiguriert und Cloud Functions Zugriff auf Ihren Schlüssel gewährt haben, können Sie jetzt eine Funktion bereitstellen, die mit Ihrem CMEK-Schlüssel verschlüsselt ist.
Schritte für Funktionen der 2. Generation:
Quellcode für die Funktion erstellen
In diesem Codelab wird Node.js verwendet, Sie können aber jede unterstützte Laufzeit verwenden.
Erstellen Sie zuerst ein Verzeichnis und wechseln Sie in dieses Verzeichnis.
mkdir ~/cmek-function-2ndgen && cd $_
Erstellen Sie dann die Datei „package.json“.
touch package.json
echo '{
"dependencies": {
"@google-cloud/functions-framework": "^2.1.0"
}
}
' > package.json
Erstellen Sie als Nächstes die Quelldatei „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
Cloud Functions-Funktion der 2. Generation mit CMEK-Verschlüsselung bereitstellen
Hinweis:Im folgenden Beispiel wird gezeigt, wie Sie eine Funktion mit Quellen aus Ihrem aktuellen Verzeichnis bereitstellen. Achten Sie darauf, dass Sie sich im selben Verzeichnis wie der Quellcode für Ihre Funktion befinden.
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
Sie können den CMEK-Schlüssel in der Ausgabe mit diesem Befehl aufrufen:
`gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName`
Funktion der 2. Generation testen
Sie können Ihre Funktion mit „curl“ testen:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')" curl $FUNCTION_URL
Das Ergebnis sollte so aussehen:
Hello World!
Solange der Verschlüsselungsschlüssel aktiviert ist, gibt die Funktion eine Erfolgsmeldung an den Aufrufer zurück. Wenn der Verschlüsselungsschlüssel jedoch deaktiviert ist, erhält der Aufrufer eine Fehlermeldung.
Im nächsten Abschnitt erfahren Sie, was passiert, wenn Sie die Funktion aufrufen, nachdem der Schlüssel deaktiviert wurde.
8. CMEK-verschlüsselte Funktion erstellen (1. Generation)
In diesem Abschnitt wird beschrieben, wie Sie Funktionen der 1. Generation erstellen. Wenn Sie bereits eine Funktion der 2. Generation erstellt haben, fahren Sie mit dem nächsten Abschnitt fort.
Nachdem Sie ein Artifact Registry-Repository mit aktiviertem CMEK konfiguriert und Cloud Functions Zugriff auf Ihren Schlüssel gewährt haben, können Sie jetzt eine Funktion bereitstellen, die mit Ihrem CMEK-Schlüssel verschlüsselt ist.
Schritte für Funktionen der 1. Generation:
Quellcode für die Funktion der 1. Generation erstellen
In diesem Codelab wird Node.js verwendet, Sie können aber jede unterstützte Laufzeit verwenden.
Erstellen Sie zuerst ein Verzeichnis und wechseln Sie in dieses Verzeichnis.
mkdir ~/cmek-function-1stgen && cd $_
Erstellen Sie dann die Datei „package.json“.
touch package.json
echo '{
"name": "function-cmek-codelab",
"version": "0.0.1"
}' > package.json
Erstellen Sie als Nächstes die Quelldatei „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
Cloud Functions-Funktion der 1. Generation mit CMEK-Verschlüsselung bereitstellen
Hinweis:Im folgenden Beispiel wird gezeigt, wie Sie eine Funktion mit Quellen aus Ihrem aktuellen Verzeichnis bereitstellen. Achten Sie darauf, dass Sie sich im selben Verzeichnis wie der Quellcode für Ihre Funktion befinden.
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
Sie können den CMEK-Schlüssel in der Ausgabe mit diesem Befehl aufrufen:
`gcloud functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName`
Funktion der 1. Generation testen
Sie können Ihre Funktion mit „curl“ testen:
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')" curl $FUNCTION_URL
Das Ergebnis sollte so aussehen:
Hello World!
Solange der Verschlüsselungsschlüssel aktiviert ist, gibt die Funktion eine Erfolgsmeldung an den Aufrufer zurück. Wenn der Verschlüsselungsschlüssel jedoch deaktiviert ist, erhält der Aufrufer eine Fehlermeldung.
Im nächsten Abschnitt erfahren Sie, was passiert, wenn Sie die Funktion aufrufen, nachdem der Schlüssel deaktiviert wurde.
9. CMEK-verschlüsselte Funktion aufrufen, bei der der Verschlüsselungsschlüssel deaktiviert wurde
In diesem letzten Abschnitt machen Sie den Schlüssel ungültig und rufen die Funktion noch einmal auf, um die resultierende Fehlermeldung zu sehen.
Verschlüsselungsschlüssel deaktivieren
Mit diesem Befehl können Sie den Schlüssel deaktivieren. Da in diesem Codelab nur eine Version des Schlüssels erstellt wird, deaktivieren Sie Version 1.
gcloud kms keys versions disable 1 \
--key=$KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION
Sie sollten die folgenden Informationen sehen:
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
Funktion mit einem deaktivierten Schlüssel aufrufen
Rufen Sie die Funktion jetzt noch einmal mit curl auf.
curl $FUNCTION_URL
Dieses Mal erhalten Sie keine „Hello World“-Antwort.
In den Logs für die Cloud Functions-Funktion sehen Sie
User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function
Versuchen, Ressourcen aufzurufen, wenn der CMEK-Schlüssel deaktiviert ist
In diesem Abschnitt sehen Sie, dass die folgenden Ressourcen nicht mehr verfügbar sind, wenn der CMEK-Schlüssel deaktiviert ist:
- Funktionsquellcode
- Container-Image, das aus Ihrem Quellcode erstellt wurde
Wenn Sie beispielsweise den Tab „Quelle“ für die Cloud Functions-Funktion aufrufen, wird ein Fehler beim Abrufen des Archivs angezeigt. Eine ähnliche Fehlermeldung wird angezeigt, wenn Sie versuchen, die ZIP-Datei mit dem Quellcode direkt in Cloud Storage aufzurufen.

Außerdem haben Sie keinen Zugriff auf das Container-Image für die Funktion aus Artifact Registry. Wenn Sie beispielsweise versuchen, dieses Container-Image in Cloud Run bereitzustellen, wird eine Fehlermeldung angezeigt, dass das Image nicht gefunden wurde.
Eine vollständige Liste der verschlüsselten Ressourcen finden Sie in der CMEK-Dokumentation für Cloud Functions .
10. Glückwunsch
Das war's auch schon! Sie haben das Codelab abgeschlossen.
Behandelte Themen
- CMEK-Schlüssel in einem vorhandenen symmetrischen Schlüsselbund erstellen
- Artifact Registry-Repository erstellen
- CMEK für eine Cloud Functions-Funktion konfigurieren
Weitere Informationen
Weitere Informationen zu Cloud Functions und CMEK finden Sie unter den folgenden Links: