Sigstore-Signaturprüfung verwenden

Auf dieser Seite erfahren Sie, wie Sie die Sigstore-Signaturprüfung der Continuous Validation (CV) der Binärautorisierung verwenden. Die Prüfung verifiziert die von Sigstore generierten Signaturen von Container-Images, die mit Pods verknüpft sind, die in einem GKE-Cluster (Google Kubernetes Engine) ausgeführt werden, in dem CV aktiviert ist. Der Hauptunterschied zwischen dieser Prüfung und der einfachen Prüfung auf Attestierungsignatur besteht darin, dass der Sigstore-Signaturworkflow keine Artefaktanalyse-Hinweise verwendet, um Signaturen mit Images zu verknüpfen. Alle Signaturen werden zusammen mit dem Image gespeichert, das sie signieren.

Diese Prüfung unterstützt nur Artifact Registry-Repositories.

Kosten

In diesem Leitfaden werden folgende Google Cloud-Dienste verwendet.

  • Binärautorisierung, aber CV ist in der Vorschauphase kostenlos.
  • GKE
  • Cloud Key Management Service
  • Artifact Registry

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

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. Installieren Sie die Google Cloud CLI.
  3. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  4. Google Cloud-Projekt erstellen oder auswählen.

    • Erstellen Sie ein Google Cloud-Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud-Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Google Cloud-Projekts.

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

  6. Aktivieren Sie die Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:

    gcloud services enable binaryauthorization.googleapis.com cloudkms.googleapis.com container.googleapis.com artifactregistry.googleapis.com
  7. Installieren Sie die Google Cloud CLI.
  8. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  9. Google Cloud-Projekt erstellen oder auswählen.

    • Erstellen Sie ein Google Cloud-Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud-Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Google Cloud-Projekts.

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

  11. Aktivieren Sie die Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:

    gcloud services enable binaryauthorization.googleapis.com cloudkms.googleapis.com container.googleapis.com artifactregistry.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.
  15. Installieren Sie das cosign-Befehlszeilentool

Erforderliche Rollen

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

Überblick

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-Sigstore-Signaturprüfung hat, bitten Sie Ihren Administrator, dem Dienst-Agent für die Binärautorisierung in jedem Projekt die folgenden IAM-Rollen zu gewähren:

  • Wenn sich Ihr Clusterprojekt von Ihrem Richtlinienprojekt unterscheidet: Bewerter für Richtlinien für Binärautorisierungen (roles/binaryauthorization.policyEvaluator) im Dienst-Agent für die Binärautorisierung des Clusterprojekts
  • Wenn sich Ihr Image-Repository-Projekt von Ihrem Richtlinienprojekt unterscheidet: Artifact Registry-Leser (roles/artifactregistry.reader) für den Dienst-Agent für die Binärautorisierung des Richtlinienprojekts

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff 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 der Dienst-Agent für die Binärautorisierung in jedem Projekt die erforderlichen Berechtigungen zum Auswerten der CV-Sigstore-Signaturprüfung hat, müssen Sie dem Dienst-Agent für die Binärautorisierung in jedem Projekt die folgenden IAM-Rollen zuweisen.

  1. Erteilen Sie dem Dienst-Agent für den Binärautorisierungsdienst des Clusterprojekts die Berechtigung, 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 für die Binärautorisierung des Richtlinienprojekts Zugriff auf die Signaturen in Ihrem Repository:

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

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:POLICY_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      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 REPOSITORY_PROJECT_ID \
          --member="serviceAccount:$SERVICE_ACCOUNT" \
          --role='roles/artifactregistry.reader'
      

      Ersetzen Sie REPOSITORY_PROJECT_ID durch die ID des Projekts, das Ihr Repository enthält.

Ein Schlüsselpaar erstellen

In diesem Abschnitt erstellen Sie ein asymmetrisches ECDSA-Schlüsselpaar (Elliptic Curve Digital Signature Algorithm).

Signieren Sie das Image mit dem privaten Schlüssel, um die Attestierung zu erstellen. Sie fügen den öffentlichen Schlüssel in die Plattformrichtlinie ein. Wenn CV die Attestierung prüft, verwendet er den öffentlichen Schlüssel, um die Attestierung zu verifizieren.

Sie können entweder den Cloud Key Management Service (Cloud KMS) oder lokale Schlüssel verwenden. Wir empfehlen jedoch, für die Produktion Cloud KMS-Schlüssel zu verwenden.

