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


In dieser Anleitung wird gezeigt, wie Sie Secret Manager mit Cloud Build verwenden, um aus einem Build auf private GitHub-Repositories zuzugreifen. 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. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Cloud Build and Secret Manager APIs aktivieren.

    Aktivieren Sie die APIs

  5. Installieren Sie die Google Cloud CLI.
  6. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  7. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  8. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  9. Cloud Build and Secret Manager APIs aktivieren.

    Aktivieren Sie die APIs

  10. Installieren Sie die Google Cloud CLI.
  11. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    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 Cloud Build-Dienstkonto die Berechtigung erteilen, während des Builds auf Secret Manager zuzugreifen.

  1. Öffnen Sie in der Google Cloud Console die Seite „IAM“:

    IAM-Seite öffnen

  2. Wählen Sie Ihr Projekt aus und klicken Sie auf Öffnen.

  3. Suchen Sie in der Berechtigungstabelle nach der E-Mail mit der Endung @cloudbuild.gserviceaccount.com und klicken Sie auf das Stiftsymbol.

  4. Fügen Sie die Rolle Secret Manager Secret Accessor hinzu.

  5. Klicken Sie auf Speichern.

Ö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 in 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 in 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. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

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