Go-Pakete manuell scannen

Mit der On-Demand Scanning API können Sie Images scannen, die lokal auf Ihrem Computer oder remote in Artifact Registry gespeichert sind. Mit On-Demand-Scans können Sie Images in Ihrer CI/CD-Pipeline auf System- und Go-Paket-Sicherheitslücken scannen, bevor Sie entscheiden, ob Sie sie in einer Registry speichern möchten. Preisinformationen finden Sie auf der Seite „Preise“.

Auf dieser Seite wird beschrieben, wie Sie Container-Images manuell auf Systemsicherheitslücken und Sicherheitslücken in Go-Paketen scannen.

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 API, if it is 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 API

  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 API, if it is 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 API

  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
  14. Fügen Sie die Komponente local-extract zu Ihrer Google Cloud CLI-Installation hinzu.

    Google Cloud CLI-Komponentenmanager verwenden

    Der Komponentenmanager fordert Sie auf, die erforderlichen Komponenten zu installieren, wenn Sie den Scanbefehl zum ersten Mal ausführen.

    Systempaketmanager verwenden

    • Für Debian/Ubuntu:
      sudo apt install google-cloud-sdk-local-extract
          
    • Für Red Hat/Fedora/CentOS:
      sudo dnf install google-cloud-sdk-local-extract
          

      Alternativ können Sie im vorherigen Befehl dnf durch yum ersetzen.

  15. Weisen Sie dem Nutzer- oder Dienstkonto, das Sie für On-Demand-Scans verwenden möchten, die IAM-Rolle On-Demand Scanning Admin zu. Wenn Sie die Scans mit dem Eigentümerkonto des Projekts ausführen, können Sie diesen Schritt überspringen.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für das Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Aufrufen von Paketscanergebnissen benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Container-Image scannen

  • Lokaler Scan:

    gcloud artifacts docker images scan IMAGE_URI \
        [--location=(us,europe,asia)] [--async]
    

    Verwenden Sie für ein lokales Bild eines der folgenden Formate für IMAGE_URI:

    • REPOSITORY:TAG
    • REPOSITORY
  • Remote-Scan:

    gcloud artifacts docker images scan IMAGE_URI \
        --remote [--location=(us,europe,asia)] [--async]
    

    Verwenden Sie für ein Remote-Bild eines der folgenden Formate für IMAGE_URI:

    • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID@sha256:HASH
    • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID:HASH
    • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID
    • HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
    • HOSTNAME/PROJECT_ID/IMAGE_ID:HASH
    • HOSTNAME/PROJECT_ID/IMAGE_ID

    Bei Images in Artifact Registry muss IMAGE_URI die REPOSITORY_ID enthalten.

Sowohl für lokale als auch für Remote-Scans können Sie die folgenden optionalen Flags verwenden:

  • --location ist ein optionales Flag, mit dem Sie manuell die multiregionale Region auswählen können, in der der Scan durchgeführt wird. Wenn Sie einen multiregionalen Standort auswählen, der sich näher an Ihrem physischen Standort befindet, wird die Latenz minimiert. Die verfügbaren Standorte sind us, europe und asia. Der standardmäßige Standort ist us.

  • --async ist ein optionales Flag, mit dem der Scanvorgang asynchron ausgeführt wird. Wenn Sie dieses Flag weglassen, wird Ihr Terminal blockiert, bis der Scanvorgang abgeschlossen ist.

Synchrones Scannen

Das folgende Beispiel zeigt die Ausgabe eines synchronen Scans ohne das Flag --async:

$ gcloud artifacts docker images scan golang:1.17.6-alpine

✓ Scanning container image
  ✓ Locally extracting packages and versions from local container image
  ✓ Remotely initiating analysis of packages and versions
  ✓ Waiting for analysis operation to complete [projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7]
Done.
done: true
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2022-01-11T16:58:11.711487Z'
  resourceUri: golang:1.16.13-alpine
name: projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7
response:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
  scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a

Verwenden Sie den Scannamen, um die Ergebnisse der Sicherheitslücken abzurufen. Der Scanname ist der Wert von scan in der letzten Zeile der Ausgabemeldung.

Asynchrones Scannen

Das folgende Beispiel zeigt die Ausgabe eines asynchronen Scans:

$ gcloud artifacts docker images scan golang:1.17.6-alpine --async

✓ Scanning container image
  ✓ Locally extracting packages and versions from local container image
  ✓ Remotely initiating analysis of packages and versions
