SLSA-Prüfung verwenden

Auf dieser Seite erfahren Sie, wie Sie mit der CV-SLSA-Prüfung (Continuous Validation) für die Binärautorisierung die SLSA-konforme Herkunft von Container-Images prüfen, die mit auf GKE-Clustern (Google Kubernetes Engine) ausgeführten Pods verknüpft sind, für die CV aktiviert ist.

Für diese Prüfung müssen Sie Images mit Cloud Build erstellen, um eine SLSA-konforme Herkunft zu erzeugen.

Im Beispiel in dieser Anleitung werden Cloud Source Repositories für das Quellcode-Repository, Artifact Registry für die Image-Registry und Cloud Build verwendet, um das Image zu erstellen und die Herkunft zu erzeugen.

Der einzige vertrauenswürdige Builder, der von der SLSA-Prüfung unterstützt wird, ist Cloud Build.

Kosten

In diesem Leitfaden werden folgende Google Cloud-Dienste verwendet.

  • Artifact Registry
  • Binärautorisierung, aber CV ist in der Vorschauphase kostenlos.
  • Cloud Build
  • Cloud Source Repositories
  • GKE

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

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. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  6. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  11. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  12. Prüfen Sie, ob die gcloud CLI auf die neueste Version aktualisiert ist.
  13. Installieren Sie das kubectl-Befehlszeilentool
  14. Wenn sich Ihre Richtlinien für die Binärautorisierung und GKE-Cluster in verschiedenen Projekten befinden, muss die Binärautorisierung in beiden Projekten aktiviert sein.

Erforderliche Rollen

In diesem Abschnitt erfahren Sie, wie Sie Rollen für diese Prüfung festlegen.

Übersicht

Wenn Sie alle in dieser Anleitung erwähnten Produkte im selben Projekt ausführen, müssen Sie keine Berechtigungen festlegen. Die Binärautorisierung konfiguriert die Rollen korrekt, wenn Sie sie aktivieren. Wenn Sie die Produkte in verschiedenen Projekten ausführen, müssen Sie Rollen festlegen, wie in diesem Abschnitt beschrieben.

Um sicherzustellen, dass der Dienst-Agent für die Binärautorisierung in jedem Projekt die erforderlichen Berechtigungen zur Auswertung der CV-SLSA-Prüfung hat, bitten Sie Ihren Administrator, dem Dienst-Agent für die Binärautorisierung in jedem Projekt die folgenden IAM-Rollen zu gewähren:

  • Artifact Registry-Leser (roles/artifactregistry.reader) für das Compute Engine-Dienstkonto des Clusterprojekts
  • Wenn sich Ihr Clusterprojekt vom Richtlinienprojekt unterscheidet: Bewerter für Richtlinien für Binärautorisierungen (roles/binaryauthorization.policyEvaluator) im Dienst-Agent für die Binärautorisierung für das Clusterprojekt, um auf das Richtlinienprojekt zuzugreifen
  • Wenn sich Ihr Attestierungsprojekt von Ihrem Richtlinienprojekt unterscheidet: Betrachter von Container Analysis-Vorkommen (roles/containeranalysis.occurrences.viewer) für den Dienst-Agent für Binärautorisierungen des Richtlinienprojekts, damit er auf das Attestierungsprojekt zugreifen kann

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Ihr Administrator kann möglicherweise auch dem Dienst-Agent für die Binärautorisierung in jedem Projekt die erforderlichen Berechtigungen über benutzerdefinierte Rollen oder andere vordefinierte Rollen erteilen.

Rollen mit der gcloud CLI gewähren

