Attestierungen mit Voucher erstellen

In dieser Anleitung wird beschrieben, wie Sie Voucher einrichten und verwenden, um Attestierungen für Binärautorisierung zu erstellen.

Überblick über Voucher

Voucher ist ein Open-Source-Tool, das eine Reihe von Prüfungen auf Container-Images ausführt, bevor Attestierungen für die Binärautorisierung für die Images erstellt werden. Voucher hat einen Client und eine Serverkomponente. Sie führen den Voucher Client als zusätzlichen Schritt nach dem Schritt in Ihrer Build-Pipeline aus, mit dem das Image erstellt wird. Wenn der Build-Schritt für den Voucher Client ausgeführt wird, sendet er das Image an den Voucher Server, der die Prüfungen durchführt. In der Konfigurationsdatei für Voucher Server legen Sie fest, welche Prüfungen Voucher zusammen mit anderen Kriterien ausführt.

Diese Anleitung zeigt, wie man die snakeoil-Prüfung von Voucher verwendet, um auf Sicherheitslücken in Images zu testen. Sie aktivieren die Prüfung in der Konfigurationsdatei. Setzen Sie dazu die Option fail-on auf einen Sicherheitslückenschwellenwert, wie später in dieser Anleitung gezeigt.

Wenn die snakeoil-Prüfung abgeschlossen ist und alle identifizierten Sicherheitslücken unter den Schwellenwert fallen, erstellt Voucher Server die Attestierung der Binärautorisierung für das Image. Wenn eine der gefundenen Sicherheitslücken den Schwellenwert erreicht oder überschreitet, erstellt Voucher Server keine Attestierung.

Bei der Bereitstellung von Container-Images ohne bestätigte Attestierung verhindert die Binärautorisierungserzwingung, dass das Image bereitgestellt werden kann.

Ziele

In dieser Anleitung tun Sie Folgendes:

  1. Sie richten den Voucher Server in Cloud Run ein.
  2. Sie richten den Voucher Client ein.
  3. Sie verwenden Voucher in einer Beispiel-Build-Pipelines.

Kosten

In diesem Leitfaden werden die folgenden Google Cloud-Produkte verwendet.

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

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

Hinweis

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Wir empfehlen, die Binärautorisierung mit Google Kubernetes Engine einzurichten. In dieser Anleitung wird beschrieben, wie Sie eine Attestierung erstellen. Damit die Erzwingung bei der Bereitstellung verwendet werden kann, um die Attestierung zu prüfen und das zugehörige Image bereitzustellen, muss die Binärautorisierung eingerichtet werden. Konfigurieren Sie die Richtlinie so, dass Attestierungen erforderlich sind. Sie können die Richtlinie in der Google Cloud Console oder über die Befehlszeile konfigurieren.
  13. Geben Sie Ihr Google Cloud-Projekt in einer Umgebungsvariable an.

      export PROJECT_ID=PROJECT_ID
    

    Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

  14. Legen Sie die Projekt-ID für gcloud-Befehle fest:

    gcloud config set project ${PROJECT_ID}

  15. Geben Sie die Projektnummer für zukünftige Schritte in einer Umgebungsvariable an:

    export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" \
      --format='value(project_number)')

Voucher Server einrichten

In den folgenden Schritten richten Sie den Voucher Server ein.

Signierschlüssel für den Cloud Key Management Service erstellen

