Attestierungen mit OpenSSF-Scorecard erstellen

In dieser Anleitung wird gezeigt, wie Sie mit OpenSSF Scorecard Container-Images auf Best Practices für die Sicherheit von Lieferketten 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.

Überblick

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.

Scorecard-Attestierer ist ein in Scorecard integriertes 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 den 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: Image prüfen und signieren, mit Scorecard-Attestierer eine Attestierung anhand der Richtlinie erstellen

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

  1. Ruft Daten zum SCM-Repository für das neu erstellte Container-Image ab.
  2. Führt eine Kurzübersicht für die Rohdaten aus und wertet das SCM-Repository anhand der benutzerdefinierten Richtlinie aus.
    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.

Lernziele

In dieser Anleitung tun Sie Folgendes:

  1. Richten Sie den Scorecard-Attestierer als benutzerdefinierten Cloud Build-Builder ein.
  2. Richtlinie für Scorecard-Attestierer ansehen und konfigurieren.
  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 in einem Beispiel-Repository im Bestätigungsmodus 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 Attestierer der Binärautorisierung. Später erstellt der Scorecard-Attestierer einen Hinweis, der diesem Attestierer zugeordnet 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 dessen Sicherheitspraktiken der Lieferkette mit OpenSSF-Scorecard. Das Image wird erfolgreich erstellt, jedoch keine Attestierung erstellt. Das Basis-Repository enthält einige nicht empfohlene Sicherheitspraktiken für die Lieferkette, z. B. eine nicht angepinnte Abhängigkeit von Debian 10 im Dockerfile und ein kompiliertes binäres Artefakt, 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 Datei der Attestierungsrichtlinie 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:

    gsutil 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. Rufen Sie die Datei der Attestierungsrichtlinie für den Fehlerfall auf. 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:

    gsutil 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 über die Kurzübersicht erstellt und geprüft wurde

    export IMAGE_URI=$(gsutil 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 Notizennamen 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