Acerca de este codelab
1. Introducción
Las vulnerabilidades de software son debilidades que pueden causar una falla accidental del sistema o proporcionar a las personas que actúan de mala fe un medio para comprometer el software. Container Analysis proporciona dos tipos de análisis de SO para encontrar vulnerabilidades en contenedores:
- La API de On-Demand Scanning te permite analizar manualmente las imágenes de contenedores en busca de vulnerabilidades del SO, ya sea de forma local en tu computadora o de forma remota en Container Registry o Artifact Registry.
- La API de Container Scanning te permite automatizar la detección de vulnerabilidades del SO, realizar un análisis cada vez que envías una imagen a Container Registry o Artifact Registry. Habilitar esta API también habilita el análisis de paquetes de lenguajes en busca de vulnerabilidades de Go y Java.
La API de On-Demand Scanning te permite analizar imágenes almacenadas de forma local en tu computadora o de forma remota en Container Registry o Artifact Registry. Esto te brinda un control detallado sobre los contenedores que deseas analizar en busca de vulnerabilidades. Puedes usar On-Demand Scanning para analizar imágenes en tu canalización de CI/CD antes de decidir si quieres almacenarlas en un registro.
Qué aprenderás
En este lab, aprenderá a realizar las siguientes actividades:
- Compila imágenes con Cloud Build
- Usa Artifact Registry para contenedores
- Utiliza los análisis de vulnerabilidades automatizados
- Configura el análisis a pedido
- Agrega el análisis de imágenes en CI/CD en Cloud Build
2. Configuración y requisitos
Cómo configurar el entorno a tu propio ritmo
- Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.
- El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
- El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. por lo general, no te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como
PROJECT_ID
). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto. - Para tu información, hay un tercer valor, un número de proyecto que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
- A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se te facture más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.
Configuración del entorno
Configura tu ID y número de proyecto en Cloud Shell. Guárdalas como variables PROJECT_ID
y PROJECT_ID
.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
Habilita los servicios
Habilita todos los servicios necesarios con el siguiente comando:
gcloud services enable \
cloudkms.googleapis.com \
cloudbuild.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
artifactregistry.googleapis.com \
containerscanning.googleapis.com \
ondemandscanning.googleapis.com \
binaryauthorization.googleapis.com
3. Compila imágenes con Cloud Build
En esta sección, crearás una canalización de compilación automatizada que compilará tu imagen de contenedor, la analizará y, luego, evaluará los resultados. Si no se encuentran vulnerabilidades CRÍTICAS, se enviará la imagen al repositorio. Si se encuentran vulnerabilidades CRÍTICAS, la compilación fallará y se cerrará.
Proporciona acceso a la cuenta de servicio de Cloud Build
Cloud Build necesitará derechos para acceder a la API de análisis a pedido. Proporciona acceso con los siguientes comandos.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Crea y cambia a un directorio de trabajo
mkdir vuln-scan && cd vuln-scan
Define una imagen de muestra
Crea un archivo llamado Dockerfile con los siguientes contenidos.
cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a
# System
RUN apt update && apt install python3-pip -y
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
EOF
Crea un archivo llamado main.py con el siguiente contenido:
cat > ./main.py << EOF
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "Worlds")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
Crea la canalización de Cloud Build
El siguiente comando creará un archivo cloudbuild.yaml en tu directorio que se usará para el proceso automatizado. Para este ejemplo, los pasos se limitan al proceso de compilación del contenedor. Sin embargo, en la práctica, incluirías instrucciones y pruebas específicas de la aplicación además de los pasos del contenedor.
Crea el archivo con el siguiente comando.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
EOF
Ejecuta la canalización de CI
Cómo enviar la compilación para su procesamiento
gcloud builds submit
Revisar detalles de compilación
Una vez que haya comenzado el proceso de compilación, revise el progreso en el panel de Cloud Build.
- Abre Cloud Build en la consola de Cloud.
- Haz clic en la compilación para ver el contenido.
4. Artifact Registry para contenedores
Crear repositorio de Artifact Registry
En este lab, usarás Artifact Registry para almacenar y analizar tus imágenes. Crea el repositorio con el siguiente comando.
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
Configura Docker para que use tus credenciales de gcloud cuando accedas a Artifact Registry.
gcloud auth configure-docker us-central1-docker.pkg.dev
Actualiza la canalización de Cloud Build
Modifica tu canalización de compilación para enviar la imagen resultante a Artifact Registry
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
# push to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
Ejecuta la canalización de CI
Cómo enviar la compilación para su procesamiento
gcloud builds submit
5. Análisis automático de vulnerabilidades
El análisis de artefactos se activa automáticamente cada vez que envías una imagen nueva a Artifact Registry o Container Registry. La información de las vulnerabilidades se actualiza de forma continua cuando se descubren nuevas vulnerabilidades. En esta sección, revisarás la imagen que acabas de compilar y enviar a Artifact Registry para explorar los resultados de vulnerabilidades.
Revisar detalles de la imagen
Una vez que se haya completado el proceso de compilación anterior, revisa la imagen y los resultados de vulnerabilidades en el panel de Artifact Registry.
- Abre Artifact Registry en la consola de Cloud.
- Haz clic en Artifact-scanning-repo para ver el contenido.
- Haz clic en los detalles de la imagen.
- Haz clic en el resumen más reciente de tu imagen.
- Cuando termine el análisis, haz clic en la pestaña Vulnerabilidades de la imagen.
En la pestaña de vulnerabilidades, verás los resultados del análisis automático de la imagen que acabas de compilar.
La automatización del análisis está habilitada de forma predeterminada. Explora la configuración de Artifact Registry para ver cómo puedes activar o desactivar el análisis automático.
6. Análisis a pedido
Existen varios casos en los que es posible que debas realizar un análisis antes de enviar la imagen a un repositorio. Por ejemplo, un desarrollador de contenedores puede analizar una imagen y corregir los problemas antes de enviar código al control de origen. En el siguiente ejemplo, compilarás y analizarás la imagen a nivel local antes de actuar en función de los resultados.
Cómo crear una imagen
En este paso, usarás Docker local para compilar la imagen en tu caché local.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
Analizar la imagen
Una vez que se haya compilado la imagen, solicita un análisis. Los resultados del análisis se almacenan en un servidor de metadatos. El trabajo se completa con una ubicación de los resultados en el servidor de metadatos.
gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--format="value(response.scan)" > scan_id.txt
Revisa el archivo de salida
Tómate un momento para revisar el resultado del paso anterior, que se almacenó en el archivo scan_id.txt. Observa la ubicación del informe de los resultados del análisis en el servidor de metadatos.
cat scan_id.txt
Revisa los resultados detallados del análisis
Para ver los resultados reales del análisis, usa el comando list-vulnerabilities
en la ubicación del informe que se indica en el archivo de salida.
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt)
El resultado contiene una cantidad significativa de datos sobre todas las vulnerabilidades de la imagen.
Marcar problemas críticos
Los seres humanos rara vez usan los datos almacenados en el informe directamente. Por lo general, los resultados se utilizan mediante un proceso automatizado. Usa los siguientes comandos para leer los detalles del informe y registrar si se encontró alguna vulnerabilidad CRÍTICA.
export SEVERITY=CRITICAL
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi
El resultado de este comando
Failed vulnerability check for CRITICAL level
7. Analiza en CI/CD con Cloud Build
Proporciona acceso a la cuenta de servicio de Cloud Build
Cloud Build necesitará derechos para acceder a la API de análisis a pedido. Proporciona acceso con los siguientes comandos.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Actualiza la canalización de Cloud Build
El siguiente comando creará un archivo cloudbuild.yaml en tu directorio que se usará para el proceso automatizado. Para este ejemplo, los pasos se limitan al proceso de compilación del contenedor. Sin embargo, en la práctica, incluirías instrucciones y pruebas específicas de la aplicación además de los pasos del contenedor.
Crea el archivo con el siguiente comando.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
#Run a vulnerability scan at _SECURITY level
- id: scan
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
(gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--location us \
--format="value(response.scan)") > /workspace/scan_id.txt
#Analyze the result of the scan
- id: severity check
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
--format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi
#Retag
- id: "retag"
name: 'gcr.io/cloud-builders/docker'
args: ['tag', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#pushing to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
Ejecuta la canalización de CI
Envía la compilación a procesamiento para verificar las fallas de compilación cuando se encuentre una vulnerabilidad de gravedad CRÍTICA.
gcloud builds submit
Revisar error de compilación
La compilación que acabas de enviar fallará porque la imagen contiene vulnerabilidades CRITICAL.
Revisa la falla de compilación en la página Historial de Cloud Build.
Corrige la vulnerabilidad
Actualiza el Dockerfile para usar una imagen base que no contenga vulnerabilidades CRITICAL.
Reemplaza el Dockerfile para usar la imagen de Debian 10 con el siguiente comando:
cat > ./Dockerfile << EOF
from python:3.8-slim
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app
EOF
Ejecuta el proceso de CI con la imagen correcta
Envía la compilación para que se procese y verifique que se realice de forma correcta cuando no se encuentren vulnerabilidades de gravedad CRÍTICA.
gcloud builds submit
Revisa la compilación correcta
La compilación que acabas de enviar se realizará correctamente porque la imagen actualizada no contiene vulnerabilidades CRÍTICAS.
Revisa el éxito de la compilación en la página Historial de Cloud Build.
Revisa los resultados del análisis
Revisa la imagen de calidad en Artifact Registry
- Abre Artifact Registry en la consola de Cloud.
- Haz clic en Artifact-scanning-repo para ver el contenido.
- Haz clic en los detalles de la imagen.
- Haz clic en el resumen más reciente de tu imagen.
- Haz clic en la pestaña Vulnerabilidades de la imagen.
8. ¡Felicitaciones!
¡Felicitaciones! Completaste el codelab.
Temas abordados:
- Compila imágenes con Cloud Build
- Artifact Registry para contenedores
- Análisis automático de vulnerabilidades
- Análisis a pedido
- Analiza en CI/CD con Cloud Build
¿Qué sigue?
- Protege las implementaciones de imágenes en Cloud Run y Google Kubernetes Engine | Documentación de Cloud Build
- Guía de inicio rápido: Configura una política de Autorización Binaria con GKE | Google Cloud
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.
—
Última actualización: 21 de marzo de 2023