Analizar paquetes de Go manualmente

La API On-Demand Scanning te permite analizar imágenes almacenadas de forma local en tu ordenador o de forma remota en Artifact Registry. Puedes usar el análisis bajo demanda para analizar imágenes en tu flujo de procesamiento de CI/CD en busca de vulnerabilidades del sistema y de paquetes Go antes de decidir si quieres almacenarlas en un registro. Consulta la página de precios para obtener información sobre los precios.

En esta página se describe cómo analizar manualmente las imágenes de contenedor para detectar vulnerabilidades del sistema y vulnerabilidades de paquetes de Go.

Antes de empezar

  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. Verify 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. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    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. Verify 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. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Añade el componente local-extract a tu instalación de la CLI de Google Cloud

    Usar el gestor de componentes de Google Cloud CLI

    El gestor de componentes te pedirá que instales los componentes necesarios la primera vez que ejecutes el comando de análisis.

    Usar el gestor de paquetes del sistema

    • En Debian o Ubuntu:
      sudo apt install google-cloud-sdk-local-extract
          
    • En Red Hat, Fedora o CentOS:
      sudo dnf install google-cloud-sdk-local-extract
          

      También puedes sustituir dnf por yum en el comando anterior.

  15. Asigna el rol de IAM Administrador de análisis bajo demanda al usuario o a la cuenta de servicio que vayas a usar con Análisis bajo demanda. Si usas la cuenta de propietario del proyecto para ejecutar los análisis, puedes saltarte este paso.
  16. Analizar una imagen de contenedor

    • Búsqueda local:

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

      En el caso de una imagen local, utiliza uno de los siguientes formatos para el elemento IMAGE_URI:

      • REPOSITORY:TAG
      • REPOSITORY
    • Análisis remoto:

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

      En el caso de una imagen remota, usa uno de los siguientes formatos para el 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

      En el caso de las imágenes de Artifact Registry, el IMAGE_URI debe incluir el REPOSITORY_ID.

    Tanto en los análisis locales como en los remotos, puedes usar las siguientes marcas opcionales:

    • --location es una marca opcional para seleccionar manualmente la multirregión en la que se realiza el análisis. Si eliges una multirregión más cercana a tu ubicación física, se minimizará la latencia. Las ubicaciones disponibles son us, europe y asia. La ubicación predeterminada es us.

    • --async es una marca opcional para ejecutar el proceso de análisis de forma asíncrona. Si omite esta marca, su terminal se bloqueará hasta que se complete el proceso de análisis.

    Análisis síncrono

    En el siguiente ejemplo se muestra el resultado de un análisis síncrono sin la marca --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
    

    Usa el nombre del análisis para recuperar los resultados de vulnerabilidades. El nombre del análisis es el valor de scan en la última línea del mensaje de salida.

    Análisis asíncrono

    En el siguiente ejemplo se muestra el resultado de una comprobación así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
    

    Se inicia una operación de larga duración y se devuelve su ID sin bloquear tu terminal. Usa el ID de operación, el valor de name en la última línea del mensaje de salida, para sonde la operación.

    Sondear la operación de larga duración

    Usa el ID de operación de la salida del comando de análisis asíncrono para comprobar el estado de la operación:

    gcloud artifacts docker images get-operation LRO_ID
    

    donde LRO_ID es el ID de la operación de larga duración.

    Siguiendo con el ejemplo de la sección de análisis asíncrono, para comprobar el estado de la operación, haz lo siguiente:

    $ 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
    

    Si el resultado incluye la línea done: true, la operación de análisis se habrá completado. Usa el nombre del análisis para obtener los resultados de vulnerabilidades. El nombre es el valor de scan en la última línea del mensaje de salida.

    Recuperar los resultados del análisis

    Para obtener los resultados del análisis una vez que se haya completado, usa el siguiente comando:

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

    Donde:

    Por ejemplo:

    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
    

    El resultado de este comando es una lista de incidencias en formato Grafeas. En este caso, se muestra una vulnerabilidad de alta gravedad encontrada en la imagen.

    El análisis bajo demanda identifica dos tipos de vulnerabilidades de paquetes de Go:

    • packageType:GO_STDLIB. Go standard library vulnerabilities. Esto indica que la vulnerabilidad se ha encontrado en la cadena de herramientas de Go usada para compilar el archivo binario o en la biblioteca estándar incluida en la cadena de herramientas. Una posible solución es actualizar la cadena de herramientas de compilación.

    • packageType:GO. Vulnerabilidades de paquetes de Go. Esto indica que la vulnerabilidad se ha encontrado en un paquete de terceros. Una posible solución es actualizar los módulos dependientes.

    Los resultados del análisis están disponibles durante 48 horas después de que se complete la operación.

    Siguientes pasos