Analise pacotes do Go manualmente

A API On-Demand Scanning permite-lhe analisar imagens armazenadas localmente no seu computador ou remotamente no Artifact Registry. Pode usar a análise a pedido para analisar imagens no seu pipeline de CI/CD, quanto a vulnerabilidades do sistema e vulnerabilidades de pacotes Go antes de decidir se as armazena num registo. Consulte a página de preços para ver informações de preços.

Esta página descreve como analisar manualmente imagens de contentores para verificar vulnerabilidades do sistema e vulnerabilidades de pacotes Go.

Antes de começar

  1. 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

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

  3. Enable the On-Demand Scanning API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  4. Install the Google Cloud CLI.

  5. Configure a CLI gcloud para usar a sua identidade federada.

    Para mais informações, consulte o artigo Inicie sessão na CLI gcloud com a sua identidade federada.

  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. Adicione o componente local-extract à sua instalação da Google Cloud CLI

    Usar o Gestor de componentes da CLI do Google Cloud

    O gestor de componentes pede-lhe que instale os componentes necessários na primeira vez que executar o comando de análise.

    Usar o gestor 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
          

      Em alternativa, pode substituir dnf por yum no comando anterior.

  8. Conceda a função de IAM Administrador da análise a pedido ao utilizador ou à conta de serviço que vai usar com a análise a pedido. Se estiver a usar a conta de proprietário do projeto para executar as análises, pode ignorar este passo.
  9. Analise uma imagem de contentor

    • Procura local:

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

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

      • REPOSITORY:TAG
      • REPOSITORY
    • Análise 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 elemento 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 tem de incluir o REPOSITORY_ID.

    Para análises locais e remotas, pode usar as seguintes flags opcionais:

    • --location é uma flag opcional para selecionar manualmente a região múltipla onde a análise é realizada. A escolha de uma multirregião mais próxima da sua localização física minimiza a latência. As localizações disponíveis são: us, europe e asia. A localização predefinida é us.

    • --async é uma flag opcional para executar o processo de procura de forma assíncrona. Se omitir esta flag, o terminal fica bloqueado até que o processo de leitura esteja concluído.

    Análise síncrona

    O exemplo seguinte mostra o resultado de uma análise 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 análise para obter os resultados de vulnerabilidades. O nome da análise é o valor de scan na última linha da mensagem de saída.

    Procura assíncrona

    O exemplo seguinte mostra o resultado da execução de uma análise 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
    

    Isto inicia uma operação de longa duração e devolve o respetivo ID sem bloquear o seu terminal. Use o ID da operação, o valor de name na última linha da mensagem de saída, para consultar a operação.

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

    Use o ID da operação da saída do comando de análise assíncrona para verificar o estado da operação:

    gcloud artifacts docker images get-operation LRO_ID
    

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

    Continuando com o exemplo da secção de análise assíncrona, para verificar o estado 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 análise está concluída. Use o nome da análise para obter os resultados de vulnerabilidades. O nome é o valor de scan na última linha da mensagem de saída.

    Obtenha os resultados da análise

    Para obter os resultados da análise após a conclusão da operação de análise, use o seguinte comando:

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

    Onde:

    Por 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
    

    O resultado deste comando é uma lista de ocorrências no formato Grafeas. Neste caso, é apresentada uma vulnerabilidade de gravidade elevada encontrada na imagem.

    A análise a pedido identifica dois tipos de vulnerabilidades de pacotes Go:

    • packageType:GO_STDLIB. Aceda a vulnerabilidades da biblioteca padrão. Isto indica que a vulnerabilidade foi encontrada na cadeia de ferramentas Go usada para criar o ficheiro binário ou na biblioteca padrão incluída na cadeia de ferramentas. Uma possível correção é atualizar a cadeia de ferramentas de compilação.

    • packageType:GO. Go package vulnerabilities. Isto indica que a vulnerabilidade foi encontrada num pacote de terceiros. Uma possível correção é atualizar os módulos dependentes.

    Os resultados da análise estão disponíveis durante 48 horas após a conclusão da operação de análise.

    O que se segue?