En este documento se explica cómo habilitar la API Container Scanning, enviar una imagen a Artifact Registry y ver la lista de vulnerabilidades encontradas en la imagen.
Artifact Analysis almacena información sobre vulnerabilidades como notas. Se crea una ocurrencia por cada instancia de una nota asociada a una imagen. Consulta los documentos de información general y precios para obtener más información.
Antes de empezar
- 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.
-
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry and Container Scanning APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry and Container Scanning APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Crea un repositorio de Docker en Artifact Registry y envía una imagen de contenedor con tu código Go al repositorio. Si no estás familiarizado con Artifact Registry, consulta la guía de inicio rápido de Docker.
Para obtener información sobre cómo usar Cloud Build para compilar y contenerizar tus aplicaciones Go, consulta Compilar aplicaciones Go.
Ver las vulnerabilidades de la imagen
Artifact Analysis analiza las imágenes nuevas cuando se suben a Artifact Registry. Este análisis extrae información sobre los paquetes del contenedor.
Puedes ver las vulnerabilidades de tus imágenes en Artifact Registry mediante la Google Cloud consola, la CLI de Google Cloud o la API Container Analysis. Si una imagen tiene vulnerabilidades, puedes obtener los detalles.
Análisis de artefactos solo actualiza los metadatos de las imágenes que se han enviado o extraído en los últimos 30 días. Transcurridos 30 días, los metadatos dejarán de actualizarse y los resultados estarán obsoletos. Además, Análisis de artefactos archiva los metadatos que no se han actualizado en más de 90 días, y estos no estarán disponibles en la consola, gcloud ni mediante la API. Google Cloud Para volver a analizar una imagen con metadatos obsoletos o archivados, extrae esa imagen. La actualización de los metadatos puede tardar hasta 24 horas.
Ver las incidencias en la consola Google Cloud
Para ver las vulnerabilidades de una imagen, sigue estos pasos:
Obtén la lista de repositorios.
En la lista de repositorios, haz clic en uno.
En la lista de imágenes, haz clic en el nombre de una imagen.
Los totales de vulnerabilidades de cada digest de imagen se muestran en la columna Vulnerabilidades.
Para ver la lista de vulnerabilidades de una imagen, haga clic en el enlace de la columna Vulnerabilidades.
En la sección Resultados del análisis se muestra un resumen de los tipos de paquetes analizados, el número total de vulnerabilidades, las vulnerabilidades con correcciones disponibles, las vulnerabilidades sin correcciones y la gravedad efectiva.
En la tabla de vulnerabilidades se indica el nombre de la lista Common Vulnerabilities and Exposures (CVE) de cada vulnerabilidad detectada, la gravedad efectiva, la puntuación del sistema de puntuación de vulnerabilidades común (CVSS), las correcciones (si están disponibles), el nombre del paquete que contiene la vulnerabilidad y el tipo de paquete. Puede filtrar y ordenar estos archivos para consultar un archivo, un directorio o un tipo de archivo específico por extensión de archivo. Google Cloud La consola muestra hasta 1200 vulnerabilidades por página en esta tabla.
Para obtener información sobre una CVE específica, haz clic en su nombre.
Para ver los detalles de la vulnerabilidad, como el número de versión y la ubicación afectada, haga clic en Ver o Ver corregido en la fila con el nombre de la vulnerabilidad. El texto del enlace es Ver para las vulnerabilidades sin corrección y Ver corregidas para las vulnerabilidades en las que se ha aplicado una corrección.
Ver las incidencias con gcloud
Para ver las ocurrencias de una imagen en Artifact Registry, ejecuta el comando
gcloud artifacts docker images list
:
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
Donde:
- LOCATION es la ubicación regional o multirregional del repositorio.
- PROJECT_ID es el Google Cloud ID del proyecto de la consola.
- REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
- IMAGE_ID es el nombre de la imagen en el repositorio. No puedes especificar una etiqueta de imagen con este comando.
De forma predeterminada, el comando devuelve las 10 imágenes más recientes. Para mostrar un número diferente de imágenes, usa la marca --show-occurrences-from
.
Por ejemplo, el siguiente comando devuelve las 25 imágenes más recientes:
gcloud artifacts docker images list --show-occurrences-from=25 \
us-central1-docker.pkg.dev/my-project/my-repo/my-image
La salida tiene un aspecto similar al siguiente:
Ejemplo de salida de imagen
{ "name": "projects/my-project/locations/us-central1/occurrences/22d3edfb-34f2-4d3f-be08-fd90c549f010", "resource": { "uri": "https://us-central1-docker.pkg.dev/my-project/my-repo/golang-nginx@sha256:5b54ef20748417ccdb0b87afedf98c44e699e2f59bd6cv48cbdc1ca2e72c80e3" }, "noteName": "projects/my-project/locations/us-central1/notes/CVE-2005-2541", "kind": "VULNERABILITY", "createTime": "2025-01-21T15:57:01.238832Z", "updateTime": "2025-01-21T15:57:01.238832Z", "vulnerability": { "severity": "CRITICAL", "cvssScore": 10, "packageIssue": [ { "affectedLocation": { "cpeUri": "cpe:/o:debian:debian_linux:12", "package": "tar", "version": { "name": "1.34+dfsg", "revision": "1.2+deb12u1", "kind": "NORMAL" } }, "fixedLocation": { "cpeUri": "cpe:/o:debian:debian_linux:12", "package": "tar", "version": { "kind": "MAXIMUM" } }, "packageType": "OS", "effectiveSeverity": "LOW", "file_location": [ { "file_path": "/var/lib/dpkg/status", "layerDetails": { "index": 0, "diffID": "sha256:123", "buildCommand": "FROM golang:example_sha256", "BaseImages": [ { "name": "library/golang", }, ], }, }, ], } ], "shortDescription": "CVE-2005-2541", "longDescription": "NIST vectors: AV:N/AC:L/Au:N/C:C/I:C/A:C", "relatedUrls": [ { "url": "https://security-tracker.debian.org/tracker/CVE-2005-2541", "label": "More Info" } ], "effectiveSeverity": "LOW", "cvssVersion": "CVSS_VERSION_2", "cvssV2": { "baseScore": 10, "attackVector": "ATTACK_VECTOR_NETWORK", "attackComplexity": "ATTACK_COMPLEXITY_LOW", "authentication": "AUTHENTICATION_NONE", "confidentialityImpact": "IMPACT_COMPLETE", "integrityImpact": "IMPACT_COMPLETE", "availabilityImpact": "IMPACT_COMPLETE" } } }
Ver las vulnerabilidades de una etiqueta de imagen
Para ver las vulnerabilidades de una etiqueta de imagen, introduce uno de los siguientes comandos:
gcloud artifacts docker images describe \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID:TAG \
--show-package-vulnerability
o
gcloud artifacts docker images describe \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH \
--show-package-vulnerability
Donde:
- LOCATION es la ubicación regional o multirregional del repositorio.
- PROJECT_ID es el Google Cloud ID del proyecto de la consola.
- REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
- IMAGE_ID es el nombre de la imagen en el repositorio.
- TAG es la etiqueta de imagen sobre la que quieres obtener información.
- HASH es el digest de la imagen.
Artifact Analysis devuelve resultados, incluido el packageType
.
Filtrar ocurrencias de vulnerabilidades
Para filtrar las incidencias de vulnerabilidades, usa el parámetro --occurrence-filter
:
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID \
--occurrence-filter=FILTER_EXPRESSION
Donde:
- LOCATION es la ubicación regional o multirregional del repositorio.
- PROJECT_ID es el Google Cloud ID del proyecto de la consola.
- REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
- IMAGE_ID es el nombre de la imagen en el repositorio.
- FILTER_EXPRESSION es una expresión de filtro de ejemplo con el formato que se explica en Filtrar ocurrencias de vulnerabilidades.
Ver las vulnerabilidades de una capa específica
Puede usar el campo layerDetails
para determinar qué capa específica ha introducido un paquete vulnerable y para ver información adicional sobre esa capa. Por ejemplo, echa un vistazo a la siguiente salida de layerDetails
para una imagen:
"layerDetails": {
"index": 0,
"diffID": "sha256:123",
"buildCommand": "FROM golang:example_sha256",
"BaseImages": [
{
"name": "library/golang",
},
],
}
La salida muestra que el índice de la capa es 0
en la imagen del contenedor, con un hash de capa de sha256:123
.
El comando de compilación de Docker que se ha usado para compilar esta capa es FROM golang:example_sha256
, y la capa también se encuentra en la imagen base library/golang
.
Ver las incidencias con la API
Para obtener una lista de las ocurrencias de tu proyecto, sigue estos pasos:
curl -X GET -H "Content-Type: application/json" -H \
"Authorization: Bearer $(gcloud auth print-access-token)" \
https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences
Para obtener un resumen de las vulnerabilidades de tu proyecto, sigue estos pasos:
curl -X GET -H "Content-Type: application/json" -H \
"Authorization: Bearer $(gcloud auth print-access-token)" \
https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences:vulnerabilitySummary
Para obtener información sobre una incidencia concreta, sigue estos pasos:
curl -X GET -H "Content-Type: application/json" -H \
"Authorization: Bearer $(gcloud auth print-access-token)" \
https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences/OCCURRENCE_ID
Ver vulnerabilidades en Cloud Build
Si usas Cloud Build, también puedes ver las vulnerabilidades de las imágenes en el panel lateral Información de seguridad de la Google Cloud consola.
El panel lateral Estadísticas de seguridad ofrece una vista general de la información de seguridad de las compilaciones de los artefactos almacenados en Artifact Registry. Para obtener más información sobre el panel lateral y cómo puedes usar Cloud Build para proteger tu cadena de suministro de software, consulta Ver información valiosa sobre la seguridad de las compilaciones.
Filtrar ocurrencias
Puede usar cadenas de filtro en los comandos gcloud
y en la API Artifact Analysis para filtrar las incidencias antes de verlas. En las siguientes secciones se describen los filtros de búsqueda admitidos.
Ver las incidencias de un tipo específico
Puede usar el valor kind
para filtrar por tipo de ocurrencia. Consulta los tipos disponibles.
En los siguientes ejemplos se muestra cómo filtrar las ocurrencias de implementación de una imagen:
gcloud
En la CLI de gcloud, ejecuta lo siguiente:
gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="DEPLOYMENT"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
Donde:
API
En tu consulta a la API, usa la siguiente expresión de filtro:
kind="DEPLOYMENT" AND resourceUrl="RESOURCE_URL"
Donde:
DEPLOYMENT
es el tipo de ocurrencia.- RESOURCE_URL es la URL completa de la imagen en el formato
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH
.
Puedes usar la función hasPrefix
para filtrar con un ámbito más amplio.
Por ejemplo, el siguiente filtro se aplica a las apariciones de un tipo específico en muchas imágenes:
kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")
Donde:
- RESOURCE_URL_PREFIX especifica una subcadena de una URL de recurso.
- Para filtrar todas las versiones de una imagen, omite el digest de la imagen. Usa el formato
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@
. - Para filtrar todas las imágenes de un proyecto, solo tienes que especificar la ubicación del recurso y el proyecto. Usa el formato
https://LOCATION-docker.pkg.dev/PROJECT_ID/
.
- Para filtrar todas las versiones de una imagen, omite el digest de la imagen. Usa el formato
Ver las ocurrencias de vulnerabilidades
Para obtener una lista de las vulnerabilidades de una imagen, puede filtrar por el tipo de ocurrencia VULNERABILITY
.
gcloud
En la CLI de gcloud, ejecuta lo siguiente:
gcloud artifacts docker images list \
--show-occurrences \
--occurrence-filter='kind="VULNERABILITY"' \
--format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
Donde:
API
En tu consulta a la API, usa la siguiente expresión de filtro:
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22
Donde:
- ENCODED_RESOURCE_URL es la ruta codificada de tu imagen. Para obtener información sobre la codificación, consulta el artículo sobre la codificación de URLs.
Para obtener más información sobre cómo usar la API, consulta projects.occurrences.get
.
Filtrar por tipo de paquete
Para limitar los resultados del análisis de vulnerabilidades a un tipo de paquete, ejecuta el siguiente comando de la CLI de gcloud:
gcloud artifacts docker images list /
--show-occurrences /
--occurrence-filter='kind="VULNERABILITY" AND packageType="PACKAGE_TYPE"' /
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
Donde:
VULNERABILITY
es el tipo de ocurrencia.- PACKAGE_TYPE es el tipo de paquete de idioma de la aplicación.
Los tipos disponibles son
COMPOSER
,GO
,MAVEN
,NPM
,NUGET
,PYTHON
,RUBYGEMS
yRUST
. - LOCATION es la ubicación regional o multirregional del repositorio.
- PROJECT_ID es el Google Cloud ID del proyecto de la consola.
- REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
- IMAGE_ID es el nombre de la imagen en el repositorio. No puedes especificar una etiqueta de imagen con este comando.
Ver las imágenes asociadas a una nota específica
Puedes obtener una lista de recursos asociados a un ID de nota específico. Por ejemplo, puede enumerar imágenes con una vulnerabilidad CVE específica.
Para enumerar todas las imágenes de un proyecto que estén asociadas a una nota concreta, usa la siguiente expresión de filtro:
gcloud
gcloud artifacts docker images list /
--show-occurrences /
--occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
LOCATION-docker.pkg.dev/PROJECT_ID
Donde:
goog-vulnz
es elPROVIDER_PROJECT_ID
para el análisis de vulnerabilidades de Artifact Analysis. Si usas Artifact Analysis en un proyecto personalizado, puedes sustituir este valor por el ID de tu proyecto de proveedor.- LOCATION es la ubicación regional o multirregional del repositorio.
- PROJECT_ID es el Google Cloud ID del proyecto de la consola.
- NOTE_ID es el ID de la nota. Por ejemplo, cuando vea una vulnerabilidad en los resultados del análisis de artefactos, a menudo se usará el formato de ID de CVE, como
CVE-2019-12345
.
API
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=noteProjectId%3D%22goog-vulnz%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22%20AND%20noteId%3D%22NOTE_ID%22
Donde:
goog-vulnz
es elPROVIDER_PROJECT_ID
para el análisis de vulnerabilidades de Artifact Analysis. Si usas Artifact Analysis en un proyecto personalizado, puedes sustituir este valor por el ID de tu proyecto de proveedor.- ENCODED_RESOURCE_URL es la ruta codificada de tu imagen. Para obtener información sobre la codificación, consulta el artículo sobre la codificación de URLs.
- NOTE_ID es el ID de la nota. Por ejemplo, cuando vea una vulnerabilidad en los resultados del análisis de artefactos, a menudo se usará el formato de ID de CVE, como
CVE-2019-12345
.
Para comprobar si una imagen concreta tiene una nota específica, usa la siguiente expresión de filtro:
gcloud
gcloud artifacts docker images list /
--show-occurrences /
--occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
Dónde
- LOCATION es la ubicación regional o multirregional del repositorio.
- PROJECT_ID es el Google Cloud ID del proyecto de la consola.
- REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
- IMAGE_ID es el nombre de la imagen en el repositorio. No puedes especificar una etiqueta de imagen con este comando.
API
En tu consulta a la API, añade la siguiente expresión de filtro:
resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \ AND noteId="NOTE_ID"
Donde:
- RESOURCE_URL es la URL completa de la imagen en el formato
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH
. goog-vulnz
es elPROVIDER_PROJECT_ID
para el análisis de vulnerabilidades de Artifact Analysis. Si usas Artifact Analysis en un proyecto personalizado, puedes sustituir este valor por el ID de tu proyecto de proveedor.- NOTE_ID es el ID de la nota. Las notas relacionadas con la seguridad suelen tener el formato
CVE-2019-12345
.
Siguientes pasos
Usa las notificaciones de Pub/Sub para recibir notificaciones sobre vulnerabilidades y otros metadatos.
Kritis Signer y Voucher te permiten crear atestaciones de autorización binaria como parte de tu flujo de compilación. Estas herramientas pueden crear atestaciones de Autorización binaria basadas en los resultados de análisis de vulnerabilidades. Para obtener más información, consulta Crear atestaciones con Kritis Signer o Crear atestaciones con Voucher.