Anchore – Análisis de vulnerabilidades de docker

0
198
Ciclo de Anchore

Índice de contenidos

1.​ Introducción

Este tutorial explica la herramienta para análisis de vulnerabilidades de imagen de docker Anchore. Aprenderemos cómo configurarlo para descargar una imagen de un repositorio de docker, ya sea público o privado (añadiendo las credenciales del repositorio a anchore). También cómo analizar imágenes de docker en local, obtener informes con toda la información que Anchore proporciona y ejecutar una evaluación de la imagen contra distintas políticas para comprobar si la imagen supera el umbral de calidad de la política activa en Anchore.

Además de cómo configurar Anchore como una fase de integración continua (usaremos Gitlab CI en este tutorial) para automatizar el proceso de análisis de imágenes cada vez que haya una subida al repositorio.

Vamos a ver dos variantes de uso de Anchore en integración continua: 

  • Subir la imagen a un repositorio de docker, analizarla desde ahí y utilizar Anchore como medida preventiva para no desplegar esa imagen en kubernetes 
  • Solo subir la imagen de docker al repositorio si esta supera el umbral de la política activa.

Puedes encontrar el código de este tutorial en este repositorio.

​2.​ ¿Qué es Anchore?

Anchore es un herramienta de código abierto (tambien tiene version empresarial, pero no la vamos a cubrir en este tutorial) que inspecciona, analiza y certifica las imágenes de Docker. Este análisis lo hace contra una base de datos propia (Postgres) formada por la recopilación de información de vulnerabilidades y problemas de seguridad (CVE) de distribuciones de sistemas operativos y también recopila esa misma información de los registros de paquetes populares como Node.JS, NPM, Ruby.

Anchore puede descargar cualquier imagen de un registro compatible con docker V2 y el resultado del análisis genera un reporte con los detalles de la imagen, un listado de artefactos (npm, gem, python y java), un listado de paquetes del sistema operativo, el listado de ficheros de la imagen y un listado de vulnerabilidades (a elegir entre todas, solo del sistema operativo o solo las que no tengan que ver con el sistema operativo).

 

3.​ Cómo funciona Anchore

Anchore analiza cada imagen basándose en datos y la aplicación de políticas. Anchore sigue las siguientes fases en cada análisis:

  1. Obtiene y extrae el contenido de la imagen, sin ejecutarlo.
  2. Analiza el contenido, extrayendo y clasificando la mayor cantidad posible de metadatos.
  3. Guarda el resultado del análisis anterior en la base de datos.
  4. Evalúa las políticas contra el resultado del análisis, incluidas las coincidencias de vulnerabilidades en los artefactos descubiertos en la imagen.
  5. Actualiza los datos utilizados para la evaluación de políticas y vulnerabilidades y si hay algún cambio en estos datos, actualiza los resultados del análisis de imágenes aplicando estos nuevos datos.
  6. Muestra al usuario los resultados

​3.1.​ Origen base de datos de vulnerabilidades

La base de datos de Anchore solo cuenta por defecto con información de vulnerabilidades, pero se puede indicar a Anchore para que también incluya información de paquetes como npm y gem, además de bases de datos como nvd u otras externas.

En esta tabla se pueden ver los distintos origen de la fuente de datos, el tipo de datos y el controlador al que pertenecen:

Driver Feed Type External Data Source
alpine vulnerabilities https://github.com/alpinelinux/alpine-secdb/archive/master.tar.gz
centos vulnerabilities https://www.redhat.com/security/data/oval/com.redhat.rhsa-all.xml.bz2
debian vulnerabilities https://security-tracker.debian.org/tracker/data/jsonhttps://salsa.debian.org/security-tracker-team/security-tracker/raw/master/data/DSA/list
oracle vulnerabilities https://linux.oracle.com/security/oval/com.oracle.elsa-all.xml.bz2
ubuntu vulnerabilities https://launchpad.net/ubuntu-cve-tracker
gem packages https://s3-us-west-2.amazonaws.com/rubygems-dumps
npm packages https://replicate.npmjs.com
nvd nvd https://nvd.nist.gov/vuln/data-feeds
snyk snyk https://data.anchore-enterprise.com

 

