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

Secret Manager bietet eine sichere und bequeme Möglichkeit, API-Schlüssel, Passwörter, Zertifikate und andere sensible Daten zu speichern. Secret Manager können Sie Secrets in Google Cloud an einer zentralen Stelle und Single Source Of Truth verwalten, darauf zugreifen und prüfen.

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

Workflows-Dienstkonto Zugriff auf Secret Manager gewähren

Secret Manager verwendet für die Zugriffssteuerung Identity and Access Management (IAM). Um ein Secret zu erstellen, zu verwalten, aufzulisten oder aufzurufen, müssen die entsprechenden IAM-Berechtigungen auf Projektebene und auf Ebene der einzelnen Ressourcen gewährt werden. Weitere Informationen finden Sie unter Zugriffssteuerung mit IAM.

In Workflows werden Dienstkonten verwendet, um Workflows Zugriff auf Google Cloud-Ressourcen zu gewähren. Damit das Dienstkonto auf eine Secret-Version zugreifen kann, müssen Sie ihm die Rolle „Zugriffsperson für Secret Manager-Secret“ (roles/secretmanager.secretAccessor) für das Secret, Projekt, den Ordner oder die Organisation zuweisen. Weitere Informationen zum Bereitstellen eines Workflows mit einem benutzerverwalteten Dienstkonto

APIs aktivieren

Bevor Sie den Workflow-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

Connectoraufruf ausführen

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

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

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

Sie können beispielsweise die Hilfsmethode accessString verwenden, um die geheimen Daten als String abzurufen. Das ist einfacher als die Verwendung der access API, da die geheimen 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. Das ist einfacher als die Verwendung der addVersion API, da die geheimen Daten automatisch in einen Base64-String codiert werden, der für addVersion erforderlich ist.

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