Von einem Build über SSH-Schlüssel auf GitHub zugreifen

In dieser Anleitung erfahren Sie, wie Sie mit Secret Manager und Cloud Build auf private GitHub in einem Build zugreifen. Secret Manager ist ein Google Cloud -Dienst, der API-Schlüssel, Passwörter und andere sensible Daten sicher speichert.

SSH-Schlüssel erstellen

  1. Öffnen Sie ein Terminalfenster.

  2. Erstellen Sie ein neues Verzeichnis mit dem Namen workingdir und rufen Sie dieses Verzeichnis auf:

    mkdir workingdir
    cd workingdir
    
  3. Erstellen Sie einen neuen GitHub-SSH-Schlüssel, wobei github-email Ihre GitHub-E-Mail-Adresse ist:

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

    Dieser Befehl erstellt einen neuen SSH-Schlüssel workingdir/id_github ohne Passphrase für Ihren SSH-Schlüssel. Cloud Build unterstützt keine mit Passphrases geschützte SSH-Schlüssel.

Privaten SSH-Schlüssel in Secret Manager speichern

Wenn Sie einen SSH-Schlüssel erstellen, wird in Ihrer Umgebung die id_github-Datei erzeugt. Da sich jeder mit dieser Datei bei Ihrem Konto authentifizieren kann, müssen Sie die Datei in Secret Manager speichern, bevor Sie sie in einem Build verwenden können.

So speichern Sie den SSH-Schlüssel in Secret Manager:

  1. Rufen Sie in der Google Cloud Console die Seite „Secret Manager“ auf:

    Zur Seite „Secret Manager“

  2. Klicken Sie auf der Seite Secret Manager auf Secret erstellen.

  3. Geben Sie auf der Seite Secret erstellen unter Name einen Namen für das Secret ein.

  4. Klicken Sie im Feld Secret-Wert auf Hochladen und laden Sie die Datei workingdir/id_github hoch.

  5. Lassen Sie den Abschnitt Regionen unverändert.

  6. Klicken Sie auf Secret erstellen.

Dadurch wird Ihre id_github-Datei in Secret Manager hochgeladen.

Öffentlichen SSH-Schlüssel zu Bereitstellungsschlüsseln eines privaten Repository hinzufügen

  1. Melden Sie sich bei GitHub an.

  2. Klicken Sie rechts oben auf Ihr Profilbild und dann auf Mein Profil.

  3. Klicken Sie auf Ihrer Profilseite auf Repositories und dann auf den Namen Ihres Repository.

  4. Klicken Sie im Repository auf Einstellungen.

  5. Klicken Sie in der Seitenleiste auf Schlüssel bereitstellen und dann auf Bereitstellungsschlüssel hinzufügen.

  6. Geben Sie einen Titel an und fügen Sie Ihren öffentlichen SSH-Schlüssel aus workingdir/id_github.pub ein.

  7. Wählen Sie Schreibzugriff zulassen aus, wenn dieser Schlüssel Schreibzugriff auf das Repository haben soll. Mit einem Bereitstellungsschlüssel mit Schreibzugriff kann eine Bereitstellung an das Repository übertragen werden.

  8. Klicken Sie auf Schlüssel hinzufügen.

  9. Löschen Sie den SSH-Schlüssel von Ihrem Laufwerk:

    rm id_github*
    

Berechtigungen erteilen

Sie müssen dem Dienstkonto, das Sie für den Build verwenden, die Berechtigung für den Zugriff auf Secret Manager erteilen.

  1. Rufen Sie in der Google Cloud -Console die Seite Cloud Build Berechtigungen auf:

    Zur Seite „Berechtigungen“

  2. Wählen Sie in der Drop-down-Liste das Dienstkonto aus, dessen Rollen Sie ändern möchten.

  3. Setzen Sie den Status der Rolle Secret Manager Secret Accessor auf Aktivieren.

Öffentlichen SSH-Schlüssel zu bekannten Hosts hinzufügen

Die meisten Rechner haben eine Datei namens known_hosts, die bekannte Schlüssel für Remote-Hosts enthält. Die Schlüssel werden häufig von den Remote-Hosts erfasst, wenn zum ersten Mal eine Verbindung zu ihnen hergestellt wird, sie können aber auch manuell hinzugefügt werden. Die Schlüssel in dieser Datei werden verwendet, um die Identität des Remote-Hosts zu verifizieren und vor Identitätsdiebstahl zu schützen.

Damit Cloud Build eine Verbindung zu GitHub herstellen kann, müssen Sie der Datei known_hosts in der Build-Umgebung von Cloud Build den öffentlichen SSH-Schlüssel hinzufügen. Dazu fügen Sie den Schlüssel einer temporären known_hosts.github-Datei hinzu und kopieren dann den Inhalt von known_hosts.github in die known_hosts-Datei in der Build-Umgebung von Cloud Build.

Erstellen Sie im Verzeichnis workingdir eine Datei mit dem Namen known_hosts.github und fügen Sie der Datei den öffentlichen SSH-Schlüssel hinzu:

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

Im nächsten Abschnitt fügen Sie der Cloud Build-Konfigurationsdatei Anweisungen hinzu, um den Inhalt von known_hosts.github in die Datei known_hosts in der Build-Umgebung von Cloud Build zu kopieren.

Build konfigurieren

So konfigurieren Sie den Build:

  1. Erstellen Sie eine Build-Konfigurationsdatei mit dem Namen cloudbuild.yaml in zwei Schritten: Der erste gcloud-Schritt greift in Secret Manager auf den SSH-Schlüssel zu und speichert ihn als id_rsa in einem Volume namens ssh zusammen mit einer Kopie von known_hosts.github. Das Volume dient als nichtflüchtiger Speicher für in den Build-Schritten verwendete Dateien. Im dritten git-Schritt wird der Schlüssel in id_rsa verwendet, um eine Verbindung zum Repository unter git@github.com:git-username/git-repository herzustellen.

    # 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'
    

Ersetzen Sie die Platzhalterwerte in den obigen Befehlen durch Folgendes:

  • GIT_USERNAME: Der GitHub-Nutzername des Repository-Inhabers.
  • GIT_REPOSITORY: Der Name des GitHub-Repositorys, auf das Sie zugreifen möchten.
  • PROJECT_ID: Die ID des Google Cloud -Projekts, in dem Sie Ihre Secrets gespeichert haben.
  • SECRET_NAME: Der Name des Secrets, das Sie im Secret Manager erstellt haben.

Informationen zu mehrzeiligen YAML-Strings, die im obigen Snippet verwendet werden, finden Sie unter YAML-Multilinie.

Build einreichen

Führen Sie den folgenden Befehl aus, um den Build zu senden:

gcloud builds submit --config=cloudbuild.yaml .

Die Ausgabe sieht etwa so aus:

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