4.​ Cómo usar Anchore

Anchore está disponible como una imagen de Docker. Esta imagen se puede ejecutar de forma independiente con docker-compose en una máquina local, con plataformas de orquestación como Kubernetes o como parte de integración continua en Gitlab CI, Jenkins, Travis CI, etc.

Para usarlo por primera vez y probar la herramienta recomiendo ejecutarlo en local con docker-compose al ser la forma mas rapida para poder ejecutar todos los comandos y ver la funcionalidad.

Después de haberlo probado con docker-compose, la mayor utilidad de Anchore es usarlo como parte de una fase de integración continua que se ejecute con cada cambio de una imagen de docker para comprobar que no hay nuevas vulnerabilidades o se han corregido las que ya había.

4.1.​ Anchore en local con docker-compose

Para poder usar Anchore hay que descargar (con el comando de abajo) la última imagen del contenedor de Anchore Engine que contiene el docker-compose.yaml y demás ficheros de configuración.

Vamos a copiar el fichero docker-compose.yaml que hay dentro de anchore-engine a la carpeta ~/anchore/

Ahora entramos a la carpeta y descargamos los contenedores descritos dentro del fichero docker-compose.yaml que hay en la carpeta.

Por defecto todos los servicios, incluida la base de datos no son persistentes y al reiniciar o apagar se perderán, pero se puede hacer persistente con tan solo poner a true la propiedad external dentro de anchore-db-volume y haber previamente creado un volumen de docker ejecutando

Ejecutamos el docker-compose:

Una vez levantado Anchore podemos comprobar que funciona con docker-compose ejecutando

Tenemos todo listo para empezar a ejecutar el flujo básico de análisis de una imagen, solo hay que ejecutar estos comandos de abajo en orden sustituyendo el entrecomillado imagen por el nombre:tag o el digest de la imagen a analizar. Para probarlo inicialmente podemos analizar cualquier imagen de docker hub como por ejemplo “adoptopenjdk/openjdk11:latest” en lugar de “imagen”.

Es recomendable usar el digest de la imagen en vez de solo el nombre para evitar problemas de ambigüedad en caso de que la imagen cambie pero el nombre y tag. En este caso queremos analizar solo la última versión de la imagen, no queremos una imagen anterior especifica, así que podemos hacerlo solo poniendo el nombre.

Cuando se aplica el bundle de políticas por defecto (más adelante explicado) de Anchore el estado de éxito puede darse si:

  • La imagen evaluada está totalmente limpia de problemas, 
  • Solo hay warnings 
  • La imagen evaluada está en la lista blanca (no se evalúa). 

El estado fallido se da si: 

  • La imagen evaluada tiene al menos una vulnerabilidad que en el bundle de políticas está marcada como Stop
  • La imagen estaba en la lista negra (falla sin analizarla)

4.2.​ Anchore en integración continua (Gitlab CI)

La mayor virtud de Anchore es la facilidad de usarlo en un ciclo de integración continua para securizar los contenedores docker desplegados. De esta forma añadimos una capa de seguridad a la entrega continua.

Para mostrar un ejemplo de implementación de Anchore, he elegido Gitlab CI por ser gratuito (2000 horas al mes de ejecución de integración continua) y fácil de configurar para que cualquier commit que se suba al repositorio ejecute la integración continua con la fase de Anchore.

Anchore también se puede integrar con Jenkins, Travis CI o cualquier otro sistema de integración continua, contando con utilidades y ejemplos para facilitar la integración. Además de usarlo como imagen de docker, Anchore también se puede desplegar en Kubernetes como un pod que estará en el cluster de kubernetes siempre disponible. De tal forma que se pueda usar Anchore para otros propósitos solo usando la url del despliegue en vez de tener Anchore ejecutándose como una imagen de docker solo activa en el momento de la integración continua.

Según el objetivo que queramos conseguir podemos utilizar Anchore de dos formas distintas. La diferencia entre ellas es que para el primer método necesitamos que la imagen de docker esté subida a un repositorio para que Anchore la pueda descargar y analizar y para el segundo solo necesitamos dar a Anchore el dockerfile con el que construir la imagen de docker y esa imagen construida en local.

 

