Secrets aus Secret Manager verwenden

Auf dieser Seite wird erläutert, wie Sie vertrauliche Informationen wie Passwörter und API-Schlüssel in Cloud Build einbinden.

Secret Manager ist ein Google Cloud-Dienst, der API-Schlüssel, Passwörter und andere sensible Daten sicher speichert. Wenn Sie vertrauliche Informationen in Builds aufnehmen möchten, können Sie die Informationen in Secret Manager speichern und dann den Build so konfigurieren, dass er auf die Informationen von Secret Manager zugreift.

Hinweis

  • Cloud Build and Secret Manager APIs aktivieren.

    Aktivieren Sie die APIs

  • Um die Befehlszeilenbeispiele in dieser Anleitung zu verwenden, installieren und konfigurieren Sie das Cloud SDK.

  • Speichern Sie das Secret in Secret Manager. Eine Anleitung finden Sie unter Secret erstellen.

    • Notieren Sie sich den Namen und die Secret-Version Ihres Secrets. Sie benötigen diese Informationen, um Cloud Build für den Zugriff auf das Secret zu konfigurieren.

Erforderliche IAM-Berechtigungen

Weisen Sie dem Cloud Build-Dienstkonto die IAM-Rolle Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) für das Secret zu:

  1. Öffnen Sie die Seite "Secret Manager" in der Google Cloud Console:

    Zur Seite „Secret Manager“

  2. Klicken Sie das Kästchen des Secrets an, das Sie in Ihrem Build verwenden möchten.

  3. Falls es noch nicht geöffnet ist, klicken Sie auf Infofeld ansehen, um es zu öffnen.

  4. Klicken Sie im Steuerfeld unter Berechtigungen auf Hauptkonto hinzufügen.

  5. Geben Sie im Textfeld Neue Hauptkonten die E-Mail-Adresse Ihres Cloud Build-Dienstkontos im Format PROJECT_NUMBER@cloudbuild.gserviceaccount.com ein. PROJECT_NUMBER ist die Projektnummer des Projekts, in dem Builds ausgeführt werden. Sie finden die Projektnummer auf der Seite mit den Projekteinstellungen.

  6. Wählen Sie im Drop-down-Menü Rolle auswählen die Option Zugriffsfunktion für Secret Manager-Secret aus.

  7. Klicken Sie auf Speichern.

Builds für den Zugriff auf das Secret über Secret Manager konfigurieren

  1. Erstellen Sie im Stammverzeichnis des Projekts eine Cloud Build-Konfigurationsdatei mit dem Namen cloudbuild.yaml oder cloudbuild.json.

  2. In der Build-Konfigurationsdatei:

    • Fügen Sie nach dem Build-steps ein availableSecrets-Feld hinzu, um die Secret-Version und die Umgebungsvariablen anzugeben, die für Ihr Secret verwendet werden sollen. Sie können Substitutionsvariablen in den Wert des Felds secretVersion aufnehmen. Sie können in einem Build mehrere Secrets angeben.
    • Im Build-Schritt, in dem Sie das Secret angeben möchten:
      • Fügen Sie das Feld entrypoint hinzu, das auf bash verweist, um das Bash-Tool im Build-Schritt zu verwenden. Dies ist erforderlich, um auf die Umgebungsvariable für das Secret zu verweisen.
      • Fügen Sie ein secretEnv-Feld hinzu, das die Umgebungsvariable angibt.
      • Fügen Sie im Feld args das Flag -c als erstes Argument hinzu. Jeder nach -c übergebene String wird als Befehl behandelt. Weitere Informationen zum Ausführen von Bash-Befehlen mit -c finden Sie in der Bash-Dokumentation.
      • Geben Sie das Secret mit der Umgebungsvariable $$ im Feld args an.

    Die folgende Build-Konfigurationsdatei im Beispiel zeigt, wie Sie sich mit dem in Secret Manager gespeicherten Docker-Nutzernamen und dem zugehörigen Passwort bei Docker anmelden.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Ersetzen Sie die Platzhalterwerte in den obigen Befehlen durch Folgendes:

    • PROJECT_ID: Die ID des Cloud-Projekts, in dem Sie Ihre Secrets gespeichert haben.
    • DOCKER_USERNAME_SECRET_NAME: Der Secret-Name, der Ihrem Docker-Nutzernamen entspricht. Sie finden den Secret-Namen in der Cloud Console auf der Seite Secret Manager.
    • DOCKER_USERNAME_SECRET_VERSION: Die Secret-Version Ihres Docker-Nutzernamens. Sie erhalten die Secret-Version, indem Sie in der Cloud Console auf der Seite Secret Manager auf einen Secret-Namen klicken.
    • DOCKER_PASSWORD_SECRET_NAME: Der Secret-Name, der Ihrem Docker-Passwort entspricht. Sie finden den Secret-Namen in der Cloud Console auf der Seite Secret Manager.
    • DOCKER_PASSWORD_SECRET_VERSION: Die Secret-Version Ihres Docker-Passworts. Sie erhalten die Secret-Version, indem Sie in der Cloud Console auf der Seite Secret Manager auf einen Secret-Namen klicken.
  3. Verwenden Sie die Build-Konfigurationsdatei, um einen Build manuell zu starten oder Builds mit Triggern zu automatisieren.