Damit die Dienstkonten in jedem Projekt die erforderlichen Berechtigungen zum Auswerten dieser Prüfung haben, erteilen Sie den Dienstkonten in jedem Projekt die folgenden IAM-Rollen:

  1. Wenn sich das Projekt, in dem Sie den Cluster ausführen, von dem Projekt unterscheidet, in dem sich die Richtlinie befindet, müssen Sie dem Dienst-Agent für die Binärautorisierung des Clusterprojekts die Berechtigung erteilen, auf die Richtlinie im Richtlinienprojekt zuzugreifen.

    1. Rufen Sie den Dienst-Agent für die Binärautorisierung des Clusterprojekts ab:

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:CLUSTER_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      CLUSTER_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
      

      Ersetzen Sie CLUSTER_PROJECT_ID durch die Projekt-ID des Clusters.

    2. CV die Bewertung der Richtlinie im Cluster erlauben:

      gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
          --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \
          --role='roles/binaryauthorization.policyEvaluator'
      

      Ersetzen Sie POLICY_PROJECT_ID durch die ID des Projekts, das Ihre Richtlinie enthält.

  2. Gewähren Sie dem Dienst-Agent des Richtlinienprojekts Zugriff auf Attestierungen:

    1. Rufen Sie den Dienst-Agent für die Binärautorisierung ab, der dem Richtlinienprojekt zugeordnet ist:

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:POLICY_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      POLICY_PROJECT_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
      

      Ersetzen Sie POLICY_PROJECT_ID durch die ID des Projekts, das Ihre Richtlinie enthält.

    2. Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding ATTESTATION_PROJECT_ID \
          --member="serviceAccount:$POLICY_PROJECT_SERVICE_ACCOUNT" \
          --role='roles/containeranalysis.occurrences.viewer'
      

      Ersetzen Sie ATTESTATION_PROJECT_ID durch die ID des Projekts, das Ihre Attestierungen enthält.

  3. Gewähren Sie dem Compute Engine-Standarddienstkonto die Berechtigung, das Image aus dem Repository abzurufen:

    1. Rufen Sie das Compute Engine-Dienstkonto ab, das mit dem Clusterprojekt verknüpft ist:

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:CLUSTER_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      COMPUTE_ENGINE_SERVICE_ACCOUNT="$PROJECT_NUMBER-compute@developer.gserviceaccount.com"
      

      Ersetzen Sie CLUSTER_PROJECT_ID durch die ID des Cluster-Projekts, das Ihre Plattformrichtlinie enthält.

    2. Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
          --member="serviceAccount:$COMPUTE_ENGINE_SERVICE_ACCOUNT" \
          --role='roles/artifactregistry.reader'
      

      Ersetzen Sie ARTIFACT_PROJECT_ID durch die ID des Artifact Registry-Projekts, in dem die bereitzustellenden Images gespeichert sind.

Optional: Beispiel-Image erstellen und hochladen

Dieser Abschnitt dient nur zu Veranschaulichungszwecken und zeigt, wie Sie ein Beispiel-Image mit SLSA-konformer Herkunft erstellen. Die Provenienz wird später im Leitfaden zur Veranschaulichung der Prüfung verwendet. Weitere Informationen zur Cloud Build-Herkunft

Beispiel-Repository erstellen

