Sensible Daten mit dem Secret Manager-Connector schützen und speichern

Secret Manager ist ein sicheres und praktisches Speichersystem für API-Schlüssel, Passwörter, Zertifikate und andere sensible Daten. Secret Manager bietet eine zentrale Stelle und Single Source Of Truth für die Verwaltung, den Zugriff und das Audit von Secrets in Google Cloud.

Sie können den Workflows-Connector für die Secret Manager API verwenden, um innerhalb eines Workflows auf Secret Manager zuzugreifen. Das vereinfacht die Einbindung, da der Connector die Formatierung von Anfragen übernimmt und Methoden und Argumente bereitstellt, sodass Sie die Details der Secret Manager API nicht kennen müssen. Der Connector verfügt auch über ein integriertes Verhalten für die Verarbeitung von Wiederholungsversuchen und lang andauernden Vorgängen. Weitere Informationen zur Verwendung von Workflows-Connectors finden Sie unter Informationen zu Connectors.

Dem Workflows-Dienstkonto Zugriff auf Secret Manager gewähren

Secret Manager verwendet Identity and Access Management (IAM) für die Zugriffssteuerung. Damit Sie ein Secret erstellen, verwalten, auflisten oder aufrufen können, müssen die entsprechenden IAM-Berechtigungen auf Projektebene und auf der jeweiligen Ressourcenebene gewährt werden. Weitere Informationen finden Sie unter Zugriffssteuerung mit IAM.

Workflows verwendet Dienstkonten, um Workflows Zugriff auf Google Cloud-Ressourcen zu gewähren. Wenn Sie auf eine Secret-Version zugreifen möchten, müssen Sie dem Dienstkonto die Rolle „Secret Manager-Secret-Zugriffer“ (roles/secretmanager.secretAccessor) für das Secret, das Projekt, den Ordner oder die Organisation zuweisen. Weitere Informationen finden Sie unter Workflow mit einem nutzerverwalteten Dienstkonto bereitstellen.

APIs aktivieren

Bevor Sie den Workflows-Connector für die Secret Manager API verwenden, müssen Sie die Secret Manager API und die Workflows API aktivieren.

Console

APIs aktivieren

gcloud

  gcloud services enable secretmanager.googleapis.com workflows.googleapis.com

Connector-Aufruf aufrufen

Ähnlich wie beim Aufrufen eines HTTP-Endpunkts sind für einen Connector-Aufruf die Felder call und args erforderlich. Weitere Informationen finden Sie unter Connector-Aufruf aufrufen.

Sie können nicht nur einen Aufrufschritt verwenden, sondern auch die Hilfsmethoden in einem Ausdruck wie folgt aufrufen:

${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}

Sie können beispielsweise die Hilfsmethode accessString verwenden, um die Secret-Daten als String abzurufen. Dies ist einfacher als die Verwendung der access API, da die Secret-Daten automatisch in ein Stringformat decodiert werden.

Sie können auch die Hilfsmethode addVersionString verwenden, um einem vorhandenen Secret einen neuen Secret-Wert hinzuzufügen. Dies ist einfacher als die Verwendung der addVersion API, da die Secret-Daten automatisch zu einem Base64-String codiert werden, der von addVersion benötigt wird.

Secret mit dem Secret Manager-Connector abrufen

Im folgenden Workflow wird gezeigt, wie Sie mit dem Secret Manager-Connector ein Secret abrufen.

YAML

# This workflow demonstrates how to use the Secret Manager connector:
# Retrieve a secret using three different methods
# Expected output: the secret data (thrice)
- init:
    assign:
      - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
      - secret_id: "test-secret"  # Make sure you have this secret and it has a version of 1.
      - version: "1"
# Add data to an existing secret without base-64 encoding
- add_version_string:
    call: googleapis.secretmanager.v1.projects.secrets.addVersionString
    args:
      secret_id: ${secret_id}
      project_id: ${project_id}
      data: "a new secret"
# Retrieve the secret in string format without base-64 decoding and assume
# that the secret data is a valid UTF-8 string; if not, raise an error
- access_string_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
    args:
      secret_id: ${secret_id}
      version: ${version}  # if not set, "latest" is used
      project_id: ${project_id}
    result: str_secret
# Retrieve the secret in string format without base-64 decoding
- access_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.access
    args:
      name: ${"projects/" + project_id + "/secrets/" + secret_id + "/versions/" + version}
    result: base64_encoded_secret
# Retrieve the secret using positional arguments in an expression
- expression:
    assign:
      - secret_str_from_exp: ${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}
- the_end:
    return:
      - ${str_secret}
      - ${text.decode(base64.decode(base64_encoded_secret.payload.data))}
      - ${secret_str_from_exp}

JSON

[
  {
    "init": {
      "assign": [
        {
          "project_id": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}"
        },
        {
          "secret_id": "test-secret"
        },
        {
          "version": "1"
        }
      ]
    }
  },
  {
    "add_version_string": {
      "call": "googleapis.secretmanager.v1.projects.secrets.addVersionString",
      "args": {
        "secret_id": "${secret_id}",
        "project_id": "${project_id}",
        "data": "a new secret"
      }
    }
  },
  {
    "access_string_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.accessString",
      "args": {
        "secret_id": "${secret_id}",
        "version": "${version}",
        "project_id": "${project_id}"
      },
      "result": "str_secret"
    }
  },
  {
    "access_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.access",
      "args": {
        "name": "${\"projects/\" + project_id + \"/secrets/\" + secret_id + \"/versions/\" + version}"
      },
      "result": "base64_encoded_secret"
    }
  },
  {
    "expression": {
      "assign": [
        {
          "secret_str_from_exp": "${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}"
        }
      ]
    }
  },
  {
    "the_end": {
      "return": [
        "${str_secret}",
        "${text.decode(base64.decode(base64_encoded_secret.payload.data))}",
        "${secret_str_from_exp}"
      ]
    }
  }
]

Nächste Schritte