Escanejar les imatges Docker en una cadena d’integració contínua (CI) de GitLab

GitLab ofereix als seus usuaris la possibilitat d’escanejar un contenidor en una CI mitjançant un escàner extern. Això permet incloure a la CI una etapa durant la qual Cyberwatch generarà la llista de vulnerabilitats i l’SBOM d’una imatge Docker. També permet als usuaris que tenen accés a les funcionalitats de GitLab Ultimate mostrar directament a la interfície de GitLab les vulnerabilitats detectades a la imatge escanejada, així com la llista de paquets detectats.

Cyberwatch es pot utilitzar per escanejar les imatges en una CI de GitLab. A continuació veurem com configurar i utilitzar aquesta funcionalitat.

Configurar l’escàner de contenidors

Perquè GitLab es pugui connectar a Cyberwatch, cal configurar un escàner de contenidors:

  1. Feu clic a Administració
  2. Feu clic a Eines externes
  3. Feu clic a la pestanya Escàners de contenidors
  4. Feu clic al botó Afegeix
  5. Trieu un nom i seleccioneu l’objectiu «GitLab»
  6. Trieu l’origen
  7. Deseu

Obtindreu les dades necessàries per afegir Cyberwatch com a escàner de contenidors a GitLab. Assegureu-vos de desar aquestes dades, perquè després ja no s’hi podrà accedir.

Es poden crear diversos jocs de credencials i definir així diversos escàners en diverses CI. Això permet configurar a cada projecte l’escàner que s’ha d’utilitzar. Així es poden repartir els escanejos d’imatges Docker entre els nodes d’una instància amb diversos nodes o afegir concurrència en un mateix node.

També es pot ajustar el temps entre dues sol·licituds a l’API. Aquest temps correspon a l’interval entre dues sol·licituds a l’API durant la creació de l’informe de vulnerabilitats d’una imatge Docker.

Un temps massa curt pot provocar problemes de sobrecàrrega de l’API, i un temps massa llarg allargarà innecessàriament el temps necessari per escanejar una imatge. El valor per defecte és de 30 segons.

Afegir Cyberwatch com a escàner de contenidors

Ara ja podeu afegir Cyberwatch com a escàner de contenidors per a les vostres CI de GitLab.

Per indicar a GitLab que s’utilitza Cyberwatch com a escàner de contenidors, heu de modificar el fitxer gitlab-ci.yml del projecte i integrar-hi el fragment següent, o una variant:

stages:
  - test # Requis

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

container_scanning: # Le nom NE DOIT PAS être modifié
  stage: test # Requis
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Modifiable
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Modifiable
  variables:
    CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG # Modifiable
    CS_ANALYZER_IMAGE: cyberwatch/ci-container-scanner # Requis

Cal configurar unes variables d’entorn perquè l’escàner d’imatges Docker pugui contactar amb Cyberwatch:

  • CYBERWATCH_SCANNER_ENDPOINT: punt final configurat anteriorment
  • CYBERWATCH_SCANNER_USER: nom d’usuari associat al punt final
  • CYBERWATCH_SCANNER_PASSWORD: contrasenya associada a l’usuari

A més de les variables necessàries per a Cyberwatch, es poden utilitzar altres variables per configurar l’accés a Cyberwatch:

  • CYBERWATCH_SCANNER_INSECURE: (per defecte: no definida). Si la variable està configurada, la connexió entre el contenidor de l’escàner i Cyberwatch es farà de manera no segura. No es recomana utilitzar aquesta opció

Trobareu més informació a la documentació de GitLab sobre les variables (en anglès).

El registre Docker es dedueix automàticament de la imatge escanejada. L’accés al registre es fa amb les credencials que es passen com a variables d’entorn a la CI de GitLab, de la manera següent:

  • CS_REGISTRY_USER: nom d’usuari utilitzat per a la connexió al registre
  • CS_REGISTRY_PASSWORD: contrasenya utilitzada per a la connexió al registre

El procediment per afegir aquestes variables d’entorn al vostre projecte és el següent:

  1. Inicieu la sessió a GitLab amb un compte que tingui accés a la pàgina de paràmetres del projecte en qüestió
  2. A la pàgina del projecte, desplegueu la secció «Settings» i aneu a la secció CI/CD
  3. Desplegueu la secció «Variables»
  4. Afegiu les variables CYBERWATCH_SCANNER_ENDPOINT, CYBERWATCH_SCANNER_USER, CYBERWATCH_SCANNER_PASSWORD i, si cal, CS_REGISTRY_USER i CS_REGISTRY_PASSWORD

Un cop desades les variables d’entorn i afegit el fitxer gitlab-ci.yml, Cyberwatch escanejarà la imatge designada per $CS_IMAGE. Als artefactes del job «container_scanning» trobareu dos fitxers:

  • gl-container-scanning-report.json: l’informe de vulnerabilitats interpretable per GitLab segons l’especificació disponible aquí
  • gl-sbom-report-cdx.json: l’SBOM de la imatge Docker en format CycloneDX, l’especificació del qual està disponible aquí

Escanejar les imatges Docker en una cadena d’integració contínua (CI) de GitHub

Seguint un procediment similar al que s’utilitza per a GitLab, es pot integrar Cyberwatch en un pipeline de GitHub mitjançant les GitHub Actions. Les diferències principals són la declaració de les variables i la manera d’estructurar el pipeline.

Declaració de les variables d’entorn

Després de configurar un escàner de contenidors des de Cyberwatch, es mostraran 3 variables per establir la connexió entre la instància de Cyberwatch i el repositori de GitHub.

  1. Recupereu així CYBERWATCH_SCANNER_ENDPOINT, CYBERWATCH_SCANNER_USER i CYBERWATCH_SCANNER_PASSWORD
  2. Afegiu-les com a secrets al vostre repositori a «Settings» i, després, a la pestanya «Secrets and variables» i «Actions»

Aquestes 3 variables són obligatòries perquè la integració funcioni correctament. Tanmateix, n’hi ha d’altres d’opcionals que permeten, per exemple, autenticar-se en un registre privat, descrites anteriorment.

Creació del pipeline de GitHub Actions

Per crear un pipeline de CI amb GitHub, feu clic a «Action» i després a «set up a workflow yourself» (o «Simple Workflow» per tenir una estructura de partida). Aquí teniu un exemple de pipeline mínim que permet escanejar la imatge pública de Ruby en fer un push al repositori:

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 

Per establir un pipeline més complex, podeu consultar la documentació de GitHub.