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


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

Ziele

  • Sie richten einen GitHub-SSH-Schlüssel ein.
  • Sie fügen den öffentlichen SSH-Schlüssel zu den Bereitstellungsschlüsseln eines privaten Repository hinzu.
  • Sie speichern den privaten SSH-Schlüssel in Secret Manager.
  • Sie reichen einen Build ein, der auf den Schlüssel aus Secret Manager und damit auf das private Repository zugreift.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

  • Secret Manager
  • Cloud Build

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Optional: Arbeiten Sie die Kurzanleitung zu Secret Manager durch, um sich mit diesem Produkt vertraut zu machen.

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.

  1. 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 Upload 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 zum Zugriff auf Secret Manager erteilen.

  1. Öffnen Sie die Seite mit den Cloud Build-Einstellungen:

    Zur Seite mit den Cloud Build-Einstellungen

  2. Wählen Sie aus der Drop-down-Liste das Dienstkonto aus, dessen Rollen Sie ändern können.

  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 wo Sie Ihre Secrets gespeichert haben.
  • SECRET_NAME: der Name des von Ihnen erstellten Secrets in Secret Manager an.

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

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

So löschen Sie das Projekt:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Bereitstellungsschlüssel aus dem Repository entfernen

  1. Gehen Sie auf GitHub zur Repository-Hauptseite.

  2. Klicken Sie unter Ihrem Repository-Namen auf Einstellungen.

  3. Klicken Sie in der linken Seitenleiste auf Schlüssel bereitstellen.

  4. Suchen Sie auf der Seite Schlüssel bereitstellen nach den Bereitstellungsschlüsseln, die mit Ihrem Repository verknüpft sind, und klicken Sie auf Löschen.

Nächste Schritte