Utiliser les secrets de Secret Manager

Cette page explique comment inclure des informations sensibles telles que des mots de passe et des clés API dans Cloud Build.

Secret Manager est un service Google Cloud qui stocke de manière sécurisée des clés API, des mots de passe et d'autres données sensibles. Pour inclure des informations sensibles dans vos compilations, vous pouvez les stocker dans Secret Manager, puis configurer la compilation pour y accéder à partir de Secret Manager.

Avant de commencer

  • Activer les API Cloud Build and Secret Manager.

    Activer les API

  • Pour utiliser les exemples de ligne de commande de ce guide, installez et configurez le SDK Cloud.

  • Assurez-vous d'avoir stocké le secret dans Secret Manager. Pour obtenir des instructions, consultez la page sur la création de secrets.

    • Notez le nom et la version du secret. Vous en aurez besoin pour configurer Cloud Build afin d'accéder au secret.

Autorisations IAM requises

Attribuez au compte de service Cloud Build le rôle IAM Secret Secret Accessor (roles/secretmanager.secretAccessor) pour le secret:

  1. Ouvrez la page Secret Manager dans Google Cloud Console :

    Accéder à la page Secret Manager

  2. Cochez la case correspondant au secret que vous souhaitez utiliser dans votre build.

  3. S'il n'est pas déjà ouvert, cliquez sur Afficher le panneau d'informations pour l'ouvrir.

  4. Dans le panneau, sous Autorisations, cliquez sur Ajouter un compte principal.

  5. Dans la zone de texte Nouveaux comptes principaux, saisissez l'adresse e-mail de votre compte de service Cloud Build au format PROJECT_NUMBER@cloudbuild.gserviceaccount.com. PROJECT_NUMBER est le numéro du projet dans lequel vous exécutez des compilations. Vous trouverez le numéro de projet sur la page Paramètres du projet.

  6. Dans la liste déroulante Sélectionner un rôle, sélectionnez Accesseur de secret du gestionnaire de secrets.

  7. Cliquez sur Enregistrer.

Configurer des compilations pour accéder au secret depuis Secret Manager

  1. Dans le répertoire racine de votre projet, créez un fichier de configuration Cloud Build nommé cloudbuild.yaml ou cloudbuild.json.

  2. Dans le fichier de configuration de compilation :

    • Après toute la compilation steps, ajoutez un champ availableSecrets pour spécifier la version de secret et les variables d'environnement à utiliser pour votre secret. Vous pouvez inclure des variables de substitution dans la valeur du champ secretVersion. Vous pouvez spécifier plusieurs secrets dans une compilation.
    • À l'étape de compilation pour laquelle vous souhaitez spécifier le secret :
      • Ajoutez un champ entrypoint pointant vers bash pour utiliser l'outil bash à l'étape de compilation. Cette opération est nécessaire pour faire référence à la variable d'environnement relative au secret.
      • Ajoutez un champ secretEnv spécifiant la variable d'environnement.
      • Dans le champ args, ajoutez une option -c comme premier argument. Toute chaîne que vous transmettez après -c est traitée comme une commande. Pour en savoir plus sur l'exécution de commandes bash avec -c, consultez la documentation bash.
      • Lorsque vous spécifiez le secret dans le champ args, spécifiez-le à l'aide de la variable d'environnement avec le préfixe $$.

    L'exemple de fichier de configuration de compilation suivant montre comment se connecter à Docker à l'aide du nom d'utilisateur et du mot de passe Docker stockés dans Secret Manager.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Remplacez les valeurs d'espace réservé dans les commandes ci-dessus par les éléments suivants :

    • PROJECT_ID: ID du projet Cloud dans lequel vous avez stocké vos secrets.
    • DOCKER_USERNAME_SECRET_NAME: nom secret correspondant à votre nom d'utilisateur Docker. Vous pouvez obtenir le nom du secret sur la page Secret Manager de Cloud Console.
    • DOCKER_USERNAME_SECRET_VERSION: version secrète de votre nom d'utilisateur Docker. Vous pouvez obtenir la version d'un secret en cliquant sur son nom sur la page Secret Manager de Cloud Console.
    • DOCKER_PASSWORD_SECRET_NAME: nom secret correspondant à votre mot de passe Docker. Vous pouvez obtenir le nom du secret sur la page Secret Manager de Cloud Console.
    • DOCKER_PASSWORD_SECRET_VERSION: version secrète de votre mot de passe Docker. Vous pouvez obtenir la version d'un secret en cliquant sur son nom sur la page Secret Manager de Cloud Console.
  3. Vous pouvez utiliser le fichier de configuration de compilation pour démarrer manuellement une compilation ou pour automatiser les compilations à l'aide de déclencheurs.

Exemple: s'authentifier auprès de Docker

Dans certains cas, avant d'interagir avec des images Docker, votre build doit s'authentifier auprès de Docker. Par exemple, l'authentification Docker est requise pour les compilations qui récupèrent des images privées et transfèrent des images privées ou publiques vers Docker Hub. Dans ce cas, vous pouvez stocker votre nom d'utilisateur et votre mot de passe Docker dans Secret Manager, puis configurer Cloud Build pour accéder au nom d'utilisateur et au mot de passe à partir de Secret Manager. Pour obtenir des instructions sur cette opération, consultez la page Interagir avec les images Docker Hub.

Exemple: Création d'une demande d'extraction GitHub

Un autre exemple dans lequel vous souhaitez configurer votre compilation pour accéder à des informations sensibles de Secret Manager est de créer une demande d'extraction GitHub en réponse aux compilations. Procédez comme suit :

L'exemple de fichier de configuration suivant montre comment créer une demande d'extraction GitHub à l'aide du jeton GitHub:

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

Remplacez les valeurs d'espace réservé dans les commandes ci-dessus par les éléments suivants :

  • PROJECT_ID: ID du projet Cloud dans lequel vous avez stocké vos secrets.
  • GITHUB_USERNAME: nom d'utilisateur GitHub du propriétaire du dépôt.
  • REPO_NAME: nom du dépôt GitHub.
  • HEAD_BRANCH: nom de la branche dans laquelle les modifications sont mises en œuvre. Pour les demandes d'extraction inter-dépôts dans le même réseau, l'espace de noms head avec un utilisateur semblable à celui-ci: username:branch.
  • BASE_BRANCH: nom de la branche dans laquelle vous souhaitez intégrer les modifications. Il doit s'agir d'une branche existante du dépôt actuel. Vous ne pouvez pas envoyer de demande d'extraction à un dépôt pour demander une fusion avec la base d'un autre dépôt.
  • GH_TOKEN_SECRET_NAME: nom secret correspondant à votre jeton GitHub.
  • NEW_PR: nouvelle demande d'extraction que vous souhaitez créer.

Étape suivante