Análisis de Vulnerabilidades usando Anchore
Desarrollo del tema

Otra forma de solucionar el análisis de vulnerabilidades de imágenes, es utilizar Anchore Engine, un software de código abierto para inspección, análisis y certificación de imágenes de contenedores. Anchore CLI proporciona una interfaz de desarrollador para estas capacidades. Esta pieza mágica de la línea de comandos puede extraer imágenes del registro oficial de Docker (u otros registros), almacenarlas en una biblioteca local y luego ejecutar análisis de vulnerabilidades, evaluaciones de políticas e incluso enumerar los paquetes del sistema que se encuentran en la imagen. En otras palabras, puede garantizar que las imágenes de las que depende estén listas para funcionar.
Pero Anchore CLI no es exactamente la herramienta más grande del conjunto de herramientas del desarrollador. No sólo es otra herramienta adyacente a un contenedor con documentación de instalación no muy ideal, sino que su uso tampoco es exactamente obvio. Voy a aclararle esto para que pueda utilizar Anchore CLI con su flujo de trabajo diario de desarrollo de contenedores.
Laboratorio: Análisis usando Anchore
Descripción
En la presente guía se creara una imagen de contenedor y se procederá con el respectivo análisis usando la herramienta Anchore.
Objetivos
- Instalar Anchore y usarlo para analizar una imagen de contenedor.
Antes de comenzar
- Contar con el acceso al ambiente del laboratorio.
Inicio de laboratorio
-
Instalación de Anchore CLI:
sudo yum install python3-pip -y && sudo pip3 install anchorecli -
Crearemos un Docker Compose siguiente manera:
mkdir example-anchore; touch example-anchore/docker-compose.yaml -
Con el editor de texto añadiremos el contenido según corresponda:
- Se agrega el contenido del archivo Docker Compose:
vim example-anchore/docker-compose.yamlvolumes: anchore-db-volume: # Set this to 'true' to use an external volume. In which case, it must be created manually with "docker volume create anchore-db-volume" external: false services: # The primary API endpoint service api: image: anchore/anchore-engine:v1.0.0 depends_on: - db - catalog ports: - "8228:8228" logging: driver: "json-file" options: max-size: 100m environment: - ANCHORE_ENDPOINT_HOSTNAME=api - ANCHORE_ADMIN_PASSWORD=foobar - ANCHORE_DB_HOST=db - ANCHORE_DB_PASSWORD=mysecretpassword command: ["anchore-manager", "service", "start", "apiext"] # Catalog is the primary persistence and state manager of the system catalog: image: anchore/anchore-engine:v1.0.0 depends_on: - db logging: driver: "json-file" options: max-size: 100m expose: - 8228 environment: - ANCHORE_ENDPOINT_HOSTNAME=catalog - ANCHORE_ADMIN_PASSWORD=foobar - ANCHORE_DB_HOST=db - ANCHORE_DB_PASSWORD=mysecretpassword command: ["anchore-manager", "service", "start", "catalog"] queue: image: anchore/anchore-engine:v1.0.0 depends_on: - db - catalog expose: - 8228 logging: driver: "json-file" options: max-size: 100m environment: - ANCHORE_ENDPOINT_HOSTNAME=queue - ANCHORE_ADMIN_PASSWORD=foobar - ANCHORE_DB_HOST=db - ANCHORE_DB_PASSWORD=mysecretpassword command: ["anchore-manager", "service", "start", "simplequeue"] policy-engine: image: anchore/anchore-engine:v1.0.0 depends_on: - db - catalog expose: - 8228 logging: driver: "json-file" options: max-size: 100m environment: - ANCHORE_ENDPOINT_HOSTNAME=policy-engine - ANCHORE_ADMIN_PASSWORD=foobar - ANCHORE_DB_HOST=db - ANCHORE_DB_PASSWORD=mysecretpassword - ANCHORE_VULNERABILITIES_PROVIDER=grype command: ["anchore-manager", "service", "start", "policy_engine"] analyzer: image: anchore/anchore-engine:v1.0.0 depends_on: - db - catalog expose: - 8228 logging: driver: "json-file" options: max-size: 100m environment: - ANCHORE_ENDPOINT_HOSTNAME=analyzer - ANCHORE_ADMIN_PASSWORD=foobar - ANCHORE_DB_HOST=db - ANCHORE_DB_PASSWORD=mysecretpassword volumes: - /analysis_scratch command: ["anchore-manager", "service", "start", "analyzer"] db: image: "postgres:9" volumes: - anchore-db-volume:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=mysecretpassword expose: - 5432 logging: driver: "json-file" options: max-size: 100m healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] -
Iniciamos el Docker Compose:
cd example-anchore; sudo docker compose up -d -
Definimos la variable de URL de Anchore:
ANCHORE_CLI_URL=http://localhost:8228/v1 -
Añadimos una imagen al Anchore Engine:
anchore-cli --u admin --p foobar image add docker.io/library/openjdk:8-jre-alpine -
Listamos las imagenes agregadas:
anchore-cli --u admin --p foobar image list -
A continuación podemos enumerar todas las vulnerabilidades conocidas asociadas con la imagen:
anchore-cli --u admin --p foobar image vuln docker.io/library/openjdk:8-jre-alpine all -
Adicional podemos ejecutar una verificación de políticas:
anchore-cli --u admin --p foobar evaluate check docker.io/library/openjdk:8-jre-alpine --detail -
Limpiamos el ambiente:
sudo docker compose down -v && cd ~