Sécurisez et stockez les données sensibles à l'aide du connecteur Secret Manager

Secret Manager est un système de stockage sécurisé et pratique pour les clés API, les mots de passe, les certificats et d'autres données sensibles. Secret Manager fournit un emplacement centralisé et un référentiel unique pour la gestion, la consultation et l'audit des secrets sur Google Cloud.

Vous pouvez utiliser le connecteur de Workflows pour l'API Secret Manager pour accéder à Secret Manager au sein d'un workflow. Cela simplifie l'intégration pour vous, car le connecteur gère la mise en forme des requêtes, et fournit des méthodes et des arguments qui vous évitent de connaître les détails de l'API Secret Manager. Le connecteur intègre également un comportement pour gérer les nouvelles tentatives et les opérations de longue durée. Pour en savoir plus sur l'utilisation des connecteurs Workflows, consultez la page Comprendre les connecteurs.

Accorder au compte de service Workflows l'accès à Secret Manager

Secret Manager utilise Identity and Access Management (IAM) pour le contrôle des accès. Pour créer, gérer ou répertorier un secret ou y accéder, vous devez accorder les autorisations IAM appropriées au niveau du projet et des ressources individuelles. Pour en savoir plus, consultez la page Contrôle des accès avec IAM.

Workflows utilise des comptes de service pour permettre aux workflows d'accéder aux ressources Google Cloud. Pour accéder à la version d'un secret, vous devez attribuer au compte de service le rôle d'accesseur de secrets Secret Manager (roles/secretmanager.secretAccessor) sur le secret, le projet, le dossier ou l'organisation. Découvrez comment déployer un workflow avec un compte de service géré par l'utilisateur.

Activer les API

Avant d'utiliser le connecteur de Workflows pour l'API Secret Manager, veillez à activer les API Secret Manager et Workflows.

Console

Activer les API

gcloud

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

Appeler un appel de connecteur

Comme pour l'appel d'un point de terminaison HTTP, un appel de connecteur nécessite les champs call et args. Pour plus d'informations, consultez la section Appeler un appel de connecteur.

En plus d'utiliser une étape d'appel, vous pouvez appeler les méthodes d'assistance dans une expression comme celle-ci:

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

Par exemple, vous pouvez utiliser la méthode d'assistance accessString pour récupérer les données du secret sous forme de chaîne. Cette méthode est plus simple que d'utiliser l'API access, car les données sur les secrets sont automatiquement décodées dans un format de chaîne.

Vous pouvez également utiliser la méthode d'assistance addVersionString pour ajouter une nouvelle valeur à un secret existant. Cette méthode est plus simple que d'utiliser l'API addVersion, car les données secrètes sont automatiquement encodées dans une chaîne en base64, requise par addVersion.

Récupérer un secret à l'aide du connecteur Secret Manager

Le workflow suivant montre comment récupérer un secret à l'aide du connecteur Secret Manager.

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

Étapes suivantes