So erstellen Sie ein Repository in Cloud Source Repositories:

  1. Erstellen Sie das Repository und klonen Sie es lokal:

    gcloud source repos create SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    gcloud source repos clone SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    cd SOURCE_REPO_NAME
    

    Ersetzen Sie Folgendes:

    • SOURCE_REPO_NAME: der Name Ihres Quellcode-Repositorys, z. B. slsa-check-test-repo
    • SOURCE_REPO_PROJECT_ID: die Projekt-ID des Repositories
  2. So erstellen Sie die Quell-, Konfigurations- und Build-Dateien:

    1. Erstellen Sie die Bildquelle:

      cat > quickstart.sh <<EOF
      #!/bin/sh
      echo "Hello, world! The time is $(date)."
      sleep infinity
      EOF
      
    2. Machen Sie die Datei ausführbar:

      chmod +x quickstart.sh
      
    3. Erstellen Sie die Dockerfile-Konfigurationsdatei:

      cat > Dockerfile <<EOF
      FROM alpine
      COPY quickstart.sh /
      CMD ["/quickstart.sh"]
      EOF
      
    4. Erstellen Sie die Cloud Build-Datei cloudbuild.yaml, über die das Image in die Artifact Registry übertragen wird:

      cat > cloudbuild.yaml <<EOF
      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE', '.' ]
      options:
        requestedVerifyOption: VERIFIED
      images:
      - 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE'
      EOF
      

      Ersetzen Sie Folgendes:

      • LOCATION: Artifact Registry-Standort, z. B. us-west2, europe-central2 oder asia-east1
      • ARTIFACT_PROJECT_ID: die ID des Projekts, in dem Artifact Registry-Artefakte gespeichert werden
      • ARTIFACT_REPO_NAME: Name des Artifact Registry-Repositorys, z. B. slsa-check-test-repo
      • DIRECTORY: das Verzeichnis, z. B. slsa-check
      • IMAGE: der Pfad zum Image, z. B. slsa-check-image
    5. Führen Sie einen Commit der Dateien in Cloud Source Repositories aus:

      git add .
      git commit -a
      

Beispiel-Image erstellen und hochladen

Zur Vereinfachung der Verwendung dieser Anleitung empfehlen wir, dasselbe Projekt für SOURCE_REPO_PROJECT_ID und ARTIFACT_PROJECT_ID zu verwenden. Wenn Sie verschiedene Projekte verwenden, müssen Sie möglicherweise zusätzliche IAM-Berechtigungen einrichten. Weitere Informationen zur Zugriffssteuerung in Artifact Registry Weitere Informationen zu Cloud Build finden Sie unter Cloud Build.

