Accéder à GitHub à partir d'une compilation via des clés SSH


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.

Objectifs

  • Configurer une clé GitHub SSH.
  • Ajoutez la clé SSH publique aux clés de déploiement d'un dépôt privé.
  • Stockez la clé SSH privée dans Secret Manager.
  • Envoyez une compilation qui accède à la clé depuis Secret Manager et l'utilise pour accéder au dépôt privé.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • Secret Manager
  • Cloud Build

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activer les API Cloud Build and Secret Manager.

    Activer les API

  5. Installez Google Cloud CLI.
  6. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  7. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  8. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  9. Activer les API Cloud Build and Secret Manager.

    Activer les API

  10. Installez Google Cloud CLI.
  11. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  12. Facultatif. Suivez le guide de démarrage rapide de Secret Manager pour vous familiariser avec ce produit.

Créer une clé SSH

  1. Ouvrez une fenêtre de terminal.

  2. Créez un répertoire nommé workingdir et accédez-y :

    mkdir workingdir
    cd workingdir
    
  3. 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.

  1. Pour stocker votre clé SSH dans Secret Manager :

    1. Accédez à la page Secret Manager dans la console Google Cloud :

      Accéder à la page Secret Manager

    2. Sur la page Secret Manager, cliquez sur Créer un secret.

    3. Sur la page Créer un secret, sous Nom, saisissez le nom du secret.

    4. Dans le champ Valeur du secret, cliquez sur Importer, puis importez votre fichier workingdir/id_github.

    5. Ne modifiez pas la section Régions.

    6. 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é

  1. Connectez-vous à GitHub.

  2. Dans l'angle supérieur droit, cliquez sur votre photo de profil, puis sur Your profile (Votre profil).

  3. Sur la page de votre profil, cliquez sur Repositories (Dépôts), puis sur le nom de votre dépôt.

  4. Dans votre dépôt, cliquez sur Settings (Paramètres).

  5. 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).

  6. Définissez un titre et collez votre clé SSH publique à partir de workingdir/id_github.pub.

  7. 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.

  8. Cliquez sur Ajouter une clé.

  9. Supprimez la clé SSH de votre disque :

    rm id_github*
    

Octroyer des autorisations

Vous devez accorder au compte de service Cloud Build l'autorisation d'accéder à Secret Manager pendant la compilation.

  1. Ouvrez la page "IAM" dans la console Google Cloud:

    Ouvrir la page IAM

  2. Sélectionnez votre projet et cliquez sur Ouvrir.

  3. Dans le tableau des autorisations, recherchez l'e-mail se terminant par @cloudbuild.gserviceaccount.com, puis cliquez sur l'icône en forme de crayon.

  4. Ajoutez un rôle Secret Manager Secret Accessor.

  5. Cliquez sur Enregistrer.

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 :

  1. Créez un fichier de configuration de compilation nommé cloudbuild.yaml en deux étapes: la première étape gcloud accède à la clé SSH dans Secret Manager et l'enregistre en tant que id_rsa dans un volume nommé ssh, ainsi qu'une copie de known_hosts.github. Le volume est utilisé pour conserver les fichiers pendant les étapes de compilation. La deuxième étape git utilise la clé dans id_rsa pour se connecter au dépôt à l'emplacement git@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 projet Google Cloud 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

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer la clé de déploiement du dépôt

  1. Sur GitHub, accédez à la page principale du dépôt.

  2. Sous le nom de votre dépôt, cliquez sur Paramètres.

  3. Dans la barre latérale gauche, cliquez sur Deploy keys (Clés de déploiement).

  4. Sur la page Deploy keys (Clés de déploiement), recherchez les clés de déploiement associées à votre dépôt, puis cliquez sur Delete (Supprimer).

Étapes suivantes