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:
- Sie richten den Voucher Server in Cloud Run ein.
- Sie richten den Voucher Client ein.
- 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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 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.
-
Geben Sie Ihr Google Cloud-Projekt in einer Umgebungsvariable an.
export PROJECT_ID=PROJECT_ID
Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.
-
Legen Sie die Projekt-ID für
gcloud
-Befehle fest:gcloud config set project ${PROJECT_ID}
-
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.
Schlüsselbund erstellen
gcloud kms keyrings create KEY_RING\ --location global
Ersetzen Sie KEY_RING durch einen Schlüsselbundnamen wie
voucher-key-ring
.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
.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
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.
Speichern Sie die Hinweis-ID:
export NOTE_ID=snakeoil
Speichern Sie den Hinweis-URI:
export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
Erstellen Sie eine Anfragenutzlast:
cat > /tmp/note_payload.json << EOM { "name": "${NOTE_URI}", "attestation": { "hint": { "human_readable_name": "voucher note for snakeoil check" } } } EOM
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.
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.
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
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}
.
- Ersetzen Sie
Speichern Sie die Datei als
tutorials/cloudrun/config.toml
.
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 aufhigh
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 SchweregradHIGH
enthält, schlägt die Prüfung fehl und Voucher Server erstellt die Attestierung der Binärautorisierung nicht. Weitere Informationen zu denfail-on
-Einstellungen finden Sie unter Fail-On: Fehler bei Sicherheitslücken.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
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.
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
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.
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
.Geben Sie das Dienstkonto an:
export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
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}
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.
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
Suchen Sie im Log aus dem letzten Build nach
snakeoil
-Ergebnissen von Voucher:Console
Notieren Sie sich die Build-ID aus dem letzten Build.
Rufen Sie in der Google Cloud Console die Seite Build-Verlauf auf.
Klicken Sie unter Build auf das Element, das die ersten Zeichen der Build-ID enthält.
Klicken Sie auf Rohdaten ansehen.
Suchen Sie mit Ihrem Browser nach
snakeoil
.Die Ausgabe sieht in etwa so aus:
"name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
gcloud
Speichern Sie die Build-ID aus dem Build:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
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.
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
Suchen Sie im Log aus dem letzten Build nach
snakeoil
-Ergebnissen von Voucher:Console
Notieren Sie sich die Build-ID aus dem letzten Build.
Rufen Sie in der Google Cloud Console die Seite Build-Verlauf auf.
Klicken Sie unter Build auf das Element, das die ersten Zeichen der Build-ID enthält.
Klicken Sie auf Rohdaten ansehen.
Suchen Sie mit Ihrem Browser nach
snakeoil
.Die Ausgabe sieht in etwa so aus:
"name":"snakeoil","success":true,"attested":true
gcloud
Speichern Sie sich die Build-ID aus dem letzten Build.
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
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:
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üsselnameKEY_RING
ist der Name des Schlüsselbunds.OUTPUT_PATH
: ein Dateipfad, z. B.my-key.pem
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.
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
- Konfigurieren Sie die Richtlinie für die Binärautorisierung so, dass Attestierungen über das Befehlszeilentool oder die Google Cloud Console erforderlich sind.
- Erstellen Sie die Binärautorisierung des Attestierers, um die Attestierung zum Zeitpunkt der Bereitstellung mithilfe des Befehlszeilentools oder der Google Cloud Console zu prüfen.
- Voucher-Dokumentation auf GitHub.
- Informationen zur Binärautorisierung.
- Informationen zu Artifact Analysis und Scannen auf Sicherheitslücken.
- Informationen zum Cloud Key Management Service.