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 oder Container Registry gespeichert sind. Mit On-Demand-Scanning können Sie Images in Ihrer CI/CD-Pipeline auf System- und Go-Paketsicherheitslücken scannen, bevor Sie entscheiden, ob Sie sie in einer Registry speichern möchten. Preisinformationen finden Sie auf der Preisseite.

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

Hinweise

  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 On-Demand Scanning API.

    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.

    Go to project selector

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

  10. Enable the On-Demand Scanning API.

    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 Ihrer Google Cloud CLI-Installation die Komponente local-extract hinzu.

    Google Cloud CLI Component Manager 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 das On-Demand-Scanning 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.
  16. 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 den multiregionalen Standort auswählen können, an dem der Scan durchgeführt wird. Wenn Sie einen multiregionalen Standort auswählen, der Ihrem physischen Standort am nächsten ist, wird die Latenz minimiert. Die verfügbaren Standorte sind us, europe und asia. Der Standardspeicherort 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ückenprüfung abzurufen. Der Scanname ist der Wert von scan in der letzten Zeile der Ausgabenachricht.

    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 das Beispiel aus dem Abschnitt zum asynchronen Scannen fortsetzen, 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 zu Sicherheitslücken abzurufen. Der Name ist der Wert von scan in der letzten Zeile der Ausgabenachricht.

    Scanergebnisse abrufen

    Verwenden Sie den folgenden Befehl, um die Scanergebnisse abzurufen, nachdem der Scanvorgang abgeschlossen ist:

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

    Wobei:

    • SCAN_NAME ist der Name des Scans. Sie finden sie in der letzten Zeile der Ausgabe, wenn Sie entweder einen synchronen Scan ausführen oder den lang andauernden Vorgang abfragen, nachdem der Scan abgeschlossen ist.

    • --limit=X ist ein optionales Flag, mit dem die Anzahl der in der Ausgabe angezeigten Vorkommen begrenzt wird. X ist ein numerischer Wert.

    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 gefunden wurde, die zum Erstellen des Binärprogramms verwendet wurde, oder in der Standardbibliothek, die in der Toolchain enthalten ist. 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 Scans verfügbar.

    Nächste Schritte