Done.
Check operation [projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16] for status.
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2022-01-11T16:58:11.711487Z'
  resourceUri: golang:1.16.13-alpine
name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16

Dadurch wird ein Vorgang mit langer Ausführungszeit gestartet und seine ID zurückgegeben, ohne dass Ihr Terminal blockiert wird. Verwenden Sie die Vorgangs-ID, den Wert von name in der letzten Zeile der Ausgabemeldung, um den Vorgang abzufragen.

Vorgang mit langer Ausführungszeit abfragen

Verwenden Sie die Vorgangs-ID aus der Ausgabe des asynchronen Scanbefehls, um den Vorgangsstatus zu prüfen:

gcloud artifacts docker images get-operation LRO_ID

Dabei ist LRO_ID die ID des Vorgangs mit langer Ausführungszeit.

Wenn wir mit dem Beispiel aus dem Abschnitt zum asynchronen Scannen fortfahren, gehen Sie so vor, um den Status des Vorgangs zu prüfen:

$ gcloud artifacts docker images get-operation \
  projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2022-01-11T16:58:11.711487Z'
  resourceUri: golang:1.16.13-alpine
name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
response:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
  scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a

Wenn die Ausgabe die Zeile done: true enthält, ist der Scanvorgang abgeschlossen. Verwenden Sie den Scannamen, um die Ergebnisse der Sicherheitslücken abzurufen. Der Name ist der Wert von scan in der letzten Zeile der Ausgabemeldung.

Scanergebnisse abrufen

Verwenden Sie den folgenden Befehl, um die Scanergebnisse nach Abschluss des Scanvorgangs abzurufen:

gcloud artifacts docker images list-vulnerabilities SCAN_NAME [--limit=X]

Wobei:

Beispiel:

createTime: '2022-01-11T16:58:11.972043Z'
kind: VULNERABILITY
name: projects/my-project/locations/us/occurrences/0c607d9b-aff4-4cde-86b7-e2c0a865aadd
noteName: projects/goog-vulnz/notes/CVE-2021-38297
resourceUri: golang:1.16.13-alpine
updateTime: '2022-01-11T16:58:11.972043Z'
vulnerability:
  cvssScore: 7.5
  effectiveSeverity: CRITICAL
  longDescription: Go before 1.16.9 and 1.17.x before 1.17.2 has a Buffer Overflow
    via large arguments in a function invocation from a WASM module, when GOARCH=wasm
    GOOS=js is used.
  packageIssue:
  - affectedCpeUri: cpe:/o:alpine:alpine_linux:3.15
    affectedPackage: go
    affectedVersion:
      fullName: 1.16.13
      kind: NORMAL
      name: 1.16.13
    effectiveSeverity: CRITICAL
    fixedCpeUri: cpe:/o:alpine:alpine_linux:3.15
    fixedPackage: go
    fixedVersion:
      fullName: 1.17.2
      kind: NORMAL
      name: 1.17.2
    packageType: GO_STDLIB
  relatedUrls:
  - label: More Info
    url: https://security-tracker.debian.org/tracker/CVE-2021-38297
  - label: More Info
    url: https://access.redhat.com/security/cve/CVE-2021-38297
  - label: More Info
    url: https://nvd.nist.gov/vuln/detail/CVE-2021-38297
  severity: HIGH
  shortDescription: CVE-2021-38297

Die Ausgabe dieses Befehls ist eine Liste der Vorkommen im Grafeas-Format. In diesem Fall wird eine Sicherheitslücke mit hohem Schweregrad angezeigt, die im Image gefunden wurde.

Beim On-Demand-Scannen werden zwei Arten von Sicherheitslücken in Go-Paketen erkannt:

  • packageType:GO_STDLIB. Sicherheitslücken in der Go-Standardbibliothek. Dies weist darauf hin, dass die Sicherheitslücke entweder in der Go-Toolchain, die zum Erstellen der Binärdatei verwendet wurde, oder in der Standardbibliothek, die mit der Toolchain gebündelt ist, gefunden wurde. Eine mögliche Lösung besteht darin, Ihre Build-Toolchain zu aktualisieren.

  • packageType:GO. Sicherheitslücken in Go-Paketen. Dies weist darauf hin, dass die Sicherheitslücke in einem Drittanbieterpaket gefunden wurde. Eine mögliche Lösung besteht darin, die abhängigen Module zu aktualisieren.

Die Scanergebnisse sind 48 Stunden nach Abschluss des Scanvorgangs verfügbar.

Nächste Schritte