On-Demand-Scanning in Ihrer Cloud Build-Pipeline verwenden

Wenn Sie On-Demand-Scanning als Teil Ihrer Cloud Build-Pipeline verwenden, können Sie Builds blockieren, wenn das Container-Image Sicherheitslücken mit einem Schweregrad aufweist, der einem vordefinierten Niveau entspricht.

In dieser Anleitung erfahren Sie, wie Sie mit Cloud Build Ihr Container-Image aus dem Quellcode erstellen, es auf Sicherheitslücken scannen, die Schweregrade der Sicherheitslücken prüfen und das Image in Artifact Registry übertragen, wenn keine Sicherheitslücken mit einem bestimmten Schweregrad vorhanden sind.

Wir empfehlen, für diese Anleitung ein neues Google Cloud Projekt zu erstellen und die Schritte in einer isolierten Umgebung auszuführen.

Ziele

  • Erstellen Sie mit Cloud Build ein Image.
  • Scannen Sie das erstellte Image mit On-Demand-Scans.
  • Bewerten Sie akzeptable Sicherheitslückenebenen.
  • Speichern Sie das Image in Artifact Registry.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

Neuen Nutzern von Google Cloud steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init

Erforderliche Rollen

Das Dienstkonto, das Sie mit Cloud Build verwenden, benötigt die folgenden Rollen:

Das Standard-Cloud Build-Dienstkonto hat die erforderlichen Berechtigungen für Artifact Registry-Repositories im selben Projekt. Wenn sich Ihre Repositories im selben Projekt befinden, das Sie für Cloud Build verwenden, müssen Sie nur die Rolle „On-Demand Scanning Admin“ zuweisen.

Wenn Sie ein vom Nutzer bereitgestelltes Dienstkonto für Cloud Build verwenden, müssen Sie beide Rollen zuweisen.

Quelldatei vorbereiten

In dieser Anleitung erstellen Sie ein Image aus einem Dockerfile. Ein Dockerfile ist eine Quelldatei, die Anweisungen für Docker zum Erstellen eines Images enthält.

  1. Öffnen Sie ein Terminal, erstellen Sie ein neues Verzeichnis mit dem Namen ods-tutorial und rufen Sie es auf:

    mkdir ods-tutorial && cd ods-tutorial
    
  2. Erstellen Sie eine Datei mit dem Namen Dockerfile und mit folgendem Inhalt:

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

Artifact Registry-Repository erstellen

  1. Legen Sie als Projekt-ID das Projekt fest, in dem Sie die APIs aktiviert haben:

    gcloud config set project PROJECT_ID
    
  2. Erstellen Sie am Speicherort us-central1 ein neues Docker-Repository namens ods-build-repo:

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. Prüfen Sie, ob das Repository erfolgreich erstellt wurde:

    gcloud artifacts repositories list
    

Build erstellen und scannen

In diesem Abschnitt führen Sie Ihre Build-Pipeline aus. Dazu verwenden Sie eine Build-Konfigurationsdatei. Eine Build-Konfigurationsdatei enthält Anweisungen für Cloud Build, wie verschiedene Aufgaben gemäß Ihren Spezifikationen ausgeführt werden sollen.

  1. Erstellen Sie im Ordner ods-tutorial/ die Datei cloudbuild.yaml mit folgendem Inhalt:

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    Diese Datei enthält den Speicherort und das Repository, die zuvor in Artifact Registry erstellt wurden. Wenn Sie andere Werte verwenden möchten, ändern Sie die Datei cloudbuild.yaml entsprechend. Die Werte für PROJECT_ID und SEVERITY werden im Build-Befehl an das Skript übergeben.

  2. Geben Sie die SEVERITY-Schweregrade an, die Sie blockieren möchten, und starten Sie den Build.

    Sie können die folgenden Werte für SEVERITY verwenden:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    Sie können mehrere Schweregrade mit einem regulären Ausdruck angeben.

    Im folgenden Beispiel geben Sie sowohl den Schweregradwert CRITICAL als auch den Schweregradwert HIGH an. Dadurch wird Cloud Build angewiesen, nach Sicherheitslücken zu suchen, die mit dem Schweregrad HIGH oder höher klassifiziert sind.

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    Wo

    • PROJECT_ID ist die Projekt-ID.
    • Mit SEVERITY können Sie die Schweregrade festlegen, die Sie blockieren möchten. Wenn beim On-Demand-Scan Sicherheitslücken gefunden werden, die einem der angegebenen Schweregrade entsprechen, schlägt der Build fehl.

Ergebnisse interpretieren

Wenn Sie den Wert SEVERITY auf CRITICAL|HIGH festlegen, wird nach dem On-Demand-Scan auf Sicherheitslücken geprüft, ob Sicherheitslücken auf der Ebene HIGH und der schwerwiegenderen Ebene CRITICAL vorhanden sind. Wenn in Ihrem Image keine übereinstimmenden Sicherheitslücken gefunden werden, ist der Build erfolgreich und Cloud Build überträgt Ihr Image an Artifact Registry.

Die Ausgabe sieht etwa so aus:

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

Wenn beim On-Demand-Scan HIGH- oder CRITICAL-Sicherheitslücken in Ihrem Image gefunden werden, schlägt der scan-Build-Schritt fehl, nachfolgende Build-Schritte werden nicht gestartet und Cloud Build überträgt kein Image an Artifact Registry.

Die Ausgabe sieht etwa so aus:

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

In dieser Anleitung können die Ergebnisse variieren, da der Beispielquellcode eine öffentlich verfügbare Linux-Distribution (debian10:latest) ist. Linux-Distributionen und zugehörige Sicherheitslückendaten werden laufend aktualisiert.

Google Cloud Weitere Tools und Best Practices zum Schutz Ihrer Softwarelieferkette finden Sie unter Sicherheit der Softwarelieferkette.

Weitere Informationen zu Best Practices für die Verwaltung von Linux-Sicherheitslücken finden Sie in den kostenlosen Onlineschulungen der Linux Foundation. Weitere Informationen finden Sie unter Sichere Software entwickeln.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

  1. Wechseln Sie in der Google Cloud -Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Einzelne Ressourcen löschen

Prüfen Sie vor dem Entfernen des Repositorys, ob alle Bilder, die Sie beibehalten möchten, an einem anderen Speicherort verfügbar sind.

So löschen Sie das Repository:

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Repositories.

    Zur Seite „Repositories“

  2. Wählen Sie in der Repository-Liste das Repository ods-build-repo aus.

  3. Klicken Sie auf Löschen.

gcloud

Führen Sie den folgenden Befehl aus, um das Repository ods-build-repo zu löschen:

gcloud artifacts repositories delete ods-build-repo --location=us-central1

Nächste Schritte