Sécuriser et stocker des 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 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 dans 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 pour que vous n'ayez pas besoin de connaître les détails de l'API Secret Manager. Le connecteur dispose également d'un comportement intégré 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, répertorier ou accéder à un secret, les autorisations IAM appropriées doivent être accordées au niveau du projet et au niveau de la ressource individuelle. Pour en savoir plus, consultez la page Contrôle des accès avec IAM.

Workflows utilise des comptes de service pour accorder aux workflows un accès aux ressources Google Cloud. Pour accéder à une version de secret, vous devez attribuer au compte de service le rôle "Accesseur de secrets" de 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, assurez-vous d'activer les API Secret Manager et Workflows.

Console

Activer les API

gcloud

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

Appeler un connecteur

Comme pour l'appel d'un point de terminaison HTTP, un appel de connecteur nécessite des champs call et args. Pour en savoir plus, 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 secrètes sous forme de chaîne. Cette méthode est plus simple que d'utiliser l'API access, car les données secrètes sont automatiquement décodées au format chaîne.

Vous pouvez également utiliser la méthode d'assistance addVersionString pour ajouter une nouvelle valeur secrète à 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 en chaîne base64, ce qui est requis par addVersion.

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

Le workflow suivant montre comment utiliser le connecteur Secret Manager pour récupérer 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}"
      ]
    }
  }
]

Étape suivante