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

GitLab ofrece a sus usuarios la posibilidad de 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. También permite a los usuarios que disponen de las funcionalidades de GitLab Ultimate mostrar directamente en la interfaz de GitLab las vulnerabilidades detectadas en la imagen escaneada, así como la lista de los paquetes detectados.

Cyberwatch puede utilizarse para escanear imágenes en una CI de GitLab. A continuación, veremos cómo configurar y utilizar 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 la fuente
  7. Guardar

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

Es posible crear varios juegos de credenciales y así definir 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 los nodos en una instancia multinodo o añadir concurrencia en un mismo nodo.

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

Un intervalo demasiado corto puede provocar problemas de sobrecarga de la API, mientras que un intervalo 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 de GitLab.

Para indicar a GitLab que se utiliza Cyberwatch como escáner de contenedores, deberá modificar el archivo gitlab-ci.yml del proyecto e integrar el siguiente fragmento, 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

Es necesario configurar las siguientes variables de entorno para que el escáner de imágenes Docker pueda contactar con Cyberwatch:

  • CYBERWATCH_SCANNER_ENDPOINT : Punto de conexión configurado anteriormente
  • CYBERWATCH_SCANNER_USER : Nombre de usuario asociado al punto de conexión
  • CYBERWATCH_SCANNER_PASSWORD : Contraseña asociada al usuario

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

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

Hay más información 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 de GitLab, de la siguiente forma:

  • 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. Conectarse a GitLab con una cuenta que tenga acceso a la página de configuración del proyecto correspondiente
  2. En la página del proyecto, desplegar la sección « Parámetros » y acceder 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 registradas las variables de entorno y añadido el archivo gitlab-ci.yml, la imagen designada 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 de GitHub mediante las GitHub Actions. Las principales diferencias residen en la declaración de las variables y la forma de estructurar el pipeline.

Declaración de variables de entorno

Tras haber configurado un escáner de contenedores desde Cyberwatch, se mostrarán 3 variables para enlazar la instancia de Cyberwatch con el repositorio de GitHub.

  1. Recuperar así CYBERWATCH_SCANNER_ENDPOINT, CYBERWATCH_SCANNER_USER y CYBERWATCH_SCANNER_PASSWORD
  2. Añadirlas 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 », luego en « set up a workflow yourself » (o « Simple Workflow » para tener una estructura de inicio). A continuación, un ejemplo de un pipeline mínimo que permite el escaneo de la imagen pública Ruby al hacer 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 

Para la creación de un pipeline más complejo, puede consultar la documentación de GitHub.


Volver arriba

English Français Español