PKIX Cloud KMS CoSign

  1. Richten Sie Umgebungsvariablen ein, die zum Erstellen des Schlüsselpaars erforderlich sind. Dazu empfehlen wir, die Platzhalter im folgenden Befehl auszufüllen und dann den Befehl auszuführen.

    KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
    KMS_KEYRING_NAME=KMS_KEYRING_NAME
    KMS_KEY_NAME=KMS_KEY_NAME
    KMS_KEY_LOCATION=global
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=ec-sign-p256-sha256
    KMS_PROTECTION_LEVEL=software
    KMS_KEY_VERSION=1
    

    Ersetzen Sie Folgendes:

    • KMS_KEY_PROJECT_ID: Ihre Projekt-ID.
    • KMS_KEYRING_NAME: ein Name für Ihren Cloud KMS-Schlüsselbund.
    • KMS_KEY_NAME: ein Name für Ihren Cloud KMS-Schlüssel
  2. Generieren Sie den Schlüssel mit der Cosign-Befehlszeile:

    cosign generate-key-pair \
      --kms gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}
    
  3. Notieren Sie sich den Speicherort des öffentlichen Schlüssels:

    Cosign speichert den generierten öffentlichen Schlüssel automatisch als cosign.pub in dem Verzeichnis, in dem der Befehl generate-key-pair ausgeführt wurde. Speichern Sie diesen Dateispeicherort in einer Variablen für zukünftige Befehle.

    PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
    

PKIX Cloud KMS-gcloud

