Secret Manager mit Python verwenden

1. Übersicht

In diesem Codelab konzentrieren Sie sich auf die Verwendung von Secret Manager in Python.

Mit Secret Manager können Sie Secrets als binäre Blobs oder Textstrings speichern, verwalten und darauf zugreifen. Mit den entsprechenden Berechtigungen können Sie den Inhalt des Secrets aufrufen.

Secret Manager eignet sich gut zum Speichern von Konfigurationsinformationen wie Datenbankpasswörtern, API-Schlüsseln oder TLS-Zertifikaten, die von einer Anwendung zur Laufzeit benötigt werden.

Lerninhalte

  • Cloud Shell verwenden
  • Secret Manager-Clientbibliothek für Python installieren
  • Secrets mit der Python-Clientbibliothek erstellen und darauf zugreifen
  • Mit der Python-Clientbibliothek auf Secrets in Cloud Functions zugreifen

Voraussetzungen

Umfrage

Wie werden Sie diese Anleitung verwenden?

Nur lesen Lesen und Übungen durchführen

Wie würden Sie Ihre Erfahrung mit Python bewerten?

Anfänger Mittelstufe Fortgeschrittene

Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können ihn jederzeit aktualisieren.
  • Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und ist unveränderlich (kann nach der Festlegung nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (sie wird in der Regel als PROJECT_ID angegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen versuchen und sehen, ob es verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Wenn Sie Ressourcen herunterfahren möchten, damit Ihnen nach Abschluss dieser Anleitung keine Kosten mehr in Rechnung gestellt werden, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Nutzer von Google Cloud kommen für das Programm für kostenlose Testversionen mit einem Guthaben von 300$ infrage.

Cloud Shell starten

Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Cloud Shell aktivieren

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

55efc1aaa7a4d3ad.png

Wenn Sie die Cloud Shell zuvor noch nicht gestartet haben, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter. So sieht dieses Fenster aus:

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Auf dieser virtuellen Maschine sind alle Entwicklungstools installiert, 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 oder Ihrem Chromebook erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.

  1. 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`
  1. Führen Sie den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass 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. Secret Manager API aktivieren

Bevor Sie die Secret Manager API verwenden können, müssen Sie sie aktivieren. Mit Cloud Shell können Sie die API mit dem folgenden Befehl aktivieren:

gcloud services enable secretmanager.googleapis.com

Die Ausgabe sollte in etwa so aussehen:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

4. Secret Manager-Clientbibliothek für Python installieren

Installieren Sie die Secret Manager-Clientbibliothek:

pip3 install --user google-cloud-secret-manager==2.10.0

5. Interaktives Python starten

In dieser Anleitung verwenden Sie einen interaktiven Python-Interpreter namens IPython, der in Cloud Shell vorinstalliert ist. Starten Sie eine Sitzung, indem Sie ipython in Cloud Shell ausführen:

ipython

Auf dem Bildschirm sollte Folgendes zu sehen sein:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

6. Secrets erstellen

Ein Secret enthält eine oder mehrere Secret-Versionen. Sie können mit der gcloud-Befehlszeile oder mit Python erstellt werden.

Wenn Sie ein Secret verwenden möchten, müssen Sie es zuerst mit dem Namen des Secrets erstellen. Anschließend fügen Sie eine Version des Secrets hinzu, die den Wert des Secrets enthält.

Legen Sie Ihre Projekt-ID in IPython fest:

PROJECT_ID = "<PROJECT_ID>"

Secret erstellen

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

from google.cloud import secretmanager

def create_secret(secret_id):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent project.
    parent = f"projects/{PROJECT_ID}"

    # Build a dict of settings for the secret
    secret = {'replication': {'automatic': {}}}

    # Create the secret
    response = client.create_secret(secret_id=secret_id, parent=parent, secret=secret)

    # Print the new secret name.
    print(f'Created secret: {response.name}')   

Rufen Sie die Funktion auf, um ein neues Secret mit dem Namen my_secret_value zu erstellen:

create_secret("my_secret_value")

Es sollte folgende Ausgabe angezeigt werden:

Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value

Secret-Version hinzufügen

Nachdem das Secret vorhanden ist, können Sie ihm einen Wert zuweisen, indem Sie eine Version erstellen.

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

def add_secret_version(secret_id, payload):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent secret.
    parent = f"projects/{PROJECT_ID}/secrets/{secret_id}"

    # Convert the string payload into a bytes. This step can be omitted if you
    # pass in bytes instead of a str for the payload argument.
    payload = payload.encode('UTF-8')

    # Add the secret version.
    response = client.add_secret_version(parent=parent, payload={'data': payload})

    # Print the new secret version name.
    print(f'Added secret version: {response.name}')   

Rufen Sie die Funktion auf, um eine neue Secret-Version hinzuzufügen:

add_secret_version("my_secret_value", "Hello Secret Manager")

Es sollte folgende Ausgabe angezeigt werden:

Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1

Secrets können mehrere Versionen haben. Rufen Sie die Funktion noch einmal mit einem anderen Wert auf:

add_secret_version("my_secret_value", "Hello Again, Secret Manager")

Es sollte folgende Ausgabe angezeigt werden:

Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2

Die neue Version unseres Secrets ist deutlich länger als das Original. Auf dieses Attribut wird später verwiesen.

7. Auf Secrets zugreifen

Beim Zugriff auf eine Secret-Version werden die Secret-Inhalte sowie zusätzliche Metadaten zur Secret-Version zurückgegeben. Wenn Sie auf eine Secret-Version zugreifen, können Sie entweder eine bestimmte Version angeben oder einfach die neueste Version anfordern, indem Sie „latest“ angeben.

Secrets sollten geheim gehalten werden. Speichern Sie Datenbankanmeldedaten als Secrets und verwenden Sie sie dann zur Authentifizierung oder speichern Sie Zertifikate und verwenden Sie sie. Geben Sie Ihre Secrets jedoch nicht direkt aus, da dies den Zweck, sie geheim zu halten, zunichtemacht.

Sie führen Vorgänge für unsere Secrets aus und bewerten ihren Wert, ohne sie direkt auszugeben. Stattdessen wird ein Hash des Werts des Secrets ausgegeben.

Kopieren Sie den folgenden Code in Ihre IPython-Sitzung:

def access_secret_version(secret_id, version_id="latest"):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the secret version.
    name = f"projects/{PROJECT_ID}/secrets/{secret_id}/versions/{version_id}"

    # Access the secret version.
    response = client.access_secret_version(name=name)

    # Return the decoded payload.
    return response.payload.data.decode('UTF-8')
    
import hashlib

def secret_hash(secret_value): 
  # return the sha224 hash of the secret value
  return hashlib.sha224(bytes(secret_value, "utf-8")).hexdigest()

Rufen Sie die Funktion auf, um das Secret als Hash seines Werts abzurufen:

secret_hash(access_secret_version("my_secret_value"))

Die Ausgabe sollte einem Hash ähneln (der genaue Wert stimmt möglicherweise nicht mit dieser Ausgabe überein):

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

Da Sie keine Version angegeben haben, wurde der letzte Wert abgerufen.

Rufen Sie die Funktion auf und fügen Sie die erwartete Versionsnummer hinzu, um die Bestätigung zu erhalten:

secret_hash(access_secret_version("my_secret_value", version_id=2))

Die Ausgabe sollte dieselbe sein wie beim letzten Befehl:

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

Rufen Sie die Funktion noch einmal auf, geben Sie diesmal aber die erste Version an:

secret_hash(access_secret_version("my_secret_value", version_id=1))

Diesmal sollte ein anderer Hash angezeigt werden, was auf eine andere Ausgabe hinweist:

9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177

8. Secret Manager mit Cloud Functions verwenden

Sie können Secrets in vielen Bereichen von Google Cloud verwenden. In diesem Abschnitt konzentrieren Sie sich auf Cloud Functions, das ereignisgesteuerte serverlose Computing-Angebot von Google.

Wenn Sie Python in Cloud Functions verwenden möchten, können Sie das Codelab für HTTP-Google Cloud Functions in Python durcharbeiten.

Schließen Sie IPython, indem Sie die Funktion exit aufrufen:

exit

Sie sollten zu Ihrer Cloud Shell zurückkehren:

yourname@cloudshell:~ (<PROJECT_ID>)$

Bevor Sie die Cloud Functions API verwenden können, müssen Sie sie aktivieren. Mit Cloud Shell können Sie die API mit dem folgenden Befehl aktivieren:

gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com

Erstellen Sie einen neuen Ordner, um unsere Funktion zu erstellen, und leere Dateien, in die geschrieben werden soll:

mkdir secret-manager-api-demo
cd secret-manager-api-demo
touch main.py
touch requirements.txt

Öffnen Sie den Code-Editor oben rechts in Cloud Shell:

7651a97c51e11a24.png

Rufen Sie die Datei main.py im Ordner secret-manager-api-demo auf. Hier fügen Sie Ihren gesamten Code ein.

9. Cloud-Funktion für den Zugriff auf Secrets schreiben

Das Speichern und Abrufen von Secret-Werten über die Befehlszeile oder das IPython-Terminal ist zwar nützlich, aber es ist viel nützlicher, auf diese Secrets innerhalb einer Funktion zugreifen zu können.

Sie können die zuvor erstellte access_secret_version-Funktion als Grundlage für Ihre Cloud-Funktion verwenden.

Kopieren Sie den folgenden Code in die Datei main.py:

main.py

import os

from google.cloud import secretmanager

project_id = os.environ["PROJECT_ID"]

client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/my_secret_value/versions/latest"
response = client.access_secret_version(name=name)
my_secret_value = response.payload.data.decode("UTF-8")


def secret_hello(request):
    if "Again" in my_secret_value:
        return "We meet again!\n"

    return "Hello there.\n"

Bevor Sie Ihre Funktion bereitstellen können, müssen Sie die Einrichtung der Umgebung abschließen. Dazu müssen Sie die Funktionsabhängigkeit einrichten.

Erstellen Sie eine neue Datei mit dem Namen requirements.txt und fügen Sie ihr das Paket google-cloud-secret-manager hinzu:

requirements.txt

google-cloud-secret-manager==2.10.0

Sie sollten jetzt einen Ordner haben, der nur eine main.py und eine requirements.txt enthält.

Zugriff auf Ihr Secret gewähren

Bevor Sie Ihre Funktion bereitstellen können, müssen Sie Cloud Functions den Zugriff auf Ihr Secret erlauben.

Wechseln Sie zurück zum Terminal:

c5b686edf94b5222.png

Gewähren Sie dem Cloud Functions-Dienstkonto Zugriff auf Ihr Secret:

export PROJECT_ID=$(gcloud config get-value core/project)

gcloud secrets add-iam-policy-binding my_secret_value \
    --role roles/secretmanager.secretAccessor \
    --member serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com

Es sollte folgende Ausgabe angezeigt werden:

Updated IAM policy for secret [my_secret_value].
bindings:
- members:
  - serviceAccount:<PROJECT_ID>@appspot.gserviceaccount.com
  role: roles/secretmanager.secretAccessor
etag: BwWiRUt2oB4=
version: 1

10. Cloud Functions-Funktion bereitstellen

Nachdem Sie die Einrichtung in den vorherigen Abschnitten abgeschlossen haben, können Sie Ihre Cloud-Funktion jetzt bereitstellen und testen.

Stellen Sie die Funktion in dem Ordner bereit, der nur die beiden von Ihnen erstellten Dateien enthält:

gcloud functions deploy secret_hello \
    --runtime python39 \
    --set-env-vars PROJECT_ID=${PROJECT_ID} \
    --trigger-http \
    --allow-unauthenticated

Es sollte folgende Ausgabe angezeigt werden (gekürzt):

Deploying function (may take a while - up to 2 minutes)...done.

...

entryPoint: secret_hello
httpsTrigger:
  url: https://<REGION>-<PROJECT_ID>.cloudfunctions.net/secret_hello
...
status: ACTIVE
...

Rufen Sie die URL Ihrer Funktion (httpsTrigger.url-Metadaten) mit dem folgenden Befehl ab:

FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')

Testen Sie nun, ob auf die Funktion mit dem erwarteten Rückgabewert zugegriffen werden kann, indem Sie Ihre Funktion aufrufen:

curl $FUNCTION_URL

Es sollte folgende Ausgabe angezeigt werden:

We meet again!

Diese Funktion verweist auf die neueste Version des Secrets, die den String „Again“ enthält. Die Funktion funktioniert also wie erwartet.

11. Glückwunsch!

Sie haben gelernt, wie Sie die Secret Manager API mit Python verwenden.

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

  • Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.
  • Wählen Sie in der Projektliste Ihr Projekt aus und klicken Sie auf Löschen.
  • Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Weitere Informationen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.