Verificar pacotes Go manualmente

A API On-Demand Scanning permite verificar imagens armazenadas localmente no computador ou remotamente no Artifact Registry ou no Container Registry. É possível usar a verificação sob demanda para verificar imagens no pipeline de CI/CD em busca de vulnerabilidades do sistema e do pacote Go antes de decidir se elas serão armazenadas em um registro. Consulte a página de preços para mais informações.

Esta página descreve como verificar manualmente imagens de contêiner em busca de vulnerabilidades do sistema e dos pacotes Go.

Antes de começar

  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. Adicione o componente local-extract à instalação da Google Cloud CLI

    Como usar o Gerenciador de componentes da CLI do Google Cloud

    O gerenciador de componentes vai solicitar a instalação dos componentes necessários na primeira vez que você executar o comando de verificação.

    Como usar o gerenciador de pacotes do sistema

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

      Como alternativa, substitua dnf por yum no comando anterior.

  13. Conceda o papel do IAM Administrador de verificação sob demanda à conta de usuário ou de serviço que você vai usar com a verificação sob demanda. Se você estiver usando a conta de proprietário do projeto para executar as verificações, pule esta etapa.

Verificar uma imagem de contêiner

  • Busca local:

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

    Para uma imagem local, use um dos seguintes formatos para o IMAGE_URI:

    • REPOSITORY:TAG
    • REPOSITORY
  • Varredura remota:

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

    Para uma imagem remota, use um dos seguintes formatos para o 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

    Para imagens no Artifact Registry, o IMAGE_URI precisa incluir o REPOSITORY_ID.

Para verificações locais e remotas, use as seguintes flags opcionais:

  • --location é uma flag opcional para selecionar manualmente a multirregião em que a verificação é realizada. Escolher uma multirregião mais próxima da sua localização física minimiza a latência. Os locais disponíveis são: us, europe e asia. O local padrão é us.

  • --async é uma flag opcional para executar o processo de verificação de forma assíncrona. Se você omitir essa flag, o terminal será bloqueado até que o processo de verificação seja concluído.

Verificação síncrona

O exemplo a seguir mostra a saída de uma verificação síncrona, sem a 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

Use o nome da verificação para extrair os resultados de vulnerabilidade. O nome da verificação é o valor de scan na última linha da mensagem de saída.

Verificação assíncrona

O exemplo a seguir mostra a saída da execução de uma verificação assíncrona:

$ 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

Isso inicia uma operação de longa duração e retorna o ID dela sem bloquear o terminal. Use o ID da operação, o valor de name na última linha da mensagem de saída, para pesquisar a operação.

Pesquisar a operação de longa duração

Use o ID da operação da saída do comando de verificação assíncrona para verificar o status da operação:

gcloud artifacts docker images get-operation LRO_ID

em que LRO_ID é o ID da operação de longa duração.

Continuando com o exemplo da seção de verificação assíncrona, para verificar o status da operação:

$ 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 a saída incluir a linha done: true, a operação de verificação será concluída. Use o nome da verificação para recuperar os resultados de vulnerabilidade. O nome é o valor de scan na última linha da mensagem de saída.

Extrair os resultados da verificação

Para extrair os resultados da verificação após a conclusão da operação, use o seguinte comando:

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

Em que:

Exemplo:

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

A saída desse comando é uma lista de ocorrências no formato Grafeas. Nesse caso, ele mostra uma vulnerabilidade de alta gravidade encontrada na imagem.

A verificação sob demanda identifica dois tipos de vulnerabilidades de pacotes Go:

  • packageType:GO_STDLIB. Vulnerabilidades da biblioteca padrão do Go. Isso indica que a vulnerabilidade foi encontrada na cadeia de ferramentas do Go usada para criar o binário ou na biblioteca padrão empacotada com a cadeia de ferramentas. Uma possível solução é fazer upgrade do conjunto de ferramentas de build.

  • packageType:GO. Vulnerabilidades no pacote do Go. Isso indica que a vulnerabilidade foi encontrada em um pacote de terceiros. Uma possível correção é atualizar os módulos dependentes.

Os resultados da verificação ficam disponíveis por 48 horas após a conclusão da operação.

A seguir