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:
- Feu clic a Administració
- Feu clic a Eines externes
- Feu clic a la pestanya Escàners de contenidors
- Feu clic al botó Afegeix
- Trieu un nom i seleccioneu l’objectiu «GitLab»
- Trieu l’origen
- 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:
- Inicieu la sessió a GitLab amb un compte que tingui accés a la pàgina de paràmetres del projecte en qüestió
- A la pàgina del projecte, desplegueu la secció «Settings» i aneu a la secció CI/CD
- Desplegueu la secció «Variables»
- 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.
- Recupereu així
CYBERWATCH_SCANNER_ENDPOINT,CYBERWATCH_SCANNER_USERiCYBERWATCH_SCANNER_PASSWORD - 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.