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 votre compilation pour accéder aux informations de Secret Manager.
Avant de commencer
-
Activer les API Cloud Build and Secret Manager.
Pour utiliser les exemples de ligne de commande de ce guide, installez et configurez la Google Cloud CLI.
Assurez-vous d'avoir stocké le secret dans Secret Manager. Pour obtenir des instructions, consultez la section Créer un secret.
- Notez le nom et la version du secret. Vous aurez besoin de ces informations pour configurer Cloud Build et lui permettre d'accéder au secret.
Autorisations IAM requises
Attribuez le rôle IAM Accesseur de secrets au gestionnaire de secrets (roles/secretmanager.secretAccessor
) pour le secret au compte de service Cloud Build:
Ouvrez la page Secret Manager dans la console Google Cloud:
Cochez la case correspondant au secret que vous souhaitez utiliser dans votre compilation.
S'il n'est pas déjà ouvert, cliquez sur Afficher le panneau d'informations pour ouvrir celui-ci.
Dans le panneau, sous Autorisations, cliquez sur Ajouter un compte principal.
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
correspond au numéro du projet dans lequel vous exécutez des compilations. Vous pouvez trouver ce numéro de projet sur la page Paramètres du projet.Dans la boîte déroulante Sélectionner un rôle, sélectionnez Accesseur de secrets Secret Manager.
Cliquez sur Enregistrer.
Configurer les compilations pour accéder à des secrets UTF-8 à partir de Secret Manager
Dans le répertoire racine de votre projet, créez un fichier de configuration de compilation nommé
cloudbuild.yaml
oucloudbuild.json
.Dans le fichier de configuration de compilation :
- Après toutes les étapes
steps
de la compilation, ajoutez un champavailableSecrets
spécifiant la version du secret et les variables d'environnement à utiliser pour votre secret. Vous pouvez inclure des variables de substitution dans la valeur du champsecretVersion
. Vous pouvez spécifier plusieurs secrets dans une compilation. - À l'étape de compilation où vous souhaitez spécifier le secret :
- Ajoutez un champ
entrypoint
pointant versbash
pour utiliser l'outil bash dans l'étape de compilation. Il est obligatoire pour faire référence à la variable d'environnement du secret. - Ajoutez un champ
secretEnv
spécifiant la variable d'environnement. - Dans le champ
args
, ajoutez une option-c
en tant que premier argument. Toutes les chaînes que vous transmettez après-c
sont traitées comme des commandes. Pour en savoir plus sur l'exécution des 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 précédée de$$
.
- Ajoutez un champ
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 Google Cloud dans lequel vous avez stocké vos secrets.DOCKER_USERNAME_SECRET_NAME
: nom du secret correspondant à votre nom d'utilisateur Docker. Vous pouvez obtenir le nom du secret sur la page Secret Manager dans la console Google Cloud.DOCKER_USERNAME_SECRET_VERSION
: version du secret de votre nom d'utilisateur Docker. Pour obtenir la version du secret, cliquez sur le nom d'un secret sur la page Secret Manager dans la console Google Cloud.DOCKER_PASSWORD_SECRET_NAME
: nom du secret correspondant à votre mot de passe Docker. Vous pouvez obtenir le nom du secret sur la page Secret Manager dans la console Google Cloud.DOCKER_PASSWORD_SECRET_VERSION
: version du secret de votre mot de passe Docker. Pour obtenir la version du secret, cliquez sur le nom d'un secret sur la page Secret Manager dans la console Google Cloud.
- Après toutes les étapes
Utilisez le fichier de configuration de compilation pour démarrer une compilation sur la ligne de commande ou pour automatiser les compilations à l'aide de déclencheurs.
Exemple: Accéder aux secrets à partir de scripts et de processus
Le champ secretEnv
ajoute la valeur du secret à l'environnement. Vous pouvez y accéder via une variable d'environnement à partir de scripts ou de processus:
YAML
steps:
- name: python:slim
entrypoint: python
args: ['main.py']
secretEnv: ['MYSECRET']
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
env: 'MYSECRET'
JSON
{
"steps": [
{
"name": "python:slim",
"entrypoint": "python",
"args": [
"main.py"
],
"secretEnv": [
"MYSECRET"
]
}
],
"availableSecrets": {
"secretManager": [
{
"versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
"env": "MYSECRET"
}
]
}
}
Le contenu suivant de main.py
affiche les cinq premiers caractères du secret:
import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")
Exemple : s'authentifier auprès de Docker
Dans certains cas, avant de pouvoir interagir avec des images Docker, votre compilation doit s'authentifier auprès de Docker. Par exemple, l'authentification Docker est nécessaire pour que les compilations puissent extraire des images privées et transférer des images privées ou publiques vers Docker Hub. Dans ces cas, vous pouvez stocker votre nom d'utilisateur et votre mot de passe Docker dans Secret Manager, puis configurer Cloud Build pour qu'il accède au nom d'utilisateur et au mot de passe à partir de Secret Manager. Pour obtenir des instructions à ce sujet, consultez la page Interagir avec les images Docker Hub.
Exemple : création d'une demande d'extraction GitHub
Un autre exemple qui peut nécessiter de configurer votre compilation pour accéder à des informations sensibles de Secret Manager, est le cas où vous voulez créer une demande d'extraction GitHub en réponse aux compilations. Procédez comme suit :
- Créez un jeton GitHub.
- Stockez le jeton GitHub dans Secret Manager.
- Dans le fichier de configuration de compilation :
- Après toutes les étapes
steps
de la compilation, ajoutez un champavailableSecrets
spécifiant la version du secret et la variable d'environnement à utiliser pour le jeton GitHub. - Ajoutez une étape de compilation pour appeler la commande permettant de créer une demande d'extraction GitHub.
- Après toutes les étapes
- Créez un déclencheur d'application GitHub et utilisez le fichier de configuration de compilation pour appeler le déclencheur.
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 Google 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, espace de nomshead
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 qui demande une fusion avec une base d'un autre dépôt.GH_TOKEN_SECRET_NAME
: nom du secret correspondant à votre jeton GitHub.NEW_PR
: nouvelle demande d'extraction que vous souhaitez créer.
Configurer les compilations pour accéder à des secrets non UTF-8 à partir de Secret Manager
Dans votre fichier de configuration de compilation, ajoutez une étape de compilation pour accéder à la version du secret dans Secret Manager et la stocker dans un fichier. L'étape de compilation suivante accède à secret-name et le stocke dans un fichier nommé decrypted-data.txt :
YAML
steps: - name: gcr.io/cloud-builders/gcloud entrypoint: 'bash' args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/gcloud", "entrypoint": "bash", "args": [ "-c", "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ] } ] }
Utilisez le fichier avec les données déchiffrées dans une étape de compilation. L'extrait de code suivant utilise decrypted-data.txt pour se connecter à un registre Docker privé :
YAML
steps: - name: gcr.io/cloud-builders/gcloud entrypoint: 'bash' args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ] - name: gcr.io/cloud-builders/docker entrypoint: 'bash' args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/gcloud", "entrypoint": "bash", "args": [ "-c", "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt" ] }, { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=my-user --password-stdin < decrypted-data.txt" ] } ] }
Utilisez le fichier de configuration de compilation pour démarrer une compilation sur la ligne de commande ou pour automatiser les compilations à l'aide de déclencheurs.
Étapes suivantes
- Découvrez comment utiliser des identifiants chiffrés dans les compilations.
- Découvrez comment accéder à des dépôts GitHub privés.