Attestierungen mit OpenSSF-Scorecard erstellen

In dieser Anleitung wird gezeigt, wie Sie mit OpenSSF-Scorecard Container-Images auf Best Practices für die Sicherheit der Lieferkette prüfen. Der Scorecard-Attestierer wird als Teil der Cloud Build-Pipeline ausgeführt, um eine Attestierung zu generieren, die vor der Bereitstellung von der Binärautorisierung geprüft werden kann. Mit diesem Bestätigungsschritt wird verhindert, dass manipulierte Containerartefakte für die Produktion bereitgestellt werden. Dadurch können mehrere Klassen von Sicherheitslücken in der Lieferkette verhindert werden.

Übersicht

Die Open Source Security Foundation (OpenSSF) ist eine Organisation, die Tools, Dienste und Infrastruktur für Open-Source-Sicherheitsinitiativen bereitstellt. Scorecard ist ein von OpenSSF verwaltetes Tool, das SCM-Repositories (Quellcodeverwaltung) auf Best Practices für die Sicherheit von Lieferketten prüft.

Der Scorecard-Attestierer ist ein in Scorecard eingebundenes Tool, mit dem Sie Attestierungen für Binärautorisierung auf der Grundlage einer von Ihnen konfigurierten Richtlinie erstellen können. Der Scorecard-Attestierer führt Scorecard für das SCM-Repository eines Container-Images aus, generiert Ergebnisse, bewertet die Ergebnisse anhand der Richtlinie und generiert eine Attestierung, wenn die Richtlinie erfüllt ist.

In dieser Anleitung erstellen Sie ein Beispiel-Repository und verwenden dann Scorecard-Attestierer. Jede Beispielpipeline enthält die folgenden Build-Schritte:

  1. build: Beispiel-Container-Image erstellen
  2. push: Image in Container Registry hochladen
  3. attest: Prüfen und signieren Sie das Image mit dem Scorecard-Attestierer, um eine Attestierung basierend auf der Richtlinie zu erstellen.

Im Schritt attest jeder Pipeline führt der Scorecard-Attestierer folgende Schritte aus:

  1. Hier werden Daten zum SCM-Repository für das neu erstellte Container-Image abgerufen.
  2. Führt Scorecard für die Rohdaten aus und bewertet das SCM-Repository anhand der vom Nutzer angegebenen Richtlinie.
    1. Wenn alle Richtlinien erfüllt sind, erstellt der Scorecard-Attestierer die Attestierung.
    2. Wenn eine der Richtlinien nicht erfüllt ist, erstellt der Scorecard-Attestierer die Attestierung nicht.

Bei der Bereitstellung prüft die Binärautorisierung nach einer überprüfbaren Attestierung. Ohne eines kann der Erzwinger das Image nicht bereitstellen.

Kosten

Hinweis: In dieser Anleitung werden die folgenden Google Cloud-Produkte verwendet.

  • Container Registry
  • Artefaktanalyse
  • Cloud Build
  • Cloud Key Management Service

Mithilfe des Preisrechners können Sie anhand Ihrer voraussichtlichen Nutzung eine Kostenschätzung vornehmen.

Ziele

In dieser Anleitung tun Sie Folgendes:

  1. Richten Sie den Scorecard-Attestierer als benutzerdefinierten Cloud Build-Builder ein.
  2. Sehen Sie sich die Scorecard-Attestierer-Richtlinie an und konfigurieren Sie sie.
  3. Führen Sie Scorecard-Attestierer in einem Beispiel-Repository aus, um eine Attestierung anhand einer Richtlinie zu erstellen.
  4. Führen Sie den Scorecard-Attestierer für ein Beispiel-Repository im Nur-Prüfmodus aus, ohne eine Attestierung zu erstellen. ## Hinweise

In diesem Abschnitt führen Sie eine einmalige Einrichtung des Systems durch.

Umgebung einrichten

  1. Speichern Sie Ihr Google Cloud-Projekt in einer Umgebungsvariable.

    export PROJECT_ID=PROJECT_ID
    

    Ersetzen Sie PROJECT_ID durch Ihr Google Cloud-Projekt.

  2. Legen Sie als Standardprojekt-ID Ihr Google Cloud-Projekt fest:

    gcloud config set project $PROJECT_ID
    
  3. Speichern Sie die Projektnummer für zukünftige Schritte in einer Umgebungsvariable:

    export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \
     --format="value(PROJECT_NUMBER)")
    
  4. APIs aktivieren:

    Führen Sie den folgenden Befehl aus, um sicherzustellen, dass die für diese Anleitung erforderlichen Dienste aktiviert sind:

    gcloud services enable \
      cloudbuild.googleapis.com \
      containerregistry.googleapis.com \
      containerscanning.googleapis.com \
      cloudkms.googleapis.com
    

IAM-Rollen einrichten