4.2.1.​ Analizar imágenes de docker una vez han sido subidas a un repositorio

Una vez almacenada la imagen de docker podemos analizar las vulnerabilidades que tiene esa imagen y decidir si es o no apta para desplegarla al entorno que elijamos. Después de esta fase de análisis podemos poner la fase de despliegue de esa imagen, asi solo si pasa el análisis se podrá ejecutar la fase de despliegue

Para poder ejecutar esta fase se necesitan las imágenes de Engine cli y Anchore engine. Engine cli contiene los comandos de Anchore. Inline scan contiene Anchore engine, que lo inyectamos como servicio para poder ejecutar los análisis.

Explicación de la fase:

  • Esperamos a que el engine de Anchore se inicie para evitar que la fase falle por ejecutar un comando sin tenerlo iniciado
  • Añadimos la imagen al engine de Anchore
  • Esperamos a que Anchore la analice
  • Ejecutamos todos los comandos que reportan información en los distintos ficheros
  • Ejecutamos la evaluacion de politicas si hemos puesto la variable del if a True

Resultado de la fase:

La evaluación muestra información general de la imagen junto con el resultado, exitoso en este caso al tener el status pass, esto implica que la imagen ha superado la evaluación contra la política por defecto (al no haber configurado una política distinta aun) de Anchore.

Además del status, también se muestra que hay cosas a mejorar, al tener un warn en el final action, indicando que el warning lo lanzó la política evaluada y abajo muestra detalladamente dónde está el problema para que se pueda solucionar de cara a la siguiente vez.

 

4.2.2.​ Analizar la imagen de docker y dockerfile antes de subirlo a un repositorio

Podemos utilizar Anchore para evitar almacenar una imagen de docker que no cumple con las políticas que hayamos establecido.

En vez de mostrar solo un ejemplo de ejecución, voy a mostrar dos fases que analizan la imagen en local. La diferencia radica en que en la primera fase se aplica una política donde sólo fallará el análisis si se descubre alguna vulnerabilidad crítica y en la segunda fase solo fallará si se descubren vulnerabilidades altas o críticas sin fix en el momento del análisis.
Esta comparativa es muy útil para mostrar la importancia de la política que se usa para analizar la imagen pues el resultado varía enormemente partiendo de la misma imagen.

Explicación de las fases:

  • Al partir de la imagen de docker hay que instalar curl y bash para que funcionen los comandos de ejecución del script.
  • Construimos la imagen de docker.
  • Ejecutamos el script de Anchore pasando el dockerfile, una política propia (esto es opcional y es la diferencia entre las fases, tambien se podria eliminar el flag y dejar que se use la politica por defecto) y el nombre de la imagen construida en el paso anterior.

Resultado de la fase (only-critical):

Este resultado tiene la peculiaridad de que se ha aplicado una política muy poco restrictiva, sólo mostrando errores cuando la imagen tiene una vulnerabilidad crítica e ignorando el resto de vulnerabilidades en el resultado, debido a esto el resultado ha sido exitoso, dando un status pass y además no hay ningún problema detectado pues la acción es go.

 

Resultado de la fase (stop-high):

En contraposición con el resultado de la fase only-critical, en este resultado aparecen bastantes vulnerabilidades, la mayoría de ellas con status warn y alguna con status stop, dando como resultado y status final stop. 

Estos dos ejemplos muestran la gran diferencia al aplicar distintas políticas a la misma imagen y la importancia de la política que usamos al leer los resultados que da la evaluación. Si se mira el primer resultado sin saber la política, se puede llegar a la errónea conclusión de que la imagen es perfecta y no contiene ninguna vulnerabilidad, mientras que en la segunda se ven vulnerabilidades que se pueden arreglar.

 

5.​ Añadir repositorios privados a Anchore

