Ce tutoriel explique comment utiliser Secret Manager avec Cloud Build pour accéder à des dépôts GitHub privés à partir d'une compilation. 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.
Créer une clé SSH
Ouvrez une fenêtre de terminal.
Créez un répertoire nommé
workingdir
et accédez-y :mkdir workingdir cd workingdir
Créez une clé SSH GitHub, où github-email correspond à votre adresse e-mail GitHub :
ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
Cette commande crée une clé SSH
workingdir/id_github
sans phrase secrète pour votre clé SSH. Cloud Build ne peut pas utiliser votre clé SSH si elle est protégée par une phrase secrète.
Stocker la clé SSH privée dans Secret Manager
Lorsque vous créez une clé SSH, un fichier id_github
est créé dans votre environnement. Dans la mesure où tout le monde peut s'authentifier sur votre compte à l'aide de ce fichier, vous devez le stocker dans Secret Manager avant de l'utiliser dans une compilation.
Pour stocker votre clé SSH dans Secret Manager :
Accédez à la page Secret Manager dans la console Google Cloud :
Sur la page Secret Manager, cliquez sur Créer un secret.
Sur la page Créer un secret, sous Nom, saisissez le nom du secret.
Dans le champ Valeur du secret, cliquez sur Importer, puis importez votre fichier
workingdir/id_github
.Ne modifiez pas la section Régions.
Cliquez sur le bouton Créer un secret.
Le fichier id_github
est alors importé dans Secret Manager.
Ajouter la clé SSH publique aux clés de déploiement de votre dépôt privé
Connectez-vous à GitHub.
Dans l'angle supérieur droit, cliquez sur votre photo de profil, puis sur Your profile (Votre profil).
Sur la page de votre profil, cliquez sur Repositories (Dépôts), puis sur le nom de votre dépôt.
Dans votre dépôt, cliquez sur Settings (Paramètres).
Dans la barre latérale, cliquez sur Deploy Keys (Clés de déploiement), puis sur Add deploy key (Ajouter une clé de déploiement).
Définissez un titre et collez votre clé SSH publique à partir de
workingdir/id_github.pub
.Sélectionnez Autoriser l'accès en écriture si vous souhaitez que cette clé dispose d'un accès en écriture au dépôt. Une clé de déploiement disposant d'un accès en écriture permet de déployer un déploiement dans le dépôt.
Cliquez sur Ajouter une clé.
Supprimez la clé SSH de votre disque :
rm id_github*
Octroyer des autorisations
Vous devez accorder l'autorisation d'accéder à Secret Manager au compte de service que vous utilisez pour la compilation.
-
Dans la console Google Cloud , accédez à la page Autorisations settings Cloud Build :
Dans la liste déroulante, sélectionnez le compte de service dont vous souhaitez modifier les rôles.
Définissez l'état du rôle
Secret Manager Secret Accessor
sur Activé.
Ajouter la clé SSH publique aux hôtes connus
La plupart des machines comportent un fichier nommé known_hosts
, qui contient les clés connues des hôtes distants. Les clés sont souvent collectées à partir des hôtes distants lors de leur première connexion, mais elles peuvent également être ajoutées manuellement. Les clés de ce fichier permettent de vérifier l'identité de l'hôte distant et de vous protéger contre l'usurpation d'identité.
Pour que Cloud Build se connecte à GitHub, vous devez ajouter la clé SSH publique au fichier known_hosts
dans l'environnement de compilation de Cloud Build. Pour ce faire, ajoutez la clé à un fichier known_hosts.github
temporaire, puis copiez le contenu de known_hosts.github
dans le fichier known_hosts
de l'environnement de compilation de Cloud Build.
Dans votre répertoire workingdir
, créez un fichier nommé known_hosts.github
et ajoutez la clé SSH publique à ce fichier :
ssh-keyscan -t rsa github.com > known_hosts.github
Dans la section suivante, lorsque vous configurerez la compilation, vous ajouterez des instructions dans le fichier de configuration Cloud Build pour copier le contenu de known_hosts.github
dans le fichier known_hosts
de l'environnement de compilation Cloud Build.
Configurer la compilation
Pour configurer la compilation, procédez comme suit :
Créez un fichier de configuration de compilation nommé
cloudbuild.yaml
en deux étapes: la première étapegcloud
accède à la clé SSH dans Secret Manager et l'enregistre en tant queid_rsa
dans un volume nomméssh
, ainsi qu'une copie deknown_hosts.github
. Le volume est utilisé pour conserver les fichiers pendant les étapes de compilation. La deuxième étapegit
utilise la clé dansid_rsa
pour se connecter au dépôt à l'emplacementgit@github.com:git-username/git-repository
.# Access the id_github file from Secret Manager, and setup SSH steps: - name: 'gcr.io/cloud-builders/git' secretEnv: ['SSH_KEY'] entrypoint: 'bash' args: - -c - | echo "$$SSH_KEY" >> /root/.ssh/id_rsa chmod 400 /root/.ssh/id_rsa cp known_hosts.github /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh # Clone the repository - name: 'gcr.io/cloud-builders/git' args: - clone - --recurse-submodules - git@github.com:GIT_USERNAME/GIT_REPOSITORY volumes: - name: 'ssh' path: /root/.ssh availableSecrets: secretManager: - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest env: 'SSH_KEY'
Remplacez les valeurs d'espace réservé dans les commandes ci-dessus par les éléments suivants :
GIT_USERNAME
est le nom d'utilisateur GitHub du propriétaire du dépôt.GIT_REPOSITORY
: nom du dépôt GitHub auquel vous souhaitez accéder.PROJECT_ID
: ID du Google Cloud projet dans lequel vous avez stocké vos secrets.SECRET_NAME
: nom du secret que vous avez créé dans Secret Manager.
Pour en savoir plus sur les chaînes YAML multilignes utilisées dans l'extrait ci-dessus, consultez la page Multiligne YAML.
Envoyer la compilation
Pour envoyer la compilation, exécutez la commande suivante :
gcloud builds submit --config=cloudbuild.yaml .
Le résultat ressemble à ce qui suit :
Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"
FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][ 3.9 KiB/ 3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487 XXXX-XX-XXT17:57:21+00:00 13S gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz - SUCCESS