Führen Sie die folgenden Befehle aus, um das Cloud Build-Dienstkonto mit den folgenden Rollen zu konfigurieren:

  • containeranalysis.notes.editor: fügt die Rolle Bearbeiter von Artefaktanalyse-Hinweisen hinzu, um den Attestierer zu verwalten
  • containeranalysis.notes.occurrences.viewer: fügt die Rolle Artefaktanalyse-Vorkommen für Hinweise hinzu, um sowohl Sicherheitslücken als auch Attestierungen zu verwalten
  • roles/containeranalysis.occurrences.editor: Fügt die Rolle Bearbeiter von Artefaktanalysen hinzu, um Attestierungen in Artifact Analysis zu erstellen.
  • cloudkms.signer: fügt die Rolle Cloud KMS CryptoKey-Signer hinzu, mit der das Dienstkonto auf den Cloud KMS-Signaturdienst zugreifen kann.

    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
    

Cloud KMS-Signaturschlüssel erstellen

Schlüssel des Cloud Key Management Service werden zum Erstellen der Attestierung verwendet.

  1. Erstellen Sie einen neuen Cloud KMS-Schlüsselbund mit dem Namen scorecard-attestor-key-ring:

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. Erstellen Sie im Schlüsselbund einen neuen Cloud KMS-Schlüssel mit dem Namen scorecard-attestor-key:

    gcloud kms keys create scorecard-attestor-key \
        --keyring scorecard-attestor-key-ring \
        --location global \
        --purpose "asymmetric-signing" \
        --default-algorithm "rsa-sign-pkcs1-2048-sha256"
    
  3. Speichern Sie den Digest-Algorithmus und Cloud KMS für eine weitere Vorgehensweise in einer Umgebungsvariable:

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
    
  4. Erstellen Sie den Binärautorisierungs-Attestierer. Später erstellt der Scorecard-Attestierer einen Hinweis, der mit diesem Attestierer verknüpft ist.

    gcloud container binauthz attestors create scorecard-attestor \
        --attestation-authority-note=scorecard-attestation \
        --attestation-authority-note-project=$PROJECT_ID \
        --description="Attest that ossf/scorecard policy checks pass"
    
  5. Verknüpfen Sie den Attestierer der Binärautorisierung mit dem KMS-Schlüssel:

    gcloud container binauthz attestors public-keys add \
        --attestor=scorecard-attestor \
        --keyversion=1 \
        --keyversion-key=scorecard-attestor-key \
        --keyversion-keyring=scorecard-attestor-key-ring \
        --keyversion-location=global \
        --keyversion-project=$PROJECT_ID
    

Informationen zu anderen Signaturalgorithmen finden Sie unter Asymmetrische Schlüssel erstellen.

Attestierungen mit Scorecard-Attestierer in einer Cloud Build-Pipeline erstellen

Beispiel-Build für den Fehlerfall senden

In diesem Abschnitt erstellen Sie ein Container-Image und prüfen die Sicherheitspraktiken der Lieferkette mit OpenSSF Scorecard. Das Image wird erfolgreich erstellt, aber keine Attestierung erstellt. Das Basis-Repository enthält einige nicht empfohlene Sicherheitspraktiken für die Lieferkette, z. B. eine losgelöste Abhängigkeit zu Debian 10 im Dockerfile und ein kompiliertes Binärartefakt, das in das Quell-Repository eingecheckt wird. Dies sind Verstöße gegen die Attestierungsrichtlinie im Repository.

  1. Klonen Sie das Test-Repository: scorecard-binauthz-test-bad.

  2. Rufen Sie die Attestierungsrichtliniendatei für den Fehlerfall auf.

    cat policy-binauthz.yaml
    
  3. (Optional) Rufen Sie die Build-Konfigurationsdatei für den Fehlerfall auf.

    cat samples/signer/cloudbuild.yaml
    
  4. Reichen Sie den Build ein:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    

Die Ausgabe sollte etwa so aussehen:

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. Speichern Sie die Build-ID aus dem letzten Build:

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  2. Ergebnis prüfen:

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
    

Beispiel-Build für den Erfolgsfall senden

In diesem Abschnitt erstellen Sie ein Container-Image, das die Scorecard-Attestierungsrichtlinie erfüllt. In diesem Fall erstellt der Scorecard-Attestierer eine Attestierung.

So senden Sie den Beispiel-Build für den Erfolgsfall an Cloud Build:

  1. Klonen Sie das Test-Repository: scorecard-binauthz-test-good.

  2. Sehen Sie sich die Attestierungsrichtliniendatei für den Fehlerfall an. sh cat policy-binauthz.yaml

  3. (Optional) Rufen Sie die Build-Konfigurationsdatei für den Fehlerfall auf.

    cat samples/signer/cloudbuild.yaml
    
  4. Reichen Sie den Build ein:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    
  5. Ergebnis prüfen:

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. URL des Container-Images abrufen, das von der Kurzübersicht erstellt und geprüft wurde

    export IMAGE_URI=$(gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
    
  7. Prüfen Sie, ob eine Attestierung für das Container-Image erstellt wurde. Der Scorecard-Attestierer verwendet die Notiz-ID ossf-scorecard-attestation und den Hinweisnamen projects/${PROJECT_ID}/notes/ossf-scorecard-attestation.

    gcloud container binauthz attestations list \
        --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \
        --filter="resourceUri='https://${IMAGE_URI}'"
    

Bereinigen

Um die in diesem Dokument verwendeten Ressourcen zu bereinigen, können Sie das Projekt löschen:

gcloud projects delete $PROJECT_ID

Nächste Schritte