In diesem Abschnitt erstellen Sie den Schlüssel, den Voucher Server verwendet, um eine Attestierung für die Binärautorisierung zu erstellen.

  1. Schlüsselbund erstellen

    gcloud kms keyrings create KEY_RING\
       --location global
    

    Ersetzen Sie KEY_RING durch einen Schlüsselbundnamen wie voucher-key-ring.

  2. Erstellen Sie einen Signierschlüssel:

    gcloud kms keys create KEY_NAME \
      --keyring KEY_RING \
      --location global \
      --purpose "asymmetric-signing" \
      --default-algorithm "rsa-sign-pkcs1-4096-sha512"
    

    Ersetzen Sie KEY_NAME durch den Namen eines Schlüsselnamens, z. B. voucher-key.

  3. Speichern Sie die Ressourcen-ID der Cloud Key Management Service-Schlüsselversion:

    export KMS_RESOURCE_ID=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    
  4. Weisen Sie dem Compute Engine-Laufzeitdienstkonto die Rolle cloudkms.signer zu.

    In diesem Schritt weisen Sie dem Dienstkonto, auf dem Voucher Server ausgeführt wird, die Rolle cloudkms.signer zu. Dadurch kann Voucher Server Attestierungen mit Schlüsseln des Cloud Key Management Service signieren. Führen Sie dazu folgenden Befehl aus:

    gcloud kms keys add-iam-policy-binding\
      KEY_NAME --keyring=KEY_RING\
      --location=global\
      --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com\
      --role=roles/cloudkms.signer
    

Artefaktanalyse-Hinweis erstellen

In diesem Abschnitt erstellen Sie den Hinweis.

  1. Speichern Sie die Hinweis-ID:

    export NOTE_ID=snakeoil
    
  2. Speichern Sie den Hinweis-URI:

    export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
    
  3. Erstellen Sie eine Anfragenutzlast:

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "voucher note for snakeoil check"
        }
      }
    }
    EOM
    
  4. Erstellen Sie den Hinweis:

    curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $(gcloud --project ${PROJECT_ID} auth print-access-token)"  \
      -H "x-goog-user-project: ${PROJECT_ID}" \
      --data-binary @/tmp/note_payload.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
    

Voucher Server erstellen und konfigurieren

Bei dieser einmaligen Einrichtung können Sie das Image des Voucher Servers abrufen, konfigurieren und erstellen. Anschließend speichern Sie sie in Container Registry.

  1. Klonen Sie das Voucher-Repository:

    git clone https://github.com/grafeas/voucher.git
    cd voucher/
    

    Dieses Repository enthält:

    • Quellcode zum Erstellen des Voucher Servers.
    • Quellcode zum Erstellen des Voucher Clients.
    • Beispiele für die Verwendung von Voucher.
  2. Aktualisieren Sie die Konfigurationsdatei für den Voucher Server.

    Linux

    Erstellen Sie die Konfigurationsdatei für den Voucher Server aus einer Vorlage. Ersetzen Sie dabei und durch die oben definierten Werte. Führen Sie dazu den folgenden Befehl aus:

     cat tutorials/cloudrun/config.toml.template \
        | sed -e "s?<PROJECT_ID>?${PROJECT_ID}?g" \
        | sed -e "s?<KMS_KEY_NAME>?${KMS_RESOURCE_ID}?g" \
          > tutorials/cloudrun/config.toml
    

    Andere Betriebssysteme

    1. Bearbeiten Sie die Datei tutorials/cloudrun/config.toml.template.

      • Ersetzen Sie <PROJECT_ID> durch den Wert in ${PROJECT_ID}.
      • Ersetzen Sie <KMS_KEY_NAME> durch den Wert in ${KMS_RESOURCE_ID}.
    2. Speichern Sie die Datei als tutorials/cloudrun/config.toml.

  3. Rufen Sie die Konfigurationsdatei für den Voucher Server auf:

    cat tutorials/cloudrun/config.toml
    

    Die Ausgabe enthält Folgendes:

    failon = "high"
    

    Beachten Sie, dass die Option failon in der Konfigurationsdatei auf high festgelegt ist. Diese Einstellung konfiguriert den Voucher Server so, dass er ein Image auf Sicherheitslücken prüft. Wenn das Image Sicherheitslücken mit dem Schweregrad HIGH enthält, schlägt die Prüfung fehl und Voucher Server erstellt die Attestierung der Binärautorisierung nicht. Weitere Informationen zu den fail-on-Einstellungen finden Sie unter Fail-On: Fehler bei Sicherheitslücken.

  4. Erstellen Sie das Container-Image des Voucher Servers und laden Sie es hoch:

    In diesem Abschnitt führen Sie die Cloud Build-Pipeline aus, die das Container-Image des Voucher Servers erstellt. Der Build lädt auch das Image des Voucher Servers auf gcr.io/$PROJECT_ID/voucher-server hoch.

    gcloud  builds submit --config ./tutorials/cloudrun/cloudbuild-server.yaml
    