So erstellen Sie das Schlüsselpaar in Cloud KMS:

  1. Richten Sie Umgebungsvariablen ein, die zum Erstellen des Schlüsselpaars erforderlich sind. Dazu empfehlen wir, die Platzhalter im folgenden Befehl auszufüllen und dann den Befehl auszuführen.

    KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
    KMS_KEYRING_NAME=KMS_KEYRING_NAME
    KMS_KEY_NAME=KMS_KEY_NAME
    KMS_KEY_LOCATION=global
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=ec-sign-p256-sha256
    KMS_PROTECTION_LEVEL=software
    KMS_KEY_VERSION=1
    

    Ersetzen Sie Folgendes:

    • KMS_KEY_PROJECT_ID: Ihre Projekt-ID.
    • KMS_KEYRING_NAME: ein Name für Ihren Cloud KMS-Schlüsselbund.
    • KMS_KEY_NAME: ein Name für Ihren Cloud KMS-Schlüssel
  2. Erstellen Sie den Schlüsselbund:

    gcloud kms keyrings create ${KMS_KEYRING_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --project=${KMS_KEY_PROJECT_ID}
    
  3. Erstellen Sie den Schlüssel:

    gcloud kms keys create ${KMS_KEY_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --keyring=${KMS_KEYRING_NAME}  \
        --purpose=${KMS_KEY_PURPOSE} \
        --default-algorithm=${KMS_KEY_ALGORITHM} \
        --protection-level=${KMS_PROTECTION_LEVEL} \
        --project=${KMS_KEY_PROJECT_ID}
    
  4. Exportieren Sie das Material des öffentlichen Schlüssels in eine Datei:

    PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
    gcloud kms keys versions get-public-key 1 \
        --key=${KMS_KEY_NAME} \
        --keyring=${KMS_KEYRING_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --output-file=${PUBLIC_KEY_FILE} \
        --project=${KMS_KEY_PROJECT_ID}
    

Lokaler Schlüssel

So erstellen Sie das Schlüsselpaar lokal:

  cosign generate-key-pair
  PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
  PRIVATE_KEY_FILE="$(pwd)/cosign.key"

Plattformrichtlinie erstellen

So erstellen Sie die CV-Plattformrichtlinie mit einer Sigstore-Signaturprüfung:

  1. Erstellen Sie die Plattformrichtliniendatei für Sigstore-Signaturprüfung:

    cat > POLICY_PATH <<EOF
    gkePolicy:
      checkSets:
      - checks:
        - displayName: sigstore-signature-check
          sigstoreSignatureCheck:
            sigstoreAuthorities:
            - displayName: sigstore-authority
              publicKeySet:
                publicKeys:
                  publicKeyPem: |
    $(awk '{printf "                %s\n", $0}' ${PUBLIC_KEY_FILE})
    EOF
    

    Ersetzen Sie POLICY_PATH durch den Pfad zur Richtliniendatei.

  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

CV testen

In diesem Abschnitt testen Sie CV dadurch, dass Sie ein signiertes Image bereitstellen. In diesem Fall überprüft die CV Sigstore-Signaturprüfung die Signatur und erzeugt keinen Logeintrag.

Anschließend versuchen Sie, ein anderes nicht signiertes Image bereitzustellen. In diesem Fall kann die CV-Prüfung keine gültige Signatur finden und protokolliert den Verstoß in Cloud Logging.

Image signieren

Damit die Prüfung erfüllt werden kann, benötigt das Image eine gültige Signatur. So erstellen Sie die Signatur:

  1. Erstellen Sie die Variablen, mit denen Sie das Image signieren:

    IMAGE_PATH=IMAGE_PATH
    IMAGE_DIGEST=sha256:IMAGE_DIGEST_SHA
    IMAGE_TO_SIGN="${IMAGE_PATH}@${IMAGE_DIGEST}"
    

    Ersetzen Sie Folgendes:

    • IMAGE_PATH: der Pfad zu Ihrem Image
    • IMAGE_DIGEST_SHA: der SHA-Hash des Image-Digests
  2. Signieren Sie das Image und übertragen Sie die Signatur per Push in Artifact Registry:

    PKIX Cloud KMS

    Signieren Sie das Image mit einem in Cloud KMS gehosteten Schlüssel und übertragen Sie die Signatur per Push in Artifact Registry:

    cosign sign \
        --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
        ${IMAGE_TO_SIGN}
    

    Lokaler Schlüssel

    Signieren Sie das Image mit einem lokalen privaten Schlüssel und übertragen Sie die Signatur per Push in Artifact Registry.

    cosign sign --key ${PRIVATE_KEY_FILE} ${IMAGE_TO_SIGN}
    
  3. Auf die CoSign-Prompts antworten:

    Nach der Ausführung des Befehls cosign sign fragt Cosign, ob Sie die Signatur in das Transparenzlog-Rekor hochladen möchten. Antworten Sie mit y oder n auf die Aufforderungen. Weitere Informationen zu Rekor finden Sie in der Rekor-Dokumentation.

Signatur manuell prüfen

So prüfen Sie die Signatur manuell:

  1. Prüfen Sie, ob die Signatur in Artifact Registry vorhanden ist:

    Google Cloud Console

    1. Rufen Sie in der Google Cloud Console die Seite Artifact Registry auf.

      Zu Artifact Registry

    2. Klicken Sie in der Liste der Repositories auf den Namen des Repositorys, das Ihr Image enthält.

    3. Klicken Sie auf den Namen des Images, das Sie signiert haben.

    4. Suchen Sie das Element mit der Signatur. Dieses Element hat das Tag sha256-[image digest].sig. Es sollte nur ein Element mit dem Tag vorhanden sein.

    5. Klicken Sie auf Manifest.

    6. Sie sollten eine JSON-formatierte Datei mit verschiedenen Feldern sehen. Jede Signatur befindet sich in einem Element der layers-Liste in der Zuordnung annotations. Die Signaturen befinden sich am Schlüssel dev.cosignproject.cosign/signature.

      Hier ein Beispielmanifest:

      {
            "schemaVersion": 2,
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "config": {
                "mediaType": "application/vnd.oci.image.config.v1+json",
                "size": SIZE_OF_LAYERS,
                "digest": "DIGEST_OF_LAYERS"
            },
            "layers": [
                {
                    "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                    "size": SIZE_OF_ANNOTATIONS,
                    "digest": "DIGEST_OF_ANNOTATIONS",
                    "annotations": {
                        "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                        "dev.sigstore.cosign/bundle": "BUNDLE"
                    }
                }
            ]
      }
    

    Das Beispielmanifest enthält Folgendes:

    • SIZE_OF_LAYERS: Größe des Arrays layers in Byte
    • DIGEST_OF_LAYERS: Der Digest des Arrays layers
    • SIZE_OF_ANNOTATIONS: Größe des Wörterbuchs annotations in Byte.
    • DIGEST_OF_ANNOTATIONS: Digest des Wörterbuchs annotations
    • BASE64_SIGNATURE: Die Rohsignatur, die im base64-Format codiert ist. Diese Signatur wird zur Überprüfung verwendet.
    • BUNDLE: Sigstore-spezifische Metadaten

    Weitere Informationen zum Manifestformat finden Sie in der Cosign-Signaturspezifikation von Sigstore.

    Befehlszeile

    1. Suchen Sie das richtige Artefakt:

      Listen Sie die mit dem Image gespeicherten Elemente auf:

      gcloud artifacts docker tags list ${IMAGE_PATH}
      

      Eine Beispielausgabe sieht so aus:

      Listing items under project PROJECT_ID, location REPOSITORY_LOCATION, repository REPOSITORY_NAME.
      TAG                         IMAGE                                                         DIGEST
      latest                      us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:abc123
      sha256-abc123.sig           us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:def456
      

      In der Ausgabe enthält das Artefakt mit dem Tag sha256-abc123.sig die Signatur in seinem Manifest.

    2. Manifest abrufen

      Führen Sie den folgenden Befehl aus, um das Manifest des Artefakts mit dem Tag sha256-IMAGE_DIGEST_SHA.sig abzurufen:

      curl -X GET -H "Content-Type: application/json" \
                  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
                  -H "X-Goog-User-Project: REPOSITORY_PROJECT_ID" \
                  "https://REPOSITORY_LOCATION-docker.pkg.dev/v2/REPOSITORY_PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME/manifests/sha256-IMAGE_DIGEST_SHA.sig"
      

      Ersetzen Sie Folgendes:

      • REPOSITORY_PROJECT_ID: Die ID des Projekts, das das Repository enthält
      • REPOSITORY_LOCATION: Speicherort des Repositorys
      • REPOSITORY_NAME: Name des Repositorys.
      • IMAGE_NAME: der Name des Image

      Sie sollten eine JSON-formatierte Datei mit verschiedenen Feldern sehen. Jede Signatur befindet sich in einem Element der layers-Liste in der Zuordnung annotations. Die Signaturen befinden sich am Schlüssel dev.cosignproject.cosign/signature.

      Hier ein Beispielmanifest:

      {
          "schemaVersion": 2,
          "mediaType": "application/vnd.oci.image.manifest.v1+json",
          "config": {
              "mediaType": "application/vnd.oci.image.config.v1+json",
              "size": SIZE_OF_LAYERS,
              "digest": "DIGEST_OF_LAYERS"
          },
          "layers": [
              {
                  "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                  "size": SIZE_OF_ANNOTATIONS,
                  "digest": "DIGEST_OF_ANNOTATIONS",
                  "annotations": {
                      "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                      "dev.sigstore.cosign/bundle": "BUNDLE"
                  }
              }
          ]
      }
      

    Das Beispielmanifest enthält Folgendes:

    • SIZE_OF_LAYERS: Größe des Arrays layers in Byte
    • DIGEST_OF_LAYERS: Der Digest des Arrays layers
    • SIZE_OF_ANNOTATIONS: Größe des Wörterbuchs annotations in Byte.
    • DIGEST_OF_ANNOTATIONS: Digest des Wörterbuchs annotations
    • BASE64_SIGNATURE: Die Rohsignatur, die im base64-Format codiert ist. Diese Signatur wird zur Überprüfung verwendet.
    • BUNDLE: Sigstore-spezifische Metadaten

    Weitere Informationen zum Manifestformat finden Sie in der Cosign-Signaturspezifikation von Sigstore.

  2. Prüfen Sie die Signatur manuell:

    Verwenden Sie cosign verify, um die hochgeladene Signatur zu prüfen:

    PKIX Cloud KMS

    cosign verify --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
          ${IMAGE_PATH}@${IMAGE_DIGEST}
    

    Lokaler Schlüssel

    cosign verify --key {PUBLIC_KEY_FILE} ${IMAGE_PATH}@${IMAGE_DIGEST}
    

    Die Befehlsausgabe gibt an, dass The signatures were verified against the specified public key gilt, wenn die Prüfung erfolgreich war.

Signiertes Image bereitstellen

So stellen Sie ein signiertes Image bereit:

  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 ein Image bereit und prüfen Sie die Bereitstellung anhand der Richtlinie für die Binärautorisierung:

    kubectl run hello-app-signed --image=${IMAGE_PATH}@${IMAGE_DIGEST}
    

    Der Pod wurde bereitgestellt. Da das Image signiert ist, erstellt CV keine Logeinträge, die sich auf diesen Pod beziehen.

Nicht signiertes Image bereitstellen

In diesem Abschnitt stellen Sie ein nicht signiertes Image bereit.

Da die Richtlinie Signaturen erfordert und dieses Image keine hat, protokolliert CV regelmäßig den Verstoß, während der Container ausgeführt wird.

Führen Sie den folgenden -Befehl aus, um das Image bereitzustellen:

  kubectl run hello-app-unsigned \
      --image=UNSIGNED_IMAGE_PATH@UNSIGNED_IMAGE_DIGEST

Der Pod wurde bereitgestellt. Da das Image keine Attestierung hat, erzeugt CV während der Ausführung des Pods Logeinträge.

Logs für CV-Einträge ansehen

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

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