Además de poder descargar imágenes de repositorios públicos Anchore permite añadir las credenciales de un repositorio privado. Al ejecutar el comando add image, Anchore automáticamente intentará descargar la imagen de docker.io o de la url indicada en el comando, sin requerir ninguna configuración extra. Si esta descarga falla, Anchore mostrará un mensaje de error. Por ejemplo si ejecuto anchore-cli image add jesus12345/alpine-private-repo Anchore me devuelve:

El mensaje muestra que o bien el repositorio no existe o tiene el acceso prohibido por falta de credenciales. En este último caso, Anchore nos facilita el poder añadir las credenciales para que al intentar acceder, use la lista de credenciales que tenga que pertenezcan a ese dominio.

Para añadir las credenciales de un repositorio tan solo hay que ejecutar el comando

Por ejemplo para poder descargar la imagen que antes ha dado fallo he añadido las credenciales de mi repositorio de github

Se pueden mirar la URL, tipo y el usuario de cada repositorio que Anchore tiene guardado con

En el ejemplo anterior si ejecutamos el comando, el resultado es:

Ahora podemos añadir la imagen y Anchore la descarga del repositorio sin errores

 

6.​ Políticas para la evaluación de imágenes

Además de proporcionar información sobre una imagen, Anchore puede realizar una evaluación de la imagen según las políticas definidas por el usuario. 

Una política se compone de un conjunto de reglas que se utilizan para realizar una evaluación de una imagen de contenedor. Estas reglas pueden incluir comprobaciones de vulnerabilidades de seguridad, listas blancas y negras de imágenes, contenido del archivo de configuración, presencia de credenciales en la imagen, puertos expuestos u otras comprobaciones definidas por el usuario. Estas políticas pueden aplicarse globalmente o personalizarse para imágenes específicas o categorías de aplicaciones.

Los bundles (paquetes) son la unidad de definición y evaluación de políticas en Anchore. Un usuario puede tener varios bundle de políticas pero solo se usa una para la evaluación de una imagen, esta puede ser la que esté activa en el motor de Anchore al realizar el análisis o la que se indique en el inline scan.

Un bundle contiene cero o más políticas. Las políticas de un paquete definen las comprobaciones que deben realizarse contra una imagen y las acciones que se recomiendan si las comprobaciones encuentran una coincidencia.

Un bundle de políticas es un documento JSON compuesto por:

  • Políticas: reglas y acciones
  • Listas blancas: exclusiones de reglas para anular una coincidencia de alguna política
  • Mapeos: determinar qué políticas y listas blancas deben aplicarse a una imagen específica en el momento de la evaluación. De tal manera que podemos aplicar más o menos reglas según la imagen.
  • Lista blanca de imágenes: Imágenes que pasarán automáticamente la evaluación, sin importar si cumplen o no las políticas
  • Lista negra de imágenes: reemplaza las imágenes específicas para establecer de forma estática el resultado final en un error, independientemente del resultado de la evaluación de la política

 

​6.1.​ Política por defecto

Anchore cuenta con una política activada por defecto para poder ejecutar el análisis de imágenes sin tener que hacer ninguna configuración extra. Esta política comprueba que no haya ninguna vulnerabilidad alta o crítica, si la hay lo marca en los logs y hará que falle la integración continua si se está ejecutando el análisis en una fase. Las vulnerabilidades medias o bajas las marca con un warning, pero estas vulnerabilidades no harán fallar la integración continua.

Para poder saber qué política está usando Anchore, podemos listar las políticas que hay en anchore-cli, mostrando el id y si están o no activas con el comando:

Si queremos más información sobre una política en especial, podemos listar todos los datos de una política usando el Id de la política con el comando:

 

6.2.​ Cómo crear una política propia y activarla

Para crear una política, necesitamos crear un bundle y activarlo. Al hacer una bundle propio de políticas hay que asegurarse que el ID principal del bundle no exista en la lista de políticas de Anchore y que los IDs internos de cada mapeo, policies y reglas no coincidan entre ellos porque dará fallo al intentar usarlo como política y Anchore usará la política por defecto.

Otra cosa importante a tener en cuenta es que el ID general del bundle puede ser cualquier cadena de caracteres, por ello aconsejo poner un nombre descriptivo para luego poder reconocer nuestro bundle por el ID facilmente al listar las políticas poder diferenciarlas.

