Sécuriser et stocker 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 autres données sensibles. Il 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 Workflows connecteur 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 comporte également pour gérer les tentatives et les opérations de longue durée. Pour apprendre sur l'utilisation des connecteurs Workflows, consultez Découvrez 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. En savoir plus sur Déployer un workflow avec un compte de service géré par l'utilisateur

Activer les API

Avant d'utiliser les workflows le connecteur API Secret Manager, assurez-vous d'activer le Secret Manager et aux API 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 comme ceci:

${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 le secret données sous forme de chaîne. C'est plus simple que d'utiliser l'API access comme données de secret. est automatiquement décodée dans un format de chaîne.

Vous pouvez également utiliser la méthode d'assistance addVersionString pour ajouter une valeur de secret. à un secret existant. C'est plus simple que d'utiliser l'API addVersion en tant que les données secrètes sont automatiquement encodées en une 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 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