Skip to content

Análisis de Vulnerabilidades usando Clair

Desarrollo del tema

K8S-Clair-Logo

Clair es un proyecto de open source que proporciona una herramienta para monitorear la seguridad de sus contenedores a través del análisis estático de vulnerabilidades en contenedores appc y docker. Clair es un motor de análisis basado en API que inspecciona los contenedores capa por capa en busca de fallas de seguridad conocidas. Con Clair, puede crear fácilmente servicios que proporcionen un monitoreo continuo de las vulnerabilidades de los contenedores.

Los datos de vulnerabilidad se importan continuamente desde un conjunto conocido de fuentes y se correlacionan con el contenido indexado de las imágenes del contenedor para producir listas de vulnerabilidades que amenazan un contenedor. Cuando los datos de vulnerabilidad cambian en sentido ascendente, el estado anterior y el nuevo estado de la vulnerabilidad junto con las imágenes a las que afectan se pueden enviar a través de un webhook a un punto final configurado. Todos los componentes principales se pueden personalizar mediante programación en tiempo de compilación sin bifurcar el proyecto. Clair apoya la seguridad de los contenedores mediante:

  • Actualizar datos de vulnerabilidad de un conjunto de fuentes que usted define y almacenar estos datos en su base de datos.

  • Permitir a los clientes consultar esta base de datos en busca de vulnerabilidades dentro de imágenes específicas mediante el uso de una API.

  • Indexación de imágenes de contenedores con una lista de características presentes en la imagen mediante el uso de una API

Laboratorio: Análisis usando Clair

Descripción

En la presente guía se creara una imagen de contenedor y se procederá con el respectivo análisis usando la herramienta Clair.

Objetivos

  • Instalar Clair y usarlo para analizar una imagen de contenedor.

Antes de comenzar

  • Contar con el acceso al ambiente del laboratorio.

Inicio de laboratorio

  1. Crearemos un archivo Docker Compose y Config siguiente manera:

    mkdir -p example-clair/docker-compose-data/clair-config; touch example-clair/docker-compose.yaml; touch example-clair/docker-compose-data/clair-config/config.yml
    
  2. Con el editor de texto añadiremos el contenido según corresponda:

    • Se agrega el contenido del archivo Docker Compose:
    vim example-clair/docker-compose.yaml
    
    services:
      postgres:
        image: postgres:9.6
        restart: unless-stopped
        volumes:
          - ./docker-compose-data/postgres-data/:/var/lib/postgresql/data:rw
        environment:
          - POSTGRES_PASSWORD=ChangeMe
          - POSTGRES_USER=clair
          - POSTGRES_DB=clair
    
      clair:
        image: quay.io/coreos/clair:v2.0.0
        restart: unless-stopped
        volumes:
          - ./docker-compose-data/clair-config/:/config/:ro
          - ./docker-compose-data/clair-tmp/:/tmp/:rw
        depends_on: 
          postgres:
            condition: service_started
        command: [--log-level=debug, --config, /config/config.yml]
    
      clairctl:
        image: jgsqware/clairctl:latest
        restart: unless-stopped
        environment: 
          - DOCKER_API_VERSION=1.24
        volumes:
          - ./docker-compose-data/clairctl-reports/:/reports/:rw
          - /var/run/docker.sock:/var/run/docker.sock:ro
        depends_on: 
          clair: 
            condition: service_started
    
    • Se agrega el contenido del archivo Config:
    vim example-clair/docker-compose-data/clair-config/config.yml
    
    clair:
      database:
        type: pgsql
        options:
          source: postgresql://clair:ChangeMe@postgres:5432/clair?sslmode=disable
          cachesize: 16384
      api:
        port: 6060
        healthport: 6061
        timeout: 900s
      updater:
        interval: 2h
      notifier:
        attempts: 3
        renotifyinterval: 2h
    
  3. Iniciamos el Docker Compose:

    cd example-clair; sudo docker compose up -d
    
  4. Cambiamos de manera temporal los permisos del docker.sock:

    sudo chmod 666 /var/run/docker.sock
    
  5. Descargamos una imagen de prueba:

    sudo docker pull infoslack/dvwa
    
  6. Analizamos la imagen con Clair:

    sudo docker compose exec clairctl clairctl analyze -l infoslack/dvwa
    
  7. Creamos un reporte de lo analizado:

    sudo docker compose exec clairctl clairctl report -l infoslack/dvwa
    
  8. Limpiamos el ambiente:

    sudo docker compose down -v; cd ~
    sudo chmod 660 /var/run/docker.sock