Informationen zu diesem Codelab
1. Einführung
Sicherheitslücken in Software sind Schwachstellen, die zu einem versehentlichen Systemausfall führen oder böswilligen Akteuren die Möglichkeit geben können, Ihre Software zu kompromittieren. Container Analysis bietet zwei Arten von Betriebssystemscans, um Sicherheitslücken in Containern zu finden:
- Mit der On-Demand Scanning API können Sie Container-Images manuell auf Sicherheitslücken des Betriebssystems scannen – entweder lokal auf Ihrem Computer oder per Fernzugriff in Container Registry oder Artifact Registry.
- Mit der Container Scanning API können Sie die Erkennung von Sicherheitslücken des Betriebssystems automatisieren. Dabei wird jedes Mal gescannt, wenn Sie ein Image per Push in Container Registry oder Artifact Registry übertragen. Wenn Sie diese API aktivieren, werden auch Sprachpaket-Scans auf Go- und Java-Sicherheitslücken aktiviert.
Mit der On-Demand Scanning API können Sie Images scannen, die lokal auf Ihrem Computer oder remote in Container Registry oder Artifact Registry gespeichert sind. So können Sie genau steuern, welche Container auf Sicherheitslücken gescannt werden sollen. Sie können das On-Demand-Scanning verwenden, um Images in Ihrer CI/CD-Pipeline zu scannen, bevor Sie entscheiden, ob Sie sie in einer Registry speichern.
Aufgaben in diesem Lab
Aufgaben in diesem Lab:
- Images mit Cloud Build erstellen
- Artifact Registry für Container verwenden
- Automatisiertes Scannen auf Sicherheitslücken nutzen
- On-Demand-Scanning konfigurieren
- Image-Scan in CICD in Cloud Build hinzufügen
2. Einrichtung und Anforderungen
Umgebung zum selbstbestimmten Lernen einrichten
- Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.
- Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
- Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf die Projekt-ID verweisen, die üblicherweise als
PROJECT_ID
gekennzeichnet ist. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID erstellen. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen. - Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
- Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab sollte möglichst wenig kosten. Wenn Sie Ressourcen herunterfahren möchten, um über diese Anleitung hinaus keine Kosten zu verursachen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion mit 300$Guthaben.
Umgebung einrichten
Legen Sie in Cloud Shell Ihre Projekt-ID und die Projektnummer für Ihr Projekt fest. Speichern Sie sie als Variablen des Typs PROJECT_ID
und PROJECT_ID
.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
Dienste aktivieren
Aktivieren Sie alle erforderlichen Dienste:
gcloud services enable \
cloudkms.googleapis.com \
cloudbuild.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
artifactregistry.googleapis.com \
containerscanning.googleapis.com \
ondemandscanning.googleapis.com \
binaryauthorization.googleapis.com
3. Images mit Cloud Build erstellen
In diesem Abschnitt erstellen Sie eine automatisierte Build-Pipeline, die Ihr Container-Image erstellt, es scannt und anschließend die Ergebnisse auswertet. Wenn keine KRITISCHEN Sicherheitslücken gefunden werden, wird das Image in das Repository verschoben. Wenn KRITISCHE Sicherheitslücken gefunden werden, schlägt der Build fehl und wird beendet.
Zugriff für Cloud Build-Dienstkonto gewähren
Cloud Build benötigt Rechte für den Zugriff auf die On-Demand-Scan-API. Gewähren Sie den Zugriff mit den folgenden Befehlen.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Arbeitsverzeichnis erstellen und dorthin wechseln
mkdir vuln-scan && cd vuln-scan
Beispielbild definieren
Erstellen Sie eine Datei namens Dockerfile mit folgendem Inhalt.
cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a
# System
RUN apt update && apt install python3-pip -y
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
EOF
Erstellen Sie eine Datei namens "main.py" mit folgendem Inhalt:
cat > ./main.py << EOF
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "Worlds")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
Cloud Build-Pipeline erstellen
Mit dem folgenden Befehl wird in Ihrem Verzeichnis die Datei cloudbuild.yaml erstellt, die für den automatisierten Prozess verwendet wird. In diesem Beispiel sind die Schritte auf den Container-Build-Prozess beschränkt. In der Praxis würden Sie jedoch zusätzlich zu den Containerschritten anwendungsspezifische Anweisungen und Tests einbeziehen.
Erstellen Sie die Datei mit dem folgenden Befehl.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
EOF
CI-Pipeline ausführen
Build zur Verarbeitung einreichen
gcloud builds submit
Build-Details überprüfen
Sobald der Build-Prozess gestartet wurde, prüfen Sie den Fortschritt im Cloud Build-Dashboard.
- Öffnen Sie Cloud Build in der Cloud Console.
- Klicken Sie auf den Build, um den Inhalt aufzurufen.
4. Artifact Registry für Container
Artifact Registry-Repository erstellen
In diesem Lab verwenden Sie Artifact Registry zum Speichern und Scannen Ihrer Images. Erstellen Sie das Repository mit dem folgenden Befehl.
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
Konfigurieren Sie Docker so, dass Ihre gcloud-Anmeldedaten für den Zugriff auf Artifact Registry verwendet werden.
gcloud auth configure-docker us-central1-docker.pkg.dev
Cloud Build-Pipeline aktualisieren
Build-Pipeline so ändern, dass das resultierende Image per Push in Artifact Registry übertragen wird
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
# push to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
CI-Pipeline ausführen
Build zur Verarbeitung einreichen
gcloud builds submit
5. Automatisches Scannen auf Sicherheitslücken
Das Scannen von Artefakten wird automatisch ausgelöst, wenn Sie ein neues Image per Push an Artifact Registry oder Container Registry übertragen. Informationen zu Sicherheitslücken werden kontinuierlich aktualisiert, wenn neue Sicherheitslücken entdeckt werden. In diesem Abschnitt sehen Sie sich das Image an, das Sie gerade erstellt und an Artifact Registry übertragen haben, und die Ergebnisse der Sicherheitslücken untersuchen.
Bilddetails prüfen
Sobald der vorherige Build-Prozess abgeschlossen ist, prüfen Sie das Image und die Sicherheitslückenergebnisse im Artifact Registry-Dashboard.
- Öffnen Sie Artifact Registry in der Cloud Console
- Klicken Sie auf das Repository „Artefaktscans“, um den Inhalt anzusehen
- Klicken Sie auf die Bilddetails.
- Klicke auf den neuesten Digest deines Images
- Klicken Sie nach Abschluss des Scans auf den Tab „Sicherheitslücken“ für das Image.
Auf dem Tab „Sicherheitslücken“ werden die Ergebnisse des automatischen Scans für das soeben erstellte Image angezeigt.
Das automatische Scannen ist standardmäßig aktiviert. In den Artifact Registry-Einstellungen erfahren Sie, wie Sie das automatische Scannen aktivieren/deaktivieren.
6. On-Demand-Suche
Es gibt verschiedene Szenarien, in denen Sie möglicherweise einen Scan ausführen müssen, bevor Sie das Image per Push in ein Repository übertragen. Beispielsweise kann ein Containerentwickler ein Image scannen und die Probleme beheben, bevor er Code an die Versionsverwaltung sendet. Im folgenden Beispiel erstellen und analysieren Sie das Image lokal, bevor Sie auf die Ergebnisse reagieren.
Image erstellen
In diesem Schritt erstellen Sie das Image mit lokalem Docker im lokalen Cache.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
Bild scannen
Fordern Sie nach dem Erstellen des Images einen Scan des Images an. Die Ergebnisse des Scans werden auf einem Metadatenserver gespeichert. Der Job wird mit dem Speicherort der Ergebnisse im Metadatenserver abgeschlossen.
gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--format="value(response.scan)" > scan_id.txt
Ausgabedatei prüfen
Nehmen Sie sich einen Moment Zeit, um die Ausgabe des vorherigen Schritts zu lesen, die in der Datei scan_id.txt gespeichert war. Beachten Sie den Speicherort der Scanergebnisse im Metadatenserver.
cat scan_id.txt
Detaillierte Scanergebnisse ansehen
Wenn Sie sich die tatsächlichen Ergebnisse des Scans ansehen möchten, verwenden Sie den Befehl list-vulnerabilities
für den in der Ausgabedatei angegebenen Speicherort des Berichts.
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt)
Die Ausgabe enthält eine erhebliche Menge an Daten zu allen Sicherheitslücken im Image.
Kritische Probleme melden
Die im Bericht gespeicherten Daten werden nur selten direkt von Menschen verwendet. Normalerweise werden die Ergebnisse von einem automatisierten Prozess verwendet. Verwende die folgenden Befehle, um die Berichtsdetails zu lesen und zu protokollieren, ob KRITISCHE Sicherheitslücken gefunden wurden
export SEVERITY=CRITICAL
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi
Die Ausgabe dieses Befehls ist
Failed vulnerability check for CRITICAL level
7. In CICD mit Cloud Build scannen
Zugriff für Cloud Build-Dienstkonto gewähren
Cloud Build benötigt Rechte für den Zugriff auf die On-Demand-Scan-API. Gewähren Sie den Zugriff mit den folgenden Befehlen.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Cloud Build-Pipeline aktualisieren
Mit dem folgenden Befehl wird in Ihrem Verzeichnis die Datei cloudbuild.yaml erstellt, die für den automatisierten Prozess verwendet wird. In diesem Beispiel sind die Schritte auf den Container-Build-Prozess beschränkt. In der Praxis würden Sie jedoch zusätzlich zu den Containerschritten anwendungsspezifische Anweisungen und Tests einbeziehen.
Erstellen Sie die Datei mit dem folgenden Befehl.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
#Run a vulnerability scan at _SECURITY level
- id: scan
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
(gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--location us \
--format="value(response.scan)") > /workspace/scan_id.txt
#Analyze the result of the scan
- id: severity check
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
--format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi
#Retag
- id: "retag"
name: 'gcr.io/cloud-builders/docker'
args: ['tag', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#pushing to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
CI-Pipeline ausführen
Reichen Sie den Build zur Verarbeitung ein, um zu prüfen, ob der Build nicht funktioniert, wenn eine Sicherheitslücke mit dem Schweregrad KRITISCH gefunden wird.
gcloud builds submit
Build-Fehler überprüfen
Der gerade eingereichte Build schlägt fehl, da das Image KRITISCHE Sicherheitslücken enthält.
Prüfen Sie den Build-Fehler auf der Seite Cloud Build-Verlauf
Sicherheitslücke beheben
Aktualisieren Sie das Dockerfile, um ein Basis-Image zu verwenden, das keine KRITISCHEN Sicherheitslücken enthält.
Überschreiben Sie das Dockerfile mit dem folgenden Befehl, um das Debian 10-Image zu verwenden
cat > ./Dockerfile << EOF
from python:3.8-slim
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app
EOF
CI-Prozess mit dem guten Image ausführen
Reichen Sie den Build zur Verarbeitung ein, um zu prüfen, ob der Build erfolgreich ist, wenn keine Sicherheitslücken mit dem Schweregrad KRITISCH gefunden werden.
gcloud builds submit
Build-Erfolg überprüfen
Der soeben eingereichte Build wird erfolgreich sein, da das aktualisierte Image keine KRITISCHEN Sicherheitslücken enthält.
Build-Erfolg auf der Seite Cloud Build-Verlauf prüfen
Scanergebnisse prüfen
Gutes Image in Artifact Registry prüfen
- Öffnen Sie Artifact Registry in der Cloud Console
- Klicken Sie auf das Repository „Artefaktscans“, um den Inhalt anzusehen
- Klicken Sie auf die Bilddetails.
- Klicke auf den neuesten Digest deines Images
- Klicken Sie für das Image auf den Tab „Sicherheitslücken“.
8. Glückwunsch!
Glückwunsch, du hast das Codelab abgeschlossen.
Behandelte Themen:
- Images mit Cloud Build erstellen
- Artifact Registry für Container
- Automatisches Scannen auf Sicherheitslücken
- On-Demand-Suche
- In CICD mit Cloud Build scannen
Nächste Schritte:
- Image-Deployments in Cloud Run und der Google Kubernetes Engine schützen | Cloud Build-Dokumentation
- Kurzanleitung: Richtlinie für die Binärautorisierung mit GKE konfigurieren | Google Cloud
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.
Projekt löschen
Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.
–
Letzte Aktualisierung: 21.03.2023