Eseguire la scansione dei pacchetti Go manualmente

L'API On-Demand Scanning ti consente di eseguire la scansione delle immagini archiviate localmente sul computer o da remoto in Artifact Registry o Container Registry. Puoi utilizzare la scansione on demand per eseguire la scansione delle immagini nella pipeline CI/CD per rilevare le vulnerabilità del sistema e del pacchetto Go prima di decidere se archiviarle in un registry. Per informazioni sui prezzi, consulta la pagina dei prezzi.

Questa pagina descrive come analizzare manualmente le immagini container per rilevare vulnerabilità del sistema e dei pacchetti Go.

Prima di iniziare

  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. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

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

  9. Enable the On-Demand Scanning API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Aggiungi il componente local-extract all'installazione di Google Cloud CLI

    Utilizzare il gestore dei componenti di Google Cloud CLI

    Il gestore dei componenti ti chiederà di installare i componenti richiesti la prima volta che eseguirete il comando di scansione.

    Utilizzare il gestore dei pacchetti di sistema

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

      In alternativa, puoi sostituire dnf con yum nel comando precedente.

  13. Concedi il ruolo IAM Amministratore della ricerca on demand all'utente o all'account di servizio che intendi utilizzare con la ricerca on demand. Se utilizzi l'account proprietario del progetto per eseguire le analisi, puoi saltare questo passaggio.

Eseguire la scansione di un'immagine container

  • Ricerca locale:

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

    Per un'immagine locale, utilizza uno dei seguenti formati per IMAGE_URI:

    • REPOSITORY:TAG
    • REPOSITORY
  • Scansione da remoto:

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

    Per un'immagine remota, utilizza uno dei seguenti formati per 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

    Per le immagini in Artifact Registry, IMAGE_URI deve includere REPOSITORY_ID.

Per le analisi locali e remote, puoi utilizzare i seguenti flag facoltativi:

  • --location è un flag facoltativo per selezionare manualmente la regione multipla in cui avviene la scansione. La scelta di una regione multipla più vicina alla tua posizione fisica consente di ridurre al minimo la latenza. Le località disponibili sono: us, europe e asia. La posizione predefinita è us.

  • --async è un flag facoltativo per eseguire il processo di scansione in modo asincrono. Se ometti questo flag, il terminale si bloccherà fino al completamento del processo di scansione.

Scansione sincrona

L'esempio seguente mostra l'output di una ricerca sincrona, senza il 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

Utilizza il nome della scansione per recuperare i risultati relativi alle vulnerabilità. Il nome della scansione è il valore di scan nell'ultima riga del messaggio di output.

Scansione asincrona

L'esempio seguente mostra l'output dell'esecuzione di una ricerca asincrona:

$ 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

Viene avviata un'operazione a lunga esecuzione e viene restituito il relativo ID senza bloccare il terminale. Utilizza l'ID operazione, il valore di name nell'ultima riga del messaggio di output, per eseguire il polling dell'operazione.

Esegui il polling dell'operazione a lunga esecuzione

Utilizza l'ID operazione dell'output del comando di scansione asincrona per controllare lo stato dell'operazione:

gcloud artifacts docker images get-operation LRO_ID

Dove LRO_ID è l'ID operazione a lunga esecuzione.

Continuando con l'esempio della sezione relativa alla scansione asincrona, per controllare lo stato dell'operazione:

$ 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

Se l'output include la riga done: true, l'operazione di scansione è stata completata. Utilizza il nome della scansione per recuperare i risultati relativi alle vulnerabilità. Il nome è il valore di scan nell'ultima riga del messaggio di output.

Recuperare i risultati della scansione

Per recuperare i risultati della scansione al termine dell'operazione, utilizza il seguente comando:

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

Dove:

Ad esempio:

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

L'output di questo comando è un elenco di occorrenze nel formato Grafeas. In questo caso, viene mostrata una vulnerabilità di gravità elevata trovata nell'immagine.

La scansione on demand identifica due tipi di vulnerabilità dei pacchetti Go:

  • packageType:GO_STDLIB. Vai alle vulnerabilità della libreria standard. Ciò indica che la vulnerabilità è stata trovata nella toolchain Go utilizzata per compilare il file binario o nella libreria standard inclusa nella toolchain. Un possibile correzione è eseguire l'upgrade della toolchain di compilazione.

  • packageType:GO. Vai alle vulnerabilità dei pacchetti. Ciò indica che la vulnerabilità è stata trovata in un pacchetto di terze parti. Una possibile soluzione è eseguire l'upgrade dei moduli dipendenti.

I risultati della scansione sono disponibili per 48 ore dal completamento dell'operazione.

Passaggi successivi