Voucher Server in Cloud Run bereitstellen

  1. Wählen Sie eine Region aus.

    Eine Liste der verfügbaren Regionen finden Sie unter Liste der verfügbaren Regionen aufrufen. Erstellen Sie eine Variable, um die ausgewählte Region zu speichern:

    export REGION=REGION
    

    Ersetzen Sie REGION durch den Namen der Region, in der Sie den Voucher Server bereitstellen möchten.

  2. Voucher Server in Cloud Run bereitstellen.

    gcloud run deploy --image gcr.io/${PROJECT_ID}/voucher-server \
      --platform managed voucher-server \
      --region ${REGION} \
      --no-allow-unauthenticated
    

    Die Ausgabe sieht in etwa so aus:

    Service [voucher-server] revision [voucher-server-00001-caw] has been deployed and is serving 100 percent of traffic.
    Service URL: https://voucher-server-4wjtm2amga-uc.a.run.app
    
  3. Speichern Sie die URL des Voucher Server-Dienstes:

    export SERVER_SERVICE_URL=$(gcloud run services describe voucher-server --platform managed --region ${REGION} --format='value(status.url)')
    

Voucher Client einrichten

In den folgenden Schritten richten Sie den Voucher Client ein.

  1. Erstellen Sie das Aufrufer-Dienstkonto für den Voucher Client:

    gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
    

    Ersetzen Sie INVOKER_ACCOUNT_NAME mit einem Namen für das Aufrufer-Dienstkonto, z. B. voucher-invoker.

  2. Geben Sie das Dienstkonto an:

    export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Weisen Sie dem Aufrufer-Dienstkonto für Ihr Projekt die Rolle run.invoker zu.

    Gewähren Sie dem Aufrufer-Dienstkonto die Berechtigung zum Aufrufen des Voucher Servers in Cloud Run. Geben Sie hierzu den folgenden Befehl ein:

    gcloud run services add-iam-policy-binding voucher-server \
      --member serviceAccount:$INVOKER_SERVICE_ACCOUNT \
      --role roles/run.invoker \
      --platform managed \
      --region ${REGION}
    
  4. Weisen Sie dem Aufrufer-Dienstkonto für Cloud Build die Rolle iam.serviceAccountTokenCreator zu.

    In diesem Abschnitt erteilen Sie dem Cloud Build-Dienstkonto die Berechtigung, die Identität des Aufruferdienstkontos zu übernehmen, damit Voucher Client während des Builds Anfragen zum Voucher Server senden darf. Geben Sie hierzu den folgenden Befehl ein:

    gcloud iam service-accounts add-iam-policy-binding $INVOKER_SERVICE_ACCOUNT \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountTokenCreator
    

Mit Voucher Images auf Sicherheitslücken prüfen

In diesem Abschnitt führen Sie zwei beispielhafte Cloud Build-Pipelines aus. In beiden Pipelines erstellen Sie ein Image und prüfen es dann mithilfe von Voucher auf Sicherheitslücken.

Fehlerfall