So erstellen Sie das Repository:

  1. Erstellen Sie das Artifact Registry-Repository:

    gcloud artifacts repositories create ARTIFACT_REPO_NAME \
        --project=ARTIFACT_PROJECT_ID \
        --repository-format=docker \
        --location=LOCATION \
        --description="Docker repository"
    

    Ersetzen Sie Folgendes:

    • ARTIFACT_REPO_NAME: der Name Ihres Repositorys
    • ARTIFACT_PROJECT_ID: die Projekt-ID des Artefakts
    • LOCATION: Artifact Registry-Standort, z. B. us-west2, europe-central2 oder asia-east1
  2. Erstellen Sie den Cloud Build-Trigger:

    gcloud beta builds triggers create cloud-source-repositories \
        --project=SOURCE_REPO_PROJECT_ID \
        --repo=SOURCE_REPO_NAME \
        --region=LOCATION \
        --branch-pattern=.* \
        --build-config=cloudbuild.yaml
    

    Ersetzen Sie Folgendes:

    • SOURCE_REPO_NAME: Name des Quellcode-Repositorys
    • SOURCE_REPO_PROJECT_ID: die Cloud Build-Projekt-ID
    • LOCATION: der Standort
  3. Lösen Sie einen Build aus, indem Sie die Dateien, die Sie zuvor in dieser Anleitung erstellt haben, pushen.

    git push
    

    Wenn das Image erfolgreich erstellt wurde, generiert Cloud Build die Provenienz und lädt das Image in Ihr Artifact Registry-Repository hoch.

  4. So suchen Sie nach dem neuesten Image und rufen dessen Digest ab:

    1. Prüfen Sie, ob Ihr Image mit Cloud Build erstellt wurde:

      gcloud artifacts docker images list LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/REPO_NAME/DIRECTORY \
          --project=ARTIFACT_PROJECT_ID \
          --sort-by=create_time
      

      Ersetzen Sie Folgendes:

      • LOCATION: Artifact Registry-Standort
      • ARTIFACT_PROJECT_ID: die Projekt-ID für Artefakte
      • ARTIFACT_REPO_NAME: der Name des Repositorys
      • DIRECTORY: das Verzeichnis
    2. Kopieren Sie den Digest des neuesten Images. Der Digest sieht dann ungefähr so aus: sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59

  5. Optional: Herkunft des Bildes ansehen:

    gcloud artifacts docker images describe \
      LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST \
        --project=ARTIFACT_PROJECT_ID \
        --show-provenance
    

    Ersetzen Sie Folgendes:

    • ARTIFACT_PROJECT_ID: die Projekt-ID für Artefakte
    • LOCATION: Artifact Registry-Standort
    • ARTIFACT_REPO_NAME: Name des Artifact-Repositorys
    • DIRECTORY: das Verzeichnis
    • IMAGE: Pfad zum Bild
    • DIGEST: der dem Bild zugeordnete Digest

    Die Befehlsausgabe sieht dann ungefähr so aus:

    image_summary:
      digest: sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      fully_qualified_digest: us-west2-docker.pkg.dev/my-project/slsa-check-repo/slsa-check-image@sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      registry: us-west2-docker.pkg.dev
      repository: slsa-check-repo
      slsa_build_level: 3
    provenance_summary:
      provenance:
      - build:
          intotoStatement:
            _type: https://in-toto.io/Statement/v0.1
            predicateType: https://slsa.dev/provenance/v0.1
            slsaProvenance:
              builder:
                id: https://cloudbuild.googleapis.com/GoogleHostedWorker
              materials:
              - digest:
                  sha1: de4e4227fff1d00d6f7785a827608627e4a369ea
                uri: git+https://source.cloud.google.com/my-project/slsa-check-source-repo
              metadata:
                ...
    envelope:
      payload: eyJfdHlwZSI6I ... taW1hZ2U6dGFnMSJ9XX0=
      payloadType: application/vnd.in-toto+json
      signatures:
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/provenanceSigner/cryptoKeyVersions/1
        sig: MEQCIBCCkho_re4EfAT-NBSSmAXOZlv4lU_vWzEru97tU8KmAiAKcAa99umWngzNQADmPixqYjbKjLOKQEUvrI5chSrf7g==
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1
        sig: MEUCIFOEq_7RpiZAB4vUlit3hkZ2yI0n37-5Y87l0JbU-EZSAiEA9TNZZcv_MnzKffTnswHWZR2DSLmYiklr5twWfIec-zo=
    

    Die Ausgabe muss den Block provenance_summary enthalten, damit die SLSA-Prüfung funktioniert. Wenn die Ausgabe den Block nicht enthält, prüfen Sie, ob Cloud Build durch einen Build-Trigger aufgerufen wurde. Cloud Build erzeugt keine Herkunftsinformationen, wenn es manuell ausgelöst wird.

Eine Plattformrichtlinie erstellen

Zum Generieren der Herkunft müssen Sie einen Cloud Build-Trigger verwenden, um das Image zu erstellen, wie unter Beispiel-Image erstellen und hochladen beschrieben.

