Cloud Build-Einbindung

Diese Seite bietet eine Übersicht über die Einrichtung der Binärautorisierung mit Cloud Build. Durch diese Einrichtung wird sichergestellt, dass nur Container-Images, die im Rahmen des Build-Prozesses von Cloud Build erstellt und signiert wurden, automatisch zur Ausführung in Ihrer Deployment-Umgebung autorisiert werden.

Informationen zum Hinzufügen von Scans auf Sicherheitslücken zu einer Build-Pipeline von Cloud Build finden Sie unter Scannen auf Sicherheitslücken mit Container Analysis und Kritis Signer.

Übersicht

Cloud Build

Cloud Build (Übersicht) verwendet in Cloud Source Repositories oder einem anderen gehosteten Repository gespeicherten Quellcode, führt Ihre Builds und Tests aus und speichert die resultierenden Softwareausgaben in Container Registry oder einem anderen Speicherdienst auf der Google Cloud Platform.

Binärautorisierung

Die Binärautorisierung (Übersicht) ist ein Google Cloud-Produkt, das Beschränkungen für Anwendungen beim Deployment erzwingt. Durch die Einbindung von Google Kubernetes Engine (GKE) können Nutzer erzwingen, dass Container, die in einem Kubernetes-Cluster bereitgestellt werden, von einer vertrauenswürdigen Instanz kryptografisch signiert und von einem Attestierer von Binärautorisierungen geprüft werden.

Sie können die Binärautorisierung so konfigurieren, dass auf dem Speicherort des Quellcodes basierende Attestierungen erforderlich sind, um zu verhindern, dass Container-Images aus nicht autorisierten Quellen bereitgestellt werden.

Weitere Informationen:

Architektur

Das folgende Diagramm zeigt die Komponenten in einer Einrichtung mit Binärautorisierung/Cloud Build:

Binärautorisierungs/Cloud Build-Attestierungspipeline
Abbildung 1: Diagramm einer Binärautorisierungs/Cloud Build-Attestierungspipeline

In Abbildung 1 wird (1) Code an ein Repository gesendet. (2) Eine CI-Pipeline (Continuous Integration) wie Cloud Build wird erstellt, die den Container testet. (3) Das neu erstellte Container-Image wird an Container Registry gesendet. (4) Der Cloud Key Management Service signiert das Container-Image, (5) erstellt eine Attestierung und speichert sie in der Binärautorisierung.

Die Komponenten sind:

  • Cloud Source Repositories oder ein anderes sicheres Repository, das den Quellcode zum Erstellen eines Container-Images enthält.

  • Cloud Build: Hier werden Builds und Tests ausgeführt, und das Container-Image wird in Container Registry oder einer anderen Software-Registry ausgegeben, in der Ihre erstellten Images gespeichert sind.

  • Container Registry: Eine private Container-Image-Registry, die in Google Cloud ausgeführt wird.

  • Cloud Key Management Service: Mit dieser Komponente können Schlüssel des kryptografischen Schlüsselpaars verwaltet werden. Das Schlüsselpaar besteht aus einem privaten und einem öffentlichen Schlüssel. Der private Schlüssel wird zum Signieren eines Container-Images verwendet. Die resultierende Signatur wird dann in einer neu erstellten Attestierung gespeichert. Zum Zeitpunkt des Deployments wird die Attestierung von einem Attestierer überprüft, der den öffentlichen Schlüssel aus dem Schlüsselpaar enthält.

  • Binärautorisierung: Erzwingt die Richtlinie, für die signierte Attestierungen erforderlich sind, bevor ein Container-Image bereitgestellt werden kann

Mit Cloud Build und Cloud Key Management Service eine Attestierung für die Binärautorisierung erstellen

In diesem Abschnitt erfahren Sie, wie Sie die obige Architektur implementieren. Sie verwendet einen benutzerdefinierten Open-Source-Build-Schritt aus der Cloud Build-Community. Der benutzerdefinierte Build-Schritt signiert ein Container-Image, erstellt die Attestierung und lädt sie in die Binärautorisierung hoch.

Identitäts- und Zugriffsverwaltung konfigurieren

Zur Verwendung dieses Build-Schritts benötigt das Cloud Build-Dienstkonto die folgenden IAM-Rollen:

  • Betrachter der Attestierer von Binärautorisierungen
    • roles/binaryauthorization.attestorsViewer
  • Cloud KMS CryptoKey-Signer/Prüffunktion (wenn Schlüssel in KMS zum Signieren der Attestierung verwendet werden)
    • roles/cloudkms.signerVerifier
  • Hinzufüger von Container Analysis-Hinweisen
    • roles/containeranalysis.notes.attacher

