Cómo analizar paquetes de Go de forma manual

La API de On-Demand Scanning te permite analizar imágenes almacenadas de forma local en tu computadora o de forma remota en Artifact Registry. Puedes usar On-Demand Scanning para analizar imágenes en tu canalización de CI/CD en busca de vulnerabilidades del sistema y de paquetes de Go antes de decidir si 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 en busca de vulnerabilidades del sistema y de paquetes de Go.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. 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

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

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

  5. Instala Google Cloud CLI.

  6. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI 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.

    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

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

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

  11. Instala Google Cloud CLI.

  12. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

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

    gcloud init
  14. Agrega el componente local-extract a tu instalación de Google Cloud CLI

    Cómo usar el Administrador de componentes de Google Cloud CLI

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

    Cómo usar el administrador de paquetes del 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, puedes reemplazar dnf por yum en el comando anterior.

  15. Otorga el rol de IAM Administrador de On-Demand Scanning al usuario o la cuenta de servicio que usarás con On-Demand Scanning. Si usas la cuenta del propietario del proyecto para ejecutar los análisis, puedes omitir este paso.

Analiza una imagen de contenedor

  • Búsqueda local:

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

    Para una imagen local, usa uno de los siguientes formatos para IMAGE_URI:

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

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

    Para una imagen remota, usa uno de los siguientes formatos para 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 en Artifact Registry, IMAGE_URI debe incluir REPOSITORY_ID.

Para los análisis locales y 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. Elegir una multirregión más cercana a tu ubicación física minimiza 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 omites esta marca, tu 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 realizar un análisis asíncrono:

$ 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

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

Sondea la operación de larga duración

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

gcloud artifacts docker images get-operation LRO_ID

En este ejemplo, LRO_ID es el ID de la operación de larga duración.

Continuando con el ejemplo de la sección de análisis asíncrono, para verificar 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, se completó la operación de análisis. Usa el nombre del análisis para recuperar los resultados de vulnerabilidades. El nombre es el valor de scan en la última línea del mensaje de salida.

Recupera los resultados del análisis

Para recuperar los resultados del análisis después de que se complete la operación, usa el siguiente comando:

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

Aquí:

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 ocurrencias en formato de Grafeas. En este caso, se muestra una vulnerabilidad de gravedad alta que se encontró en la imagen.

El análisis a pedido identifica dos tipos de vulnerabilidades de paquetes de Go:

  • packageType:GO_STDLIB. Vulnerabilidades de la biblioteca estándar de Go Esto indica que la vulnerabilidad se encontró en la cadena de herramientas de Go que se usó para compilar el archivo binario o en la biblioteca estándar incluida en la cadena de herramientas. Una posible solución es actualizar tu cadena de herramientas de compilación.

  • packageType:GO. Vulnerabilidades de paquetes de Go Esto indica que se encontró la vulnerabilidad 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 completa la operación de análisis.

¿Qué sigue?