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 una posizione centralizzata e un'unica fonte attendibile per gestire, accedere e controllare i secret in Google Cloud.

Puoi utilizzare il connettore Workflows per l'API Secret Manager per accedere a Secret Manager all'interno di un flusso di lavoro. Ciò semplifica l'integrazione in quanto il connettore gestisce la formattazione delle richieste e fornisce metodi e argomenti in modo che non sia necessario 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 scoprire di più sull'utilizzo dei connettori Workflows, consulta Informazioni sui connettori.

Concedi all'account di servizio Workflows l'accesso a Secret Manager

Secret Manager utilizza Identity and Access Management (IAM) per il controllo dell'accesso. 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 gli account di servizio per concedere ai flussi di lavoro l'accesso alle risorse Google Cloud. Per accedere a una versione del secret, devi concedere il ruolo Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) di Secret Manager all'account di servizio. Scopri di più sull'esecuzione del deployment di un flusso di lavoro con un account di servizio gestito dall'utente.

Abilita le API

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

Console

Abilita le API

gcloud

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

Richiamare una chiamata connettore

Analogamente alla chiamata di un endpoint HTTP, una chiamata connettore richiede i campi call e args. Per ulteriori informazioni, consulta Richiamare una chiamata connettore.

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

${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 rispetto all'utilizzo dell'API access, poiché 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 rispetto all'utilizzo dell'API addVersion, poiché i dati secret vengono automaticamente codificati in una stringa base-64, richiesta da addVersion.

Recupera un secret utilizzando il connettore Secret Manager

Il seguente flusso di lavoro mostra come utilizzare il connettore di Secret Manager per recuperare un secret.

YAML

# This workflow demonstrates how to use the Cloud Secret Manager connector to.
# retrieve a secret.
# Expected successful output: the secret data.

- 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"
# We provide a helper method to add a secret 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"
# We provide a helper method to access the secret in string format without base-64 decoding.
# To compare the usage between accessRaw() and access(), we list two demo steps to retrieve
# the same secret below.
#
# accessString assumes the secret data is a valid UTF-8 string and if it detects non-UTF-8
# bytes, an error will be raised.
- access_string_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
    args:
      secret_id: ${secret_id}
      version: ${version}  # If not set, "latest" will be used.
      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
# Secret can also be retrieved by 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}
      - ${secret_str_from_exp}
      - ${text.decode(base64.decode(base64_encoded_secret.payload.data))}

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}",
        "${secret_str_from_exp}",
        "${text.decode(base64.decode(base64_encoded_secret.payload.data))}"
      ]
    }
  }
]

Passaggi successivi