Accesso a GitHub da una build tramite chiavi SSH


Questo tutorial mostra come utilizzare Secret Manager con Cloud Build per accedere a repository GitHub privati da una build. Secret Manager è un servizio Google Cloud che archivia in modo sicuro chiavi API, password e altri dati sensibili.

Obiettivi

  • Configurare una chiave SSH GitHub.
  • Aggiungi la chiave SSH pubblica alle chiavi di deployment di un repository privato.
  • Archivia la chiave SSH privata in Secret Manager.
  • Invia una build che acceda alla chiave da Secret Manager e la utilizzi per accedere al repository privato.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • Secret Manager
  • Cloud Build

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Cloud Build and Secret Manager.

    Abilita le API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  8. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  9. Abilita le API Cloud Build and Secret Manager.

    Abilita le API

  10. Installa Google Cloud CLI.
  11. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  12. Facoltativo. Completa la guida rapida di Secret Manager per acquisire familiarità con questo prodotto.

Crea una chiave SSH

  1. Apri una finestra del terminale.

  2. Crea una nuova directory denominata workingdir e accedi alla directory:

    mkdir workingdir
    cd workingdir
    
  3. Crea una nuova chiave SSH GitHub, dove github-email è il tuo indirizzo email GitHub:

    ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
    

    Il comando crea una nuova chiave SSH workingdir/id_github senza passphrase per la chiave SSH. Cloud Build non può utilizzare la chiave SSH se è protetto con una passphrase.

Archivia la chiave SSH privata in Secret Manager

Quando crei una chiave SSH, nel tuo ambiente viene creato un file id_github. Poiché chiunque può eseguire l'autenticazione nel tuo account con questo file, devi archiviare il file in Secret Manager prima di utilizzarlo in una build.

  1. Per archiviare la chiave SSH in Secret Manager:

    1. Vai alla pagina di Secret Manager nella console Google Cloud:

      Vai alla pagina di Secret Manager

    2. Nella pagina Secret Manager, fai clic su Create Secret (Crea secret).

    3. Nella pagina Crea secret, in Nome, inserisci un nome per il secret.

    4. Nel campo Valore secret, fai clic su Carica e carica il file workingdir/id_github.

    5. Lascia invariata la sezione Regioni.

    6. Fai clic sul pulsante Crea secret.

Il file id_github verrà caricato su Secret Manager.

Aggiungi la chiave SSH pubblica alle chiavi di deployment del repository privato

  1. Accedi a GitHub.

  2. Nell'angolo in alto a destra, fai clic sulla tua foto del profilo, quindi su Il tuo profilo.

  3. Nella pagina del tuo profilo, fai clic su Repositories, quindi sul nome del repository.

  4. Dal repository, fai clic su Impostazioni.

  5. Nella barra laterale, fai clic su Deploy Keys (Esegui il deployment delle chiavi), quindi su Add deployment key (Aggiungi chiave di deployment).

  6. Specifica un titolo, incolla la tua chiave SSH pubblica da workingdir/id_github.pub.

  7. Seleziona Consenti accesso in scrittura se vuoi che questa chiave abbia accesso in scrittura al repository. Una chiave di deployment con accesso in scrittura consente al deployment di eseguire il push nel repository.

  8. Fai clic su Aggiungi chiave.

  9. Elimina la chiave SSH dal disco:

    rm id_github*
    

Concedi le autorizzazioni

Devi concedere l'account di servizio di Cloud Build per accedere a Secret Manager durante la build.

  1. Apri la pagina IAM nella console Google Cloud:

    Apri la pagina IAM

  2. Seleziona il progetto e fai clic su Apri.

  3. Nella tabella delle autorizzazioni, individua l'email che termina con @cloudbuild.gserviceaccount.com e fai clic sull'icona a forma di matita.

  4. Aggiungi il ruolo Secret Manager Secret Accessor.

  5. Fai clic su Salva.

Aggiungere la chiave SSH pubblica agli host noti

La maggior parte delle macchine contiene un file denominato known_hosts, che contiene chiavi note per gli host remoti. Spesso le chiavi vengono raccolte dagli host remoti quando ci si connette per la prima volta, ma possono anche essere aggiunte manualmente. Le chiavi in questo file vengono utilizzate per verificare l'identità dell'host remoto e proteggere dal furto d'identità.

Affinché Cloud Build possa connettersi a GitHub, devi aggiungere la chiave SSH pubblica al file known_hosts nell'ambiente di build di Cloud Build. Per farlo, aggiungi la chiave a un file known_hosts.github temporaneo, quindi copia il contenuto di known_hosts.github nel file known_hosts nell'ambiente di compilazione di Cloud Build.

Nella directory workingdir, crea un file denominato known_hosts.github e aggiungi la chiave SSH pubblica a questo file:

ssh-keyscan -t rsa github.com > known_hosts.github

Nella sezione successiva, quando configurerai la build, aggiungerai istruzioni nel file di configurazione di Cloud Build per copiare i contenuti di known_hosts.github nel file known_hosts nell'ambiente di build di Cloud Build.

Configura la build

Per configurare la build:

  1. Crea un file di configurazione di compilazione denominato cloudbuild.yaml in due passaggi: il primo passaggio gcloud consente di accedere alla chiave SSH in Secret Manager e la salva come id_rsa in un volume denominato ssh, insieme a una copia del known_hosts.github. Il volume viene utilizzato per memorizzare in modo permanente i file tra i passaggi di build. Il secondo passaggio git utilizza la chiave in id_rsa per connettersi al repository in 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'
    

Sostituisci i valori segnaposto nei comandi riportati sopra con quanto segue:

  • GIT_USERNAME: il nome utente GitHub del proprietario del repository.
  • GIT_REPOSITORY: il nome del repository GitHub a cui vuoi accedere.
  • PROJECT_ID: l'ID del progetto Google Cloud in cui hai archiviato i tuoi secret.
  • SECRET_NAME: il nome del secret che hai creato in Secret Manager.

Per scoprire di più sulle stringhe multilinea YAML utilizzate nello snippet precedente, consulta YAML multilinea.

Invia la build

Per inviare la build, esegui questo comando:

gcloud builds submit --config=cloudbuild.yaml .

L'output è simile al seguente:

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

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina la chiave di deployment dal repository

  1. Su GitHub, vai alla pagina principale del repository.

  2. Sotto il nome del repository, fai clic su Impostazioni.

  3. Nella barra laterale sinistra, fai clic su Esegui il deployment delle chiavi.

  4. Nella pagina Esegui il deployment delle chiavi, cerca le chiavi di deployment associate al tuo repository e fai clic su Elimina.

Passaggi successivi