Cuidado, el ID no puede tener espacios en blanco o al ejecutar el comando para activar la política fallará aunque al crear el bundle no nos haya dado problema.

Este es un ejemplo de bundle que podemos aplicar para ignorar fallos de vulnerabilidades high que no tengan fix para poder pasar el umbral de calidad al analizar la imagen (la politica por defecto no pasara el umbral si se descubre una vulnerabilidad high aunque no tenga fix).

La parte importante es el objeto dentro de rules, donde definimos que se pare la ejecución si se encuentra una vulnerabilidad que cumpla con los parámetros definidos. 

Una vez tenemos el bundle listo se añade un bundle de una política

El resultado del comando de arriba nos devolverá un id que es el que usamos para activar, si no se activa Anchore no la tendrá en cuenta al ejecutar el análisis

Para mas informacion sobre como crear una politica: https://anchore.freshdesk.com/support/solutions/articles/36000074706-policies

 

6.3.​ Descargar y activar una política creada por la comunidad de Anchore

Anchore Policy Hub es un repositorio centralizado que ofrece una bundles con políticas predefinidas que están disponibles públicamente y pueden ser cargados / consumidos por Anchore. Este sistema sirve como un almacén de políticas para Anchore, donde bundles con políticas predefinidas se pueden buscar y descargar fácilmente, además de servir como un punto de partida para crear una politicas propia y como punto de encuentro donde los usuarios de Anchore puedan enviar y compartir nuevos paquetes de políticas.

Para poder usar Anchore Policy Hub solo hay que tener anchore-engine funcionando y anchore-cli con la versión 0.3.2 o superior.

Pasos para usar una política del hub:

  1. Comprobar la versión

2. Mostrar las políticas disponibles en Anchore Policy Hub:

3. Descargar una política del listado

4. Instalar la política

5. Activar la política para que sea la que esté en uso

6. Comprobar que la política se ha instalado correctamente y está activa

 

​7.​ Listado de comandos

Aqui podreis ver todos los comandos que más frecuentemente podréis usar junto con una breve explicación de lo que hacen:

Muestra todas las imágenes que se han analizado con Anchore y sobre las que puedes obtener información con image vuln

Obtiene información resumen de la imagen, la misma que cuando se termina de ejecutar el comando anchore-cli image wait “nombreImagen” wait de la imagen

Muestra la lista de sitios que proveen a Anchore la información sobre vulnerabilidades

Espera hasta que el motor y el servicio de Anchore este operativo, útil como primer comando en la integración continua para esperar a que se inicie todo antes de ejecutar un comando. Si no se usa podría suceder que se ejecute un comando de Anchore y de error por no haber esperado a que se inicialice

Añadir la imagen para que Anchore la analice, Anchore bajara del repositorio de docker hub si solo se especifica el nombre en vez de la url

Muestra el contenido del tipo que se especifique, a elegir la lista de abajo.

Siendo tipo uno de estos posibles:

  • os: paquetes del sistema operativo de la imagen
  • files: sistema de ficheros de la imagen
  • npm: paquetes npm que la imagen contiene
  • gem: paquetes gem que la imagen contiene
  • python: paquetes python que la imagen contiene
  • java: paquetes java que la imagen contiene

 

Muestra información del bundle de políticas

Muestra toda lista de políticas predefinidas por Anchore. anchore_default_bundle viene preinstalado para ejecutar la evaluación de imagen contra esa política

Instala el bundle de políticas, pero no las activa, solo puede haber una política activada

Añade una política desde un fichero json

Activa cualquier política de la lista de políticas disponibles, solo puede haber una política activa a la vez

Ejecutar comprobación de que la imagen cumple las políticas definidas y mostrar los detalles de las vulnerabilidades encontradas que han causado que la imagen sea suspendida en la evaluación.

Añadir las credenciales de un repositorio

Borra las credenciales que Anchore tiene guardada bajo el nombre del registro

Dejar respuesta

Please enter your comment!
Please enter your name here