Mit den folgenden Befehlen können Sie diese Rollen dem Cloud Build-Dienstkonto Ihres Projekts hinzufügen:

  1. Aktivieren Sie Cloud Build:

    Aktivieren Sie die Cloud Build API im Cloud-Zielprojekt.

  2. Speichern Sie Ihre Projekt-ID in einer Umgebungsvariablen:

    PROJECT_ID=PROJECT_ID
    

    Dabei ist PROJECT_ID Ihre Google Cloud-Projekt-ID.

  3. Legen Sie das gcloud-Befehlszeilentool für das Projekt fest:

    gcloud config set project ${PROJECT}
    
  4. Rufen Sie die Projektnummer ab:

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT}" --format="value(PROJECT_NUMBER)")
    
  5. Fügen Sie dem Cloud Build-Dienstkonto die Rolle "Betrachter der Attestierer von Binärautorisierungen" hinzu:

    gcloud projects add-iam-policy-binding ${PROJECT} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/binaryauthorization.attestorsViewer
    
  6. Fügen Sie dem Cloud Build-Dienstkonto (KMS-basierte Signatur) die Rolle "Cloud KMS CryptoKey-Signer/Prüffunktion" hinzu:

    gcloud projects add-iam-policy-binding ${PROJECT} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Fügen Sie dem Cloud Build-Dienstkonto die Rolle "Hinzufüger von Container Analysis-Hinweisen" hinzu:

    gcloud projects add-iam-policy-binding ${PROJECT} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/containeranalysis.notes.attacher
    

Benutzerdefinierten Build-Schritt in Cloud Build erstellen und registrieren

  1. Klonen Sie das Repository der Google Cloud Build-Community:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. Konfigurieren Sie den Binärautorisierungs-Signer für Cloud Build:

    Vor der Verwendung muss der Code für den benutzerdefinierten Build-Schritt in einen Container eingebunden und an Cloud Build übertragen werden. Führen Sie dazu die folgenden Befehle aus:

    cd cloud-builders-community/binauthz-attestation
    gcloud builds submit . --config cloudbuild.yaml
    

    Der benutzerdefinierte Build-Schritt wurde in die Google Container Registry Ihres aktuellen Projekts übertragen und kann nun verwendet werden.

Attestierer in der Binärautorisierung erstellen

Erstellen Sie einen Attestierer, den die Binärautorisierung zur Bestätigung der Attestierung beim Deployment verwendet.

Richten Sie in der Binärautorisierung ein Schlüsselpaar für Cloud Key Management Service und den Attestierer ein:

Siehe Attestierer mit der Befehlszeile erstellen.

Erstellung des Attestierers prüfen

   gcloud --project="${ATTESTOR_PROJECT_ID}" container binauthz attestors list
   

Fügen Sie Ihrem cloudbuild.yaml einen Schritt zum Erstellen einer Attestierung ("create-attestation") hinzu.

Zur Verwendung des Schritts binauthz-attestation müssen Sie cloudbuild.yaml aktualisieren. Fügen Sie dazu den Schritt hinzu, über den der in Container Registry übertragene Build signiert wird.

Es gibt zwei Methoden:

  • Aktualisieren Sie die Datei cloudbuild.yaml manuell.

  • Führen Sie eine Beispielpipeline mit den zuvor festgelegten Umgebungsvariablen aus.

Datei cloudbuild.yaml manuell aktualisieren

  1. Sie müssen die Datei cloudbuild.yaml manuell aktualisieren. Dazu fügen Sie den Build-Schritt unten nach dem Schritt zum Hochladen des Containers in Container Registry hinzu. Hinweis: Sie müssen ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME und KMS_KEY_VERSION manuell durch Ihre eigenen Werte ersetzen:

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'projects/${PROJECT_ID}/attestors/ATTESTOR_NAME'
        - '--keyversion'
        - 'projects/${PROJECT_ID}/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION'
    

    Folgendes ist ebenfalls gültig:

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'ATTESTOR_NAME'
        - '--attestor-project'
        - '${PROJECT_ID}'
        - '--keyversion'
        - 'KEY_VERSION'
        - '--keyversion-project'
        - '${PROJECT_ID}'
        - '--keyversion-location'
        - 'KEY_LOCATION'
        - '--keyversion-keyring'
        - 'KEYRING_NAME'
        - '--keyversion-key'
        - 'KEY_NAME'
    

[Optional] Pipeline testen

Führen Sie die folgenden Schritte aus, um ein Beispiel für eine Cloud Build-Attestierungspipeline zu testen:

  1. Erstellen Sie eine cloudbuild.yaml-Datei mit den zuvor festgelegten Umgebungsvariablen:

    cd example
    cat <<EOM > cloudbuild_example.yaml
    steps:
      - id: 'build'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'build'
          - '-t'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '.'
      - id: 'publish'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'push'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
      - id: 'create-attestation'
        name: 'gcr.io/$PROJECT_ID/binauthz-attestation:latest'
        args:
          - '--artifact-url'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '--attestor'
          - 'projects/$PROJECT_ID/attestors/${ATTESTOR_NAME}'
          - '--keyversion'
          - 'projects/${PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}'
    tags: ['cloud-builders-community']
    
    EOM
    
  2. Führen Sie Cloud Build mit der Beispieldatei cloudbuild_example.yaml aus:

    Führen Sie im Verzeichnis cloud-builders-community/binauthz-attestation/example die folgenden Befehle aus:

    gcloud builds submit . --config cloudbuild_example.yaml
    

Weitere Informationen