Skip to content

Análisis de Vulnerabilidades usando Anchore

Desarrollo del tema

K8S-Anchore-Logo

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

  1. Instalación de Anchore CLI:

    sudo yum install python3-pip -y && sudo pip3 install anchorecli
    
  2. Crearemos un Docker Compose siguiente manera:

    mkdir example-anchore; touch example-anchore/docker-compose.yaml
    
  3. 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.yaml
    
    volumes:
      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"]
    
  4. Iniciamos el Docker Compose:

    cd example-anchore; sudo docker compose up -d
    
  5. Definimos la variable de URL de Anchore:

    ANCHORE_CLI_URL=http://localhost:8228/v1
    
  6. Añadimos una imagen al Anchore Engine:

    anchore-cli --u admin --p foobar image add docker.io/library/openjdk:8-jre-alpine
    
  7. Listamos las imagenes agregadas:

    anchore-cli --u admin --p foobar image list
    
  8. 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
    
  9. 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
    
  10. Limpiamos el ambiente:

    sudo docker compose down -v && cd ~