Cloud Functions-Funktionen mit vom Kunden verwalteten Verschlüsselungsschlüsseln (CMEK) verschlüsseln

1. Einführung

Übersicht

Cloud Functions ist eine ressourcensparende Computing-Lösung, mit der Entwickler zweckgebundene, eigenständige Funktionen erstellen können, die auf Cloud-Ereignisse reagieren, ohne einen Server oder eine Laufzeitumgebung verwalten zu müssen.

Sie können vom Kunden verwaltete Verschlüsselungsschlüssel (Customer-Managed Encryption Keys, CMEK) des Cloud Key Management Service verwenden, um Cloud Functions und zugehörige ruhende Daten zu schützen. Durch das Bereitstellen einer Funktion mit einem CMEK werden die damit verknüpften Daten geschützt. Dazu wird ein Verschlüsselungsschlüssel verwendet, über den Sie die volle Kontrolle haben. Mit dieser Art der Verschlüsselung können Sie Compliance-Anforderungen in bestimmten Branchen erfüllen, z. B. in der Finanzdienstleistungsbranche. Da der Schlüssel Ihnen gehört und nicht von Google kontrolliert wird, kann niemand (auch nicht Sie) auf die durch diese Verschlüsselungsschlüssel geschützten Daten zugreifen, wenn die Schlüssel deaktiviert oder gelöscht werden.

Bei Cloud Functions verschlüsselt CMEK Folgendes:

  • Quellcode der Funktion, der für die Bereitstellung hochgeladen und von Google in Cloud Storage gespeichert wird, der beim Build-Prozess verwendet wird.
  • Die Ergebnisse des Funktionserstellungsprozesses, einschließlich des aus dem Funktionsquellcode erstellten Container-Images für jede Instanz der bereitgestellten Funktion.
  • Ruhende Daten für interne Ereignistransportkanäle (nur 1. Generation).

Weitere Informationen dazu, welche Daten verschlüsselt werden, finden Sie in der Dokumentation zum Cloud Functions-CMEK.

Aufgaben

In diesem Codelab wird gezeigt, wie Sie eine Cloud Functions-Funktion (entweder 1. Generation oder 2. Generation) bereitstellen, die mit CMEK verschlüsselt ist. In diesem Codelab wird zu Demozwecken eine öffentliche Cloud Functions-Funktion verwendet, die keine Authentifizierung erfordert. Sie können eine authentifizierte CMEK-fähige Funktion wie jede andere Cloud Functions-Funktion aufrufen, die eine Authentifizierung erfordert.

Lerninhalte

  • CMEK-Schlüssel für einen vorhandenen symmetrischen Schlüsselbund erstellen
  • Artifact Registry-Repository erstellen
  • CMEK in einer Cloud Functions-Funktion für die 1. und 2. Generation konfigurieren

2. Einrichtung und Anforderungen

Vorbereitung

  • Sie sind in der Cloud Console angemeldet
  • Sie haben zuvor eine durch HTTP ausgelöste Cloud Functions-Funktion bereitgestellt, um zu prüfen, ob die entsprechenden Rollen und APIs aktiviert sind.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.

9c92662c6a846a5c.png

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.