So erstellen Sie eine Plattformrichtlinie mit einer SLSA-Prüfung:

  1. Erstellen Sie die YAML-Datei für die Plattformrichtlinie:

    cat > POLICY_PATH <<EOF
    gkePolicy:
      checkSets:
      - checks:
        - displayName: My SLSA check
          imageAllowlist:
            # This policy exempts images that are in the following artifact registry
            allowPattern:
            - ARTIFACT_LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/EXEMPT_IMAGE_PATH/**
          slsaCheck:
            rules:
            - attestationSource:
                containerAnalysisAttestationProjects:
                - projects/ATTESTATION_PROJECT_ID
              configBasedBuildRequired: true
              trustedBuilder: GOOGLE_CLOUD_BUILD
              trustedSourceRepoPatterns:
              - source.cloud.google.com/SOURCE_REPO_PROJECT_ID/SOURCE_REPO_NAME
              customConstraints:
              - CEL_EXPRESSION
        displayName: My check set
    EOF
    

    Ersetzen Sie Folgendes:

    • POLICY_PATH: Ein Pfad zur Richtliniendatei.
    • ARTIFACT_LOCATION: Der Speicherort Ihres Repositorys in der Artifact Registry.
    • ARTIFACT_PROJECT_ID: Die ID des Projekts, das Ihre Artefakte enthält.
    • ARTIFACT_REPO_NAME: das Repository, das das Image enthält.
    • EXEMPT_IMAGE_PATH: Optionaler Pfad zu einem oder mehreren ausgenommenen Bildern, z. B. not-built-by-cloud-build. Der Block imageAllowlist ist in dieser Plattformrichtlinie enthalten, damit Sie Bilder ohne Herkunft ausnehmen können, damit sie nicht gegen die Plattformrichtlinie verstoßen. Wenn Sie stattdessen Verstöße bei diesen Bildern protokollieren möchten, lassen Sie diesen Block weg.
    • ATTESTATION_PROJECT_ID: die Projekt-ID, die die von Cloud Build erstellten Attestierungen enthält.
    • SOURCE_REPO_PROJECT_ID: die ID des Projekts, das Ihren Quellcode enthält.
    • SOURCE_REPO_NAME: das Repository, das das Image enthält. Zur Veranschaulichung: Wenn Sie einen Verstoß gegen diese Prüfung erzwingen möchten, legen Sie SOURCE_REPO_NAME auf ein Quellcode-Repository fest, in dem sich das Image nicht befindet.
    • POLICY_PROJECT_ID: Die ID des Projekts, das die CV-Richtlinie enthält.
    • POLICY_ID: Die ID dieser Richtlinie.
    • CEL_EXPRESSION: Ein CEL, der zusätzliche Einschränkungen für die SLSA-Richtlinie vorsieht. Wenn Sie beispielsweise eine benutzerdefinierte Einschränkung hinzufügen möchten, die zusätzlich vorschreibt, dass Bilder aus einem bestimmten Verzeichnispfad stammen müssen, ersetzen Sie CEL_EXPRESSION durch den folgenden Ausdruck:

      payload.predicate.externalParameters.buildConfigSource.path != "" && payload.predicate.externalParameters.buildConfigSource.repository.contains("github.com/my-repo/my-production-repo")
      
  2. Erstellen Sie die Plattformrichtlinie:

    Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

    • POLICY_ID: Eine Plattformrichtlinien-ID Ihrer Wahl. Wenn sich die Richtlinie in einem anderen Projekt befindet, können Sie den vollständigen Ressourcennamen verwenden: projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID.
    • POLICY_PATH: Ein Pfad zur Richtliniendatei.
    • POLICY_PROJECT_ID: Die ID des Richtlinienprojekts.

    Führen Sie folgenden Befehl aus:

    Linux, macOS oder Cloud Shell

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=POLICY_PATH \
        --project=POLICY_PROJECT_ID

    Windows (PowerShell)

    gcloud beta container binauthz policy create POLICY_ID `
        --platform=gke `
        --policy-file=POLICY_PATH `
        --project=POLICY_PROJECT_ID

    Windows (cmd.exe)

    gcloud beta container binauthz policy create POLICY_ID ^
        --platform=gke ^
        --policy-file=POLICY_PATH ^
        --project=POLICY_PROJECT_ID

CV aktivieren

Sie können einen neuen Cluster erstellen oder einen vorhandenen Cluster aktualisieren, um das CV-Monitoring mit prüfbasierten Plattformrichtlinien zu verwenden.

Cluster erstellen, der das CV-Monitoring verwendet

In diesem Abschnitt erstellen Sie einen Cluster, der nur das CV-Monitoring mit prüfbasierten Plattformrichtlinien verwendet.

Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

  • CLUSTER_NAME: ein Clustername
  • LOCATION: Der Standort, z. B. us-central1 oder asia-south1
  • POLICY_PROJECT_ID: Die ID des Projekts, in dem die Richtlinie gespeichert ist.
  • POLICY_ID: Die Richtlinien-ID.
  • CLUSTER_PROJECT_ID: Die Cluster-Projekt-ID

Führen Sie folgenden Befehl aus:

Linux, macOS oder Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

Cluster mit Erzwingung und CV-Monitoring erstellen

In diesem Abschnitt erstellen Sie einen Cluster, der sowohl die Erzwingung der Projekt-Singleton-Richtlinie als auch das CV-Monitoring mit prüfbasierten Plattformrichtlinien verwendet:

Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

  • CLUSTER_NAME: ein Clustername
  • LOCATION: Der Standort, z. B. us-central1 oder asia-south1
  • POLICY_PROJECT_ID: Die ID des Projekts, in dem die Richtlinie gespeichert ist.
  • POLICY_ID: Die Richtlinien-ID.
  • CLUSTER_PROJECT_ID: Die Cluster-Projekt-ID

Führen Sie folgenden Befehl aus:

Linux, macOS oder Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

Cluster zur Verwendung des CV-Monitoring aktualisieren

In diesem Abschnitt aktualisieren Sie einen Cluster, um das CV-Monitoring nur mit prüfbasierten Plattformrichtlinien zu verwenden. Wenn für den Cluster bereits die Erzwingung der Projekt-Singleton-Richtlinie aktiviert ist, wird sie durch Ausführen dieses Befehls deaktiviert. Stattdessen sollten Sie den Cluster mit aktivierter Erzwingung und aktiviertem CV-Monitoring aktualisieren.

Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

  • CLUSTER_NAME: Der Clustername
  • LOCATION: Der Standort, z. B. us-central1 oder asia-south1
  • POLICY_PROJECT_ID: die ID des Projekts, in dem die Richtlinie gespeichert ist
  • POLICY_ID: die Richtlinien-ID
  • CLUSTER_PROJECT_ID: Die Cluster-Projekt-ID

Führen Sie folgenden Befehl aus:

Linux, macOS oder Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

Cluster aktualisieren, um Erzwingung und CV-Monitoring zu verwenden

In diesem Abschnitt aktualisieren Sie einen Cluster, um sowohl die Erzwingung der Projekt-Singleton-Richtlinie als auch das CV-Monitoring mit prüfbasierten Plattformrichtlinien zu verwenden.

Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

  • CLUSTER_NAME: ein Clustername
  • LOCATION: Der Standort, z. B. us-central1 oder asia-south1
  • POLICY_PROJECT_ID: die ID des Projekts, in dem die Richtlinie gespeichert ist
  • POLICY_ID: die Richtlinien-ID
  • CLUSTER_PROJECT_ID: Die Cluster-Projekt-ID

Führen Sie folgenden Befehl aus:

Linux, macOS oder Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

Image bereitstellen

  1. Konfigurieren Sie kubectl:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME: der Name Ihres Clusters
    • LOCATION: Der Clusterstandort
    • CLUSTER_PROJECT_ID: Die Cluster-Projekt-ID
  2. Stellen Sie den Pod bereit:

    kubectl run hello-app \
        --image='LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST'
    

    Der Pod wird bereitgestellt. Da das Image mit Herkunft und einem vertrauenswürdigen Quellcode-Repository erstellt wurde, verstößt es nicht gegen die CV-SLSA-Prüfung und es werden keine Logeinträge generiert.

    Wenn Sie einen Verstoß gegen die SLSA-Prüfung erzwingen möchten, können Sie SOURCE_REPO_NAME auf ein Quellcode-Repository festlegen, in dem sich das Image nicht befindet. Sie können den Build auch manuell auslösen, wodurch die Generierung der Provenienz übersprungen wird. Prüfen Sie dann die Logeinträge.

Logs für CV-Einträge ansehen

Sie können in Cloud Logging-Einträgen nach CV-Konfigurationsfehlern und Verstößen bei der Validierung von CV-Plattformrichtlinien suchen.

CV protokolliert Fehler und Verstöße innerhalb von 24 Stunden in Cloud Logging. Die Einträge werden in der Regel innerhalb weniger Stunden angezeigt.

Logs zu CV-Konfigurationsfehlern ansehen

Führen Sie den folgenden Befehl aus, um Fehlerprotokolle für die CV-Konfiguration aufzurufen:

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "configErrorEvent"'

Die folgende Ausgabe zeigt einen Konfigurationsfehler, bei dem keine CV-Plattformrichtlinie gefunden wird:

{
  "insertId": "141d4f10-72ea-4a43-b3ec-a03da623de42",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent",
    "configErrorEvent": {
      "description": "Cannot monitor cluster 'us-central1-c.my-cluster': Resource projects/123456789/platforms/gke/policies/my-policy does not exist."
    }
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "cluster_name": "my-cluster",
      "location": "us-central1-c",
      "project_id": "my-project"
    }
  },
  "timestamp": "2024-05-28T15:31:03.999566Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2024-05-28T16:30:56.304108670Z"
}

Validierungsverstöße gegen CV-Plattformrichtlinien ansehen

Wenn keine Images gegen die von Ihnen aktivierten Plattformrichtlinien verstoßen, werden keine Einträge in den Logs angezeigt.

Führen Sie den folgenden Befehl aus, um die CV-Logeinträge der letzten sieben Tage anzusehen:

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "policyName"'

Ersetzen Sie CLUSTER_PROJECT_ID durch die Clusterprojekt-ID.

Prüftypen

CV-Logs prüfen Informationen zu Verstößen in checkResults. Im Eintrag gibt der Wert checkType die Prüfung an. Die Werte für die einzelnen Prüfungen lauten so:

  • ImageFreshnessCheck
  • SigstoreSignatureCheck
  • SimpleSigningAttestationCheck
  • SlsaCheck
  • TrustedDirectoryCheck
  • VulnerabilityCheck

Beispiellog

Der folgende Beispiel-CV-Logging-Eintrag beschreibt ein nicht konformes Image, das gegen eine Prüfung auf vertrauenswürdige Verzeichnisse verstößt:

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/123456789/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "My check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "gcr.io/my-project/hello-app:latest"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-test-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

Bereinigen

In diesem Abschnitt wird beschrieben, wie Sie das zuvor in dieser Anleitung konfigurierte CV-Monitoring bereinigen.

Sie können das CV-Monitoring oder sowohl die Binärautorisierung als auch CV in Ihrem Cluster deaktivieren.

Binärautorisierung in einem Cluster deaktivieren

Führen Sie den folgenden Befehl aus, um die CV und Binärautorisierungserzwingung in Ihrem Cluster zu deaktivieren:

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

Ersetzen Sie Folgendes:

  • CLUSTER_NAME ist der Name des Clusters.
  • LOCATION: Der Clusterstandort
  • CLUSTER_PROJECT_ID: Die Cluster-Projekt-ID

Prüfbasiertes Richtlinien-Monitoring in einem Cluster deaktivieren

Führen Sie den folgenden Befehl aus, um CV mit prüfbasierten Richtlinien im Cluster zu deaktivieren und die Erzwingung mithilfe der Richtlinie für die Binärautorisierungserzwingung neu zu aktivieren:

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

Ersetzen Sie Folgendes:

  • CLUSTER_NAME ist der Name des Clusters.
  • LOCATION: Der Clusterstandort
  • CLUSTER_PROJECT_ID: Die Cluster-Projekt-ID

Beachten Sie, dass --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE dem älteren Flag --enable-binauthz entspricht.

Richtlinie löschen

Führen Sie den folgenden Befehl aus, um die Richtlinie zu löschen. Die prüfbasierte Plattformrichtlinie muss nicht gelöscht werden, um die prüfbasierte Richtlinienprüfung zu deaktivieren.

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

Ersetzen Sie Folgendes:

  • POLICY_ID: Die ID der Richtlinie
  • POLICY_PROJECT_ID: Die Richtlinien-Projekt-ID

Nächste Schritte