Beispiel: Bei Docker authentifizieren

In einigen Situationen muss sich Ihr Build vor der Interaktion mit Docker-Images bei Docker authentifizieren. Beispielsweise ist die Docker-Authentifizierung erforderlich, damit Builds private Images abrufen und private oder öffentliche Images an Docker Hub übertragen. In diesen Fällen können Sie Ihren Docker-Nutzernamen und das Passwort in Secret Manager speichern und dann Cloud Build für den Zugriff auf den Nutzernamen und das Passwort über Secret Manager konfigurieren. Eine Anleitung dazu finden Sie unter Mit Docker Hub-Images interagieren.

Beispiel: Erstellung einer GitHub-Pull-Anfrage

Ein weiteres Beispiel für eine Konfiguration Ihres Builds für den Zugriff auf vertrauliche Informationen von Secret Manager ist das Erstellen einer GitHub-Pull-Anfrage als Reaktion auf Builds. So gehen Sie dazu vor:

  • Erstellen Sie ein GitHub-Token.
  • Speichern Sie das GitHub-Token in Secret Manager.
  • Gehen Sie in Ihrer Build-Konfigurationsdatei so vor:
    • Fügen Sie nach dem Build-steps ein availableSecrets-Feld hinzu, um die Secret-Version und die Umgebungsvariable anzugeben, die für das GitHub-Token verwendet werden sollen.
    • Fügen Sie einen Build-Schritt hinzu, um den Befehl zum Erstellen einer GitHub-Pull-Anfrage aufzurufen.
  • Erstellen Sie einen GitHub-Anwendungstrigger und verwenden Sie die Build-Konfigurationsdatei, um den Trigger aufzurufen.

Die folgende Beispielkonfigurationsdatei zeigt, wie eine GitHub-Pull-Anfrage mit dem GitHub-Token erstellt wird:

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

Ersetzen Sie die Platzhalterwerte in den obigen Befehlen durch Folgendes:

  • PROJECT_ID: Die ID des Cloud-Projekts, in dem Sie Ihre Secrets gespeichert haben.
  • GITHUB_USERNAME: Der GitHub-Nutzername des Repository-Inhabers.
  • REPO_NAME: Der Name des GitHub-Repositorys.
  • HEAD_BRANCH: Der Name des Zweigs, in dem die Änderungen implementiert sind. Bei datenbankübergreifenden Pull-Anfragen im selben Netzwerk ist Namespace head mit einem Nutzer wie diesem angegeben: username:branch.
  • BASE_BRANCH: Der Name des Zweigs, in den die Änderungen übernommen werden sollen. Dies sollte ein vorhandener Zweig im aktuellen Repository sein. Sie können keine Pull-Anfrage an ein Repository senden, das eine Zusammenführung an eine Basis eines anderen Repositorys anfordert.
  • GH_TOKEN_SECRET_NAME: Der Secret-Name, der Ihrem GitHub-Token entspricht.
  • NEW_PR: Die neue Pull-Anfrage, die Sie erstellen möchten.

Nächste Schritte