Proteggere e archiviare i dati sensibili utilizzando il connettore Secret Manager

Secret Manager è un sistema di archiviazione pratico e sicuro per chiavi API, password, certificati e altri dati sensibili. Secret Manager fornisce un posto centralizzato e un'unica fonte attendibile per gestire, accedere e controllare i secret in Google Cloud.

Puoi utilizzare il connettore di Workflows' per l'API Secret Manager per accedere a Secret Manager all'interno di un workflow. Questo semplifica l'integrazione, perché il connettore gestisce la formattazione delle richieste e fornisce metodi e argomenti in modo che tu non debba conoscere i dettagli dell'API Secret Manager. Il connettore ha anche un comportamento integrato per la gestione dei nuovi tentativi e delle operazioni a lunga esecuzione. Per saperne di più sull'utilizzo dei connettori di Workflows, consulta Informazioni sui connettori.

Concedere al account di servizio di Workflows l'accesso a Secret Manager

Secret Manager utilizza Identity and Access Management (IAM) per il controllo degli accessi. Per creare, gestire, elencare o accedere a un secret, è necessario concedere le autorizzazioni IAM appropriate a livello di progetto e di singola risorsa. Per ulteriori informazioni, consulta Controllo dell'accesso con IAM.

Workflows utilizza i service account per concedere ai workflow l'accesso alle Google Cloud risorse. Per accedere a una versione del secret, devi concedere al account di servizio il ruolo Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) sul secret, sul progetto, sulla cartella o sull' organizzazione. Scopri di più su deployment di un workflow con un service account gestito dall'utente.

Abilitare le API

Prima di utilizzare il connettore di Workflows per l'API Secret Manager, assicurati di abilitare le API Secret Manager e Workflows.

Console

Abilitare le API

gcloud

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

Richiamare una chiamata al connettore

Analogamente alla chiamata di un endpoint HTTP, una chiamata al connettore richiede i campi call e args. Per saperne di più, consulta Richiamare una chiamata al connettore.

Oltre a utilizzare un passaggio di chiamata, puoi chiamare i metodi helper in un'espressione come questa:

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

Ad esempio, puoi utilizzare il metodo helper accessString per recuperare i dati del secret come stringa. Questo è più semplice dell'utilizzo dell'API access, perché i dati del secret vengono decodificati automaticamente in un formato stringa.

Puoi anche utilizzare il metodo helper addVersionString per aggiungere un nuovo valore del secret a un secret esistente. Questo è più semplice dell'utilizzo dell'API addVersion, perché i dati del secret vengono codificati automaticamente in una stringa base64, richiesta da addVersion.

Recuperare un secret utilizzando il connettore Secret Manager

Il seguente workflow mostra come utilizzare il connettore Secret Manager per recuperare un secret.

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}"
      ]
    }
  }
]

Passaggi successivi