9f0e51b578fecce5.png

Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt, wodurch die Netzwerkleistung und Authentifizierung erheblich verbessert werden. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können mit einem Browser erledigt werden.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in 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`
  1. Führen Sie in 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

Führen Sie den folgenden Befehl aus, um zu prüfen, 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 in diesem Codelab verwendete Variablen.

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, der die Stammressource für Cloud KMS-Schlüssel und -Schlüsselversionen ist.

gcloud kms keyrings create $KEYRING_NAME --location $REGION

Abschließend können Sie in Ihrem neuen Schlüsselbund in Cloud KMS einen symmetrischen Schlüssel erstellen.

gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"

4. CMEK-fähiges Docker-formatiertes Artifact Registry-Repository erstellen

In diesem Abschnitt erstellen Sie in Artifact Registry mit aktiviertem CMEK ein Repository im Docker-Format. Dieser Schlüssel ist derselbe, der zum Bereitstellen der Cloud Functions-Funktion verwendet wird.

Zuerst benötigen Sie das Dienstkonto für Artifact Registry. Sie können ihn mit folgendem Befehl erstellen:

gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID

Verwenden Sie den folgenden Befehl, um dem Artifact Registry-Dienstkonto die IAM-Rolle CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) zu gewähren, 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 Prinzip zu, das das Repository in der Artifact Registry erstellt, z.B. Ihr derzeit aktives Konto. Sie können Ihr aktuell aktives Konto überprüfen, indem Sie gcloud auth list ausführen.

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 mit der Region des CMEK-Schlüssels übereinstimmen.

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

Mit dem folgenden Befehl können Sie Ihr neues Artifact Registry-Repository 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 Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) zuweisen. Diese Dienst-Agents werden verwendet, um Zugriff auf den in Cloud Storage gespeicherten Quellcode zu erhalten, 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

  1. 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
  1. 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
  1. 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
  1. 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 Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) zuweisen. Mit diesen Dienst-Agents erhalten Sie Zugriff auf den in Cloud Storage gespeicherten Quellcode, können Funktions-Images in einem CMEK-geschützten Repository in Artifact Registry speichern und eine CMEK-verschlüsselte Cloud Functions-Funktion bereitstellen.

Schritte für Funktionen der 1. Generation

  1. 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
  1. 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
  1. 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 das Erstellen von Funktionen der 2. Generation behandelt. Eine Anleitung für die 1. Generation finden Sie im nächsten Abschnitt.

Da Sie nun ein Artifact Registry-Repository mit aktiviertem CMEK konfiguriert und Cloud Functions Zugriff auf Ihren Schlüssel gewährt haben, können Sie eine Funktion bereitstellen, die mit Ihrem CMEK-Schlüssel verschlüsselt wird.

Schritte für Funktionen der 2. Generation:

Quellcode für die Funktion erstellen

In diesem Codelab wird Node.js zwar verwendet, Sie können aber jede unterstützte Laufzeit verwenden.

Erstellen Sie zunächst ein Verzeichnis und speichern Sie das Verzeichnis mit cd.

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:Das Beispiel unten zeigt, wie Sie eine Funktion mit Quellen aus Ihrem aktuellen Verzeichnis bereitstellen. Achten Sie darauf, dass Sie sich im selben Verzeichnis wie der Quellcode Ihrer 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

Mit diesem Befehl können Sie den CMEK-Schlüssel aus der resultierenden Ausgabe aufrufen.

gcloud-Funktionen beschreiben $FUNCTION_NAME – Region $REGION | grep kmsSchlüsselName

Funktion der 2. Generation testen

Sie können die Funktion testen, indem Sie einen curl-Befehl ausführen:

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')"

curl $FUNCTION_URL

Daraus ergibt sich Folgendes:

Hello World!

Solange der Verschlüsselungsschlüssel aktiviert ist, gibt die Funktion Erfolg an den Aufrufer zurück. Sobald der Verschlüsselungsschlüssel deaktiviert ist, erhält der Aufrufer jedoch 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 Funktionen der 1. Generation erstellt werden. Wenn Sie bereits eine Funktion der 2. Generation erstellt haben, fahren Sie mit dem nächsten Abschnitt fort.

Da Sie nun ein Artifact Registry-Repository mit aktiviertem CMEK konfiguriert und Cloud Functions Zugriff auf Ihren Schlüssel gewährt haben, können Sie eine Funktion bereitstellen, die mit Ihrem CMEK-Schlüssel verschlüsselt wird.

Schritte für Funktionen der 1. Generation:

Quellcode für die Funktion der 1. Generation erstellen

In diesem Codelab wird Node.js zwar verwendet, Sie können aber jede unterstützte Laufzeit verwenden.

Erstellen Sie zunächst ein Verzeichnis und speichern Sie das Verzeichnis mit cd.

mkdir ~/cmek-function-1stgen && cd $_

Erstellen Sie als Nächstes die Datei package.json.

touch package.json

echo '{
    "name": "function-cmek-codelab",
    "version": "0.0.1"
}' > package.json

Erstellen Sie dann 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:Das Beispiel unten zeigt, wie Sie eine Funktion mit Quellen aus Ihrem aktuellen Verzeichnis bereitstellen. Achten Sie darauf, dass Sie sich im selben Verzeichnis wie der Quellcode Ihrer 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

Mit diesem Befehl können Sie den CMEK-Schlüssel aus der resultierenden Ausgabe aufrufen.

gcloud-Funktionen beschreiben $FUNCTION_NAME – Region $REGION | grep kmsSchlüsselName

Funktion der 1. Generation testen

Sie können die Funktion testen, indem Sie einen curl-Befehl ausführen:

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')"

curl $FUNCTION_URL

Daraus ergibt sich Folgendes:

Hello World!

Solange der Verschlüsselungsschlüssel aktiviert ist, gibt die Funktion Erfolg an den Aufrufer zurück. Sobald der Verschlüsselungsschlüssel deaktiviert ist, erhält der Aufrufer jedoch eine Fehlermeldung.

Im nächsten Abschnitt erfahren Sie, was passiert, wenn Sie die Funktion aufrufen, nachdem der Schlüssel deaktiviert wurde.

9. Eine CMEK-verschlüsselte Funktion aufrufen, bei der der Verschlüsselungsschlüssel deaktiviert wurde

In diesem letzten Abschnitt entwerten Sie den Schlüssel und rufen die Funktion erneut auf, um den resultierenden Fehler anzuzeigen.

Verschlüsselungsschlüssel deaktivieren

Sie können diesen Befehl ausführen, um den Schlüssel zu 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

curl wiederholen Sie die Funktion.

curl $FUNCTION_URL

und Sie erhalten diesmal 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:

  • Quellcode der Funktion
  • Container-Image-Build aus Ihrem Quellcode

Wenn Sie beispielsweise den Tab „Quelle“ für die Cloud Functions-Funktion aufrufen, wird beim Abrufen des Archivs ein Fehler angezeigt. Sie erhalten einen ähnlichen Fehler, wenn Sie versuchen, die ZIP-Datei mit dem Quellcode direkt in Cloud Storage aufzurufen.

ac3307bb05d30e19.png

Außerdem sind Sie nicht berechtigt, das Container-Image für die Funktion von Artifact Registry zu verwenden. Wenn Sie beispielsweise versuchen, dieses Container-Image in Cloud Run bereitzustellen, erhalten Sie eine Fehlermeldung, dass das Image nicht gefunden wurde.

Eine vollständige Liste der verschlüsselten Ressourcen finden Sie in der Dokumentation zu CMEK-Funktionen.

10. Glückwunsch

Glückwunsch, du hast das Codelab abgeschlossen.

Behandelte Themen

  • CMEK-Schlüssel für einen 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: