Attestierung der Binärautorisierung in einer Cloud Build-Pipeline erstellen

In dieser Anleitung erfahren Sie, wie Sie eine Attestierung für die Binärautorisierung in einer Cloud Build-Pipeline erstellen. 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.

Wie Sie Scans auf Sicherheitslücken in Container Analysis in Ihrer Cloud Build-Build-Pipeline durchführen, finden Sie unter Attestierungen mit Voucher erstellen oder Attestierungen mit Kritis Signer erstellen.

Cloud Build – Übersicht

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.

Überblick zur 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: Cloud Build-Pipeline, die eine Attestierung der Binärautorisierung erstellt.

In dieser Pipeline gilt:

  1. Der Code zum Erstellen des Container-Images wird in ein Quell-Repository wie Cloud Source Repositories übertragen.

  2. Das CI-Tool (Continuous Integration) Cloud Build erstellt und testet den Container.

  3. Der Build überträgt das Container-Image per Push an Container Registry oder eine andere Registry, in der Ihre erstellten Images gespeichert sind.

  4. Cloud Key Management Service, der die Schlüsselverwaltung für das kryptografische Schlüsselpaar bereitstellt, signiert das Container-Image. Die resultierende Signatur wird dann in einer neu erstellten Attestierung gespeichert.

  5. Bei der Bereitstellung prüft der Attestierer die Attestierung mit dem öffentlichen Schlüssel aus dem Schlüsselpaar. Die Binärautorisierung erzwingt die Richtlinie. Dazu sind signierte Attestierungen zum Bereitstellen des Container-Images erforderlich.

Attestierung mit Cloud Build mit Cloud Key Management Service 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_ID}
    
  4. Rufen Sie die Projektnummer ab:

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --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_ID} \
      --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_ID} \
      --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_ID} \
      --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
    

Nächste Schritte