In diesem Abschnitt kann die Beispiel-Build-Pipeline keine Attestierung erstellen. Das auf Debian 9 erstellte Image enthält mindestens eine Sicherheitslücke mit dem Schweregrad HIGH. Die Option fail-on im Voucher Server config.toml ist so eingestellt, dass sie bei Sicherheitslücken des Typs HIGH fehlschlägt. In diesem Fall erstellt Voucher Server keine Attestierung der Binärautorisierung.

  1. Führen Sie die Build-Pipeline aus:

    gcloud builds submit \
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT \
      --config=tutorials/cloudrun/examples/cloudbuild-bad.yaml tutorials/cloudrun/examples
    
  2. Suchen Sie im Log aus dem letzten Build nach snakeoil-Ergebnissen von Voucher:

    Console

    1. Notieren Sie sich die Build-ID aus dem letzten Build.

    2. Rufen Sie in der Google Cloud Console die Seite Build-Verlauf auf.

      Zur Seite "Build-Verlauf"

    3. Klicken Sie unter Build auf das Element, das die ersten Zeichen der Build-ID enthält.

    4. Klicken Sie auf Rohdaten ansehen.

    5. Suchen Sie mit Ihrem Browser nach snakeoil.

      Die Ausgabe sieht in etwa so aus:

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

    gcloud

    1. Speichern Sie die Build-ID aus dem Build:

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Suchen Sie in Ihrem Build-Log mit dem folgenden Befehl:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      Die Ausgabe sieht so aus:

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

Erfolgsfall

In diesem Abschnitt ist die Erstellung der Attestierung für die Beispiel-Build-Pipeline erfolgreich. Alle identifizierten Schwachstellen sind niedriger als der fail-on-Schwellenwert eingestuft. Damit wird die Prüfung bestanden und die Pipeline erstellt die Attestierung.

  1. Führen Sie die Pipeline aus:

    gcloud builds submit\
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT\
      --config=tutorials/cloudrun/examples/cloudbuild-good.yaml tutorials/cloudrun/examples
    
  2. Suchen Sie im Log aus dem letzten Build nach snakeoil-Ergebnissen von Voucher:

    Console

    1. Notieren Sie sich die Build-ID aus dem letzten Build.

    2. Rufen Sie in der Google Cloud Console die Seite Build-Verlauf auf.

      Zur Seite "Build-Verlauf"

    3. Klicken Sie unter Build auf das Element, das die ersten Zeichen der Build-ID enthält.

    4. Klicken Sie auf Rohdaten ansehen.

    5. Suchen Sie mit Ihrem Browser nach snakeoil.

      Die Ausgabe sieht in etwa so aus:

      "name":"snakeoil","success":true,"attested":true
      

    gcloud

    1. Speichern Sie sich die Build-ID aus dem letzten Build.

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Suchen Sie in Ihrem Build-Log mit dem folgenden Befehl:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      Die Ausgabe sieht so aus:

      "name":"snakeoil","success":true,"attested":true
      

Bereinigen

Wenn Sie die in diesem Dokument verwendeten Ressourcen bereinigen möchten, können Sie das Projekt so löschen:

gcloud projects delete ${PROJECT_ID}

Attestierer erstellen

Wenn Sie eine Richtlinie erstellen möchten, die die Attestierungen erfordert, die Sie mit der in dieser Anleitung beschriebenen Methode erstellen, müssen Sie zuerst einen Attestierer erstellen.

So erstellen Sie einen Attestierer:

  1. Rufen Sie das öffentliche Schlüsselmaterial aus dem Cloud KMS-Schlüssel ab, den Sie zuvor in dieser Anleitung erstellt haben:

    gcloud kms keys versions get-public-key 1 \
    --key KEY_NAME \
    --keyring KEY_RING \
    --location global \
    --output-file OUTPUT_PATH
    
    • KEY_NAME: der Schlüsselname
    • KEY_RING ist der Name des Schlüsselbunds.
    • OUTPUT_PATH: ein Dateipfad, z. B. my-key.pem
  2. Erstellen Sie einen Attestierer. Verwenden Sie dazu das Material des öffentlichen Schlüssels in der Datei und den Hinweis, den Sie zuvor in dieser Anleitung erstellt haben. Sie können einen Attestierer über die Google Cloud Console oder die gcloud CLI erstellen.

  3. Erstellen Sie eine Richtlinie, die Attestierungen erfordert, und geben Sie den Attestierer an, den Sie in diesem Abschnitt erstellt haben. Sie können eine Richtlinie über die Google Cloud Console oder die gcloud CLI erstellen.

Attestierung erstellen

Informationen zum Erstellen einer Attestierung mit Ihrem Attestierer finden Sie unter Attestierung mit Cloud KMS erstellen.

Nächste Schritte