Escanear imágenes Docker en una cadena de integración continua (CI) de GitLab

GitLab permite a sus usuarios escanear un contenedor en una CI mediante un escáner externo. Esto permite incluir en la CI una etapa durante la cual Cyberwatch generará la lista de vulnerabilidades y el SBOM de una imagen Docker. Esto también permite a los usuarios con acceso a las funcionalidades GitLab Ultimate mostrar

directamente en la interfaz de GitLab las vulnerabilidades detectadas en la imagen escaneada y la lista de paquetes detectados.

Cyberwatch puede utilizarse para escanear imágenes en una CI de GitLab. Vamos a ver cómo configurar y usar esta funcionalidad.

Configurar el escáner de contenedores

Para permitir que GitLab se conecte a Cyberwatch, es necesario configurar un escáner de contenedores:

  1. Hacer clic en Administración
  2. Hacer clic en Herramientas externas
  3. Hacer clic en la pestaña Escáneres de contenedores
  4. Hacer clic en el botón Añadir
  5. Elegir un nombre y seleccionar el destino “GitLab”
  6. Elegir el origen
  7. Guardar

Obtendrá los datos necesarios para añadir Cyberwatch como escáner de contenedores en GitLab. Recuerde guardar estos datos, ya que no estarán accesibles posteriormente.

Es posible crear varios conjuntos de credenciales y definir así varios escáneres en varias CI. Esto permite configurar a nivel de cada proyecto el escáner a utilizar. Así se pueden repartir los escaneos de imágenes Docker entre nodos en una instancia multi-nodo o añadir concurrencia en un mismo nodo.

También es posible ajustar el intervalo entre dos solicitudes de la API. Este tiempo corresponde a la espera entre dos solicitudes de la API durante la creación del informe de vulnerabilidades de una imagen Docker.

Un tiempo demasiado corto puede provocar problemas de sobrecarga de la API; un tiempo demasiado largo alargará innecesariamente el tiempo necesario para escanear una imagen. El valor por defecto es de 30 segundos.

Añadir Cyberwatch como escáner de contenedores

Ahora puede añadir Cyberwatch como escáner de contenedores para sus CI GitLab.

Para indicar a GitLab que se usa Cyberwatch como escáner de contenedores, deberá modificar el archivo gitlab-ci.yml del proyecto e integrar el siguiente extracto, o una variación:

stages:
  - test # Requerido

include:
  - template: Jobs/Container-Scanning.gitlab-ci.yml # Requerido

container_scanning: # El nombre NO DEBE modificarse
  stage: test # Requerido
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Modificable
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Modificable
  variables:
    CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG # Modificable
    CS_ANALYZER_IMAGE: cyberwatch/ci-container-scanner # Requerido

Las variables de entorno necesarias deben configurarse para que el escáner de imágenes Docker pueda contactar con Cyberwatch:

  • CYBERWATCH_SCANNER_ENDPOINT: punto de entrada configurado anteriormente
  • CYBERWATCH_SCANNER_USER: nombre de usuario asociado al punto de entrada
  • CYBERWATCH_SCANNER_PASSWORD: contraseña asociada al usuario

Además de las variables necesarias para Cyberwatch, pueden usarse otras variables para configurar el acceso a Cyberwatch:

  • CYBERWATCH_SCANNER_INSECURE: (por defecto: no asignada). Si la variable se configura, entonces la conexión entre el contenedor escáner y Cyberwatch se realizará de forma no segura. No se recomienda usar esta opción

Más información está disponible en la documentación de GitLab sobre las variables (en inglés).

El registro Docker se deduce automáticamente de la imagen escaneada. El acceso al registro se realiza mediante las credenciales pasadas como variables de entorno a la CI GitLab, como sigue:

  • CS_REGISTRY_USER: identificador utilizado para la conexión al registro
  • CS_REGISTRY_PASSWORD: contraseña utilizada para la conexión al registro

El procedimiento para añadir estas variables de entorno a su proyecto es el siguiente:

  1. Iniciar sesión en GitLab con una cuenta con acceso a la página de parámetros del proyecto correspondiente
  2. En la página del proyecto, desplegar la sección “Parámetros” e ir a la sección CI/CD
  3. Desplegar la sección “Variables”
  4. Añadir las variables CYBERWATCH_SCANNER_ENDPOINT, CYBERWATCH_SCANNER_USER, CYBERWATCH_SCANNER_PASSWORD y, si es necesario, CS_REGISTRY_USER y CS_REGISTRY_PASSWORD

Una vez guardadas las variables de entorno y añadido el archivo gitlab-ci.yml, la imagen indicada por $CS_IMAGE será escaneada por Cyberwatch. En los artefactos del job “container_scanning”, encontrará dos archivos:

  • gl-container-scanning-report.json: el informe de vulnerabilidades interpretable por GitLab según la especificación disponible aquí
  • gl-sbom-report-cdx.json: el SBOM de la imagen Docker en formato CycloneDX, cuya especificación está

disponible aquí

Escanear imágenes Docker en una cadena de integración continua (CI) de GitHub

Siguiendo un procedimiento similar al utilizado para GitLab, es posible integrar Cyberwatch en un pipeline GitHub mediante GitHub Actions. Las principales diferencias residen en la declaración de variables y la manera de estructurar el pipeline.

Declaración de variables de entorno

Después de configurar un escáner de contenedores desde Cyberwatch, se mostrarán 3 variables para enlazar la instancia de Cyberwatch y el repositorio GitHub.

  1. Recupere CYBERWATCH_SCANNER_ENDPOINT, CYBERWATCH_SCANNER_USER y CYBERWATCH_SCANNER_PASSWORD
  2. Añádalas como secretos en su repositorio en “Settings”, luego en la pestaña “Secrets and variables” y “Actions”

Estas 3 variables son obligatorias para el correcto funcionamiento de la integración. Sin embargo, existen otras opcionales que permiten, por ejemplo, autenticarse ante un registro privado, descritas anteriormente.

Creación del pipeline GitHub Action

Para crear un pipeline CI con GitHub, haga clic en “Action” y luego en “set up a workflow yourself” (o “Simple Workflow” para tener una estructura inicial). Aquí hay un ejemplo de un pipeline mínimo que permite el escaneo de la imagen pública Ruby durante un push en el repositorio:

name: GitHub Actions CI Scan Container
on: [push]
jobs:
  CI-Container-Scanner:
    runs-on: ubuntu-latest
    container:
      image: cyberwatch/ci-container-scanner
    env:
      CYBERWATCH_SCANNER_ENDPOINT: ${{ secrets.CYBERWATCH_SCANNER_ENDPOINT }}
      CYBERWATCH_SCANNER_USER: ${{ secrets.CYBERWATCH_SCANNER_USER }}
      CYBERWATCH_SCANNER_PASSWORD: ${{ secrets.CYBERWATCH_SCANNER_PASSWORD }}
      CS_IMAGE: library/ruby:3.0
    steps:
      - run: gtcs 

En el marco de la creación de un pipeline más complejo, es posible consultar la documentación de GitHub.


Volver arriba

English Français Español