Aller au contenu

Integrer la sécurité dés le départ avec Trivy

Mise à jour :

Trivy

Dans le monde du développement logiciel, la sécurité est souvent reléguée au second plan dans les cycles de développement. Cependant, avec l’émergence de concepts tels que DevSecOps, il est devenu impératif d’intégrer la sécurité dès les premières étapes du développement. C’est ici qu’intervient Trivy, un outil d’analyse de code open source, devenu rapidement populaire dans la communauté DevOps pour sa fiabilité, sa rapidité et sa facilité d’intégration dans les pipelines CI/CD.

L’histoire de Trivy

Trivy a été lancé au départ avec la vision de simplifier la sécurité pour les développeurs et les équipes d’opérations. Contrairement à d’autres outils qui nécessitaient une configuration complexe et une compréhension approfondie des aspects de sécurité, Trivy se distinguait par sa simplicité d’utilisation. Cette facilité d’accès a permis même aux développeurs moins expérimentés en matière de sécurité de l’intégrer dans leurs workflows de développement.

L’outil a évolué rapidement, passant d’un simple scanner de vulnérabilités à une solution complète pour la sécurité des applications et des infrastructures. Aujourd’hui, Trivy est capable de détecter non seulement les vulnérabilités dans les images de conteneurs, mais aussi des configurations incorrectes contenues dans l’Infrastructure as Code (IaC), les risques de sécurité des clusters Kubernetes et bien plus encore.

Fonctionnalités de Trivy

Trivy se distingue non seulement par sa facilité d’utilisation, mais aussi par son éventail complet de fonctionnalités qui en font un outil polyvalent pour la sécurité dans le développement logiciel. Les bases de données de Trivy sont constamment mises à jour avec les dernières informations sur les failles, garantissant ainsi que les scans sont basés sur les données les plus récentes.

Trivy est capable de scanner une variété de “targets”, y compris les images de conteneurs, les codes IaC, les dépôts Git, des images de VM, des clusters kubernetes et depuis peu des configurations de compte AWS.

Trivy génère des SBOM ou des KBOM détaillés, fournissant un inventaire complet des composants logiciels. Les SBOM permet d’avoir une compréhension approfondie des composants utilisés à leur construction. Les SBOM peuvent être signé avec Cosign, ainsi que l’image. Ces signatures pourront ensuite être vérifiées avant d’être déployé dans un cluster kubernetes pour confirmer leur origine.

Trivy peut également lancer des benchs permettant de vérifier que les artefacts produits sont conformes aux normes. Vous l’aurez compris Trivy ne se limite plus au simple scan d’images de conteneurs. Voyons comment l’utiliser.

Installation de Trivy

L’installation de Trivy est assez simple, car le package ne contient qu’un seul binaire.

Installation sur Linux

Sur les systèmes Linux, Trivy peut être installé via le gestionnaire de paquets. Mais je vous conseille de le faire avec asdf qui permet d’installer les dernières versions.

Terminal window
asdf plugin add trivy
asdf install trivy latest
asdf global trivy latest

Installation sur macOS

Pour les utilisateurs de macOS, Trivy peut être installé via Homebrew en exécutant la commande suivante :

Terminal window
brew install trivy

Installation sur Windows

Sur Windows, Trivy peut être installé en téléchargeant le fichier exécutable depuis la page de releases de Trivy sur GitHub et en l’ajoutant au PATH du système. Un moyen est d’utiliser chocolatey.

Vérification de l’Installation

Une fois installé, vous pouvez vérifier que Trivy fonctionne correctement en exécutant la commande suivante :

Terminal window
trivy --version

Cette commande affichera la version de Trivy installée, confirmant que l’installation a été réussie.

Utilisation de la CLI Trviy

La CLI Trivy utilise ce format de commande :

Terminal window
trivy [global flags] command [flags] target

Les principales commandes de scan

Les principales commandes de scan sont les suivantes :

  • image : scanne les images de conteneurs
  • fs : scanne les dossiers
  • repository : pour les dépôts Git
  • rootfs : scanne les rootfs des images ou des VM
  • repo: scanne les dépôts de code
  • sbom : scanne les (SBOM) existantes
  • vm : scannes les images de machines virtuelles locales (vmdk) ou sur AWS EC2
  • k8s : scannes les clusters

Trivy peut utiliser des scanners spécifiques qui sont :

  • vuln : pour les vulnérabilités
  • config : pour les mauvaises configurations dans du code IAC
  • secret : pour les secrets stockés en clair
  • license : pour lister les licences

Par défaut seuls les scanners vuln et secret sont lancés. Pour les autres, il faudra les invoquer avec le global flag --scanners.

Ce qui donne par exemple la commande complète suivante :

Terminal window
trivy image --scanners vuln,secret,license alpine:latest
2023-11-14T08:24:35.280+0100 INFO Vulnerability scanning is enabled
2023-11-14T08:24:35.280+0100 INFO Secret scanning is enabled
2023-11-14T08:24:35.280+0100 INFO If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-11-14T08:24:35.280+0100 INFO Please see also https://aquasecurity.github.io/trivy/v0.44/docs/scanner/secret/#recommendation for faster secret detection
2023-11-14T08:24:35.280+0100 INFO License scanning is enabled
2023-11-14T08:24:41.295+0100 INFO Detected OS: alpine
2023-11-14T08:24:41.295+0100 INFO Detecting Alpine vulnerabilities...
2023-11-14T08:24:41.299+0100 INFO Number of language-specific files: 0
alpine:latest (alpine 3.18.4)
Total: 4 (UNKNOWN: 0, LOW: 0, MEDIUM: 2, HIGH: 2, CRITICAL: 0)
┌────────────┬───────────────┬──────────┬────────┬───────────────────┬───────────────┬────────────────────────────────────────────────────────┐
Library Vulnerability Severity Status Installed Version Fixed Version Title
├────────────┼───────────────┼──────────┼────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────┤
libcrypto3 CVE-2023-5363 HIGH fixed 3.1.3-r0 3.1.4-r0 openssl: Incorrect cipher key and IV length processing
https://avd.aquasec.com/nvd/cve-2023-5363
├───────────────┼──────────┤ ├───────────────┼────────────────────────────────────────────────────────┤
CVE-2023-5678 MEDIUM 3.1.4-r1 openssl: Generating excessively long X9.42 DH keys or
checking excessively long X9.42...
https://avd.aquasec.com/nvd/cve-2023-5678
├────────────┼───────────────┼──────────┤ ├───────────────┼────────────────────────────────────────────────────────┤
libssl3 CVE-2023-5363 HIGH 3.1.4-r0 openssl: Incorrect cipher key and IV length processing
https://avd.aquasec.com/nvd/cve-2023-5363
├───────────────┼──────────┤ ├───────────────┼────────────────────────────────────────────────────────┤
CVE-2023-5678 MEDIUM 3.1.4-r1 openssl: Generating excessively long X9.42 DH keys or
checking excessively long X9.42...
https://avd.aquasec.com/nvd/cve-2023-5678
└────────────┴───────────────┴──────────┴────────┴───────────────────┴───────────────┴────────────────────────────────────────────────────────┘
OS Packages (license)
Total: 19 (UNKNOWN: 0, LOW: 10, MEDIUM: 1, HIGH: 8, CRITICAL: 0)
┌────────────────────────┬──────────────┬────────────────┬──────────┐
Package License Classification Severity
├────────────────────────┼──────────────┼────────────────┼──────────┤
alpine-baselayout GPL-2.0 Restricted HIGH
├────────────────────────┤
alpine-baselayout-data
├────────────────────────┼──────────────┼────────────────┼──────────┤
alpine-keys MIT Notice LOW
├────────────────────────┼──────────────┼────────────────┼──────────┤
apk-tools GPL-2.0 Restricted HIGH
├────────────────────────┤
busybox
├────────────────────────┤
busybox-binsh
├────────────────────────┼──────────────┼────────────────┼──────────┤
ca-certificates-bundle MPL-2.0 Reciprocal MEDIUM
├──────────────┼────────────────┼──────────┤
MIT Notice LOW
├────────────────────────┼──────────────┤
libc-utils BSD-2-Clause
├──────────────┤
BSD-3-Clause
├────────────────────────┼──────────────┤
libcrypto3 Apache-2.0
├────────────────────────┤
libssl3
├────────────────────────┼──────────────┤
musl MIT
├────────────────────────┤
musl-utils
├──────────────┤
BSD-2-Clause
├──────────────┼────────────────┼──────────┤
GPL-2.0 Restricted HIGH
├────────────────────────┤
scanelf
├────────────────────────┤
ssl_client
├────────────────────────┼──────────────┼────────────────┼──────────┤
zlib Zlib Notice LOW
└────────────────────────┴──────────────┴────────────────┴──────────┘

Trivy va scanner l’image myimage:latest à la recherche de code d’infra contenant des problèmes de sécurité.

On peut réaliser la même opération sur le scan d’une VM en utilisant la commande rootfs :

Terminal window
trivy rootfs --scanners vuln --vuln-type os --severity HIGH /
2023-12-07T10:15:37.532+0100 INFO Need to update DB
2023-12-07T10:15:37.532+0100 INFO DB Repository: ghcr.io/aquasecurity/trivy-db
2023-12-07T10:15:37.532+0100 INFO Downloading DB...
2023-12-07T10:15:39.568+0100 INFO Vulnerability scanning is enabled
2023-12-07T10:15:40.358+0100 INFO Detected OS: ubuntu
2023-12-07T10:15:40.358+0100 INFO Detecting Ubuntu vulnerabilities...
internal (ubuntu 22.04)
Total: 16 (HIGH: 16)
┌───────────────────────────────────────┬───────────────┬──────────┬──────────┬──────────────────────┬──────────────────┬────────────────────────────────────────────────────────────┐
Library Vulnerability Severity Status Installed Version Fixed Version Title
├───────────────────────────────────────┼───────────────┼──────────┼──────────┼──────────────────────┼──────────────────┼────────────────────────────────────────────────────────────┤
libssl1.1 CVE-2021-3449 HIGH fixed 1.1.1f-1ubuntu2.20 1.1.1j-1ubuntu3 openssl: NULL pointer dereference in signature_algorithms
processing
https://avd.aquasec.com/nvd/cve-2021-3449
├───────────────┤ ├──────────────────┼────────────────────────────────────────────────────────────┤
CVE-2021-3711 1.1.1l-1ubuntu1 SM2 Decryption Buffer Overflow
https://avd.aquasec.com/nvd/cve-2021-3711
├───────────────┤ ├──────────────────┼────────────────────────────────────────────────────────────┤
CVE-2022-0778 3.0.2-0ubuntu1 openssl: Infinite loop in BN_mod_sqrt() reachable when
parsing certificates
https://avd.aquasec.com/nvd/cve-2022-0778
├───────────────┤ ├──────────────────┼────────────────────────────────────────────────────────────┤
CVE-2022-3602 3.0.2-0ubuntu1.7 X.509 Email Address Buffer Overflow
https://avd.aquasec.com/nvd/cve-2022-3602
├───────────────┤ ├────────────────────────────────────────────────────────────┤
CVE-2022-3786 X.509 Email Address Variable Length Buffer Overflow
https://avd.aquasec.com/nvd/cve-2022-3786
├───────────────┤ ├──────────────────┼────────────────────────────────────────────────────────────┤
CVE-2023-0286 3.0.2-0ubuntu1.8 openssl: X.400 address type confusion in X.509 GeneralName
https://avd.aquasec.com/nvd/cve-2023-0286
├───────────────────────────────────────┼───────────────┤ ├──────────┼──────────────────────┼──────────────────┼────────────────────────────────────────────────────────────┤
linux-headers-5.15.0-88 CVE-2023-6176 affected 5.15.0-88.98 kernel: local dos vulnerability in scatterwalk_copychunks
https://avd.aquasec.com/nvd/cve-2023-6176
├───────────────────────────────────────┤ ├──────────────────┤
linux-headers-5.15.0-88-generic
├───────────────────────────────────────┤ ├──────────────────────┼──────────────────┤
linux-headers-5.15.0-89 5.15.0-89.99
├───────────────────────────────────────┤ ├──────────────────┤
linux-headers-5.15.0-89-generic
├───────────────────────────────────────┤ ├──────────────────┤
linux-libc-dev
├───────────────────────────────────────┤ ├──────────────────────┼──────────────────┤
linux-modules-5.15.0-88-generic 5.15.0-88.98
├───────────────────────────────────────┤ ├──────────────────────┼──────────────────┤
linux-modules-5.15.0-89-generic 5.15.0-89.99
├───────────────────────────────────────┤ ├──────────────────────┼──────────────────┤
linux-modules-extra-5.15.0-88-generic 5.15.0-88.98
├───────────────────────────────────────┤ ├──────────────────────┼──────────────────┤
linux-modules-extra-5.15.0-89-generic 5.15.0-89.99
├───────────────────────────────────────┼───────────────┤ ├──────────────────────┼──────────────────┼────────────────────────────────────────────────────────────┤
nodejs CVE-2023-0286 18.19.0-1nodesource1 openssl: X.400 address type confusion in X.509 GeneralName
https://avd.aquasec.com/nvd/cve-2023-0286
└───────────────────────────────────────┴───────────────┴──────────┴──────────┴──────────────────────┴──────────────────┴────────────────────────────────────────────────────────────┘

Tests de compliance

Trivy permet également de manière expérimentale de lancer des benchs des principales organisations sur les images de container, les clusters kubernetes et les comptes AWS.

Terminal window
trivy image --compliance docker-cis [YOUR_IMAGE_NAME]
trivy image --compliance docker-cis infisical/infisical:latest
2023-11-14T07:20:12.992+0100 INFO Container image config scanners: ["config" "secret"]
2023-11-14T07:20:12.992+0100 INFO Vulnerability scanning is enabled
2023-11-14T07:20:12.992+0100 INFO Misconfiguration scanning is enabled
2023-11-14T07:20:14.480+0100 INFO Need to update the built-in policies
2023-11-14T07:20:14.480+0100 INFO Downloading the built-in policies...
44.66 KiB / 44.66 KiB [------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00% ? p/s 100ms
2023-11-14T07:20:27.446+0100 INFO Detected OS: alpine
2023-11-14T07:20:27.446+0100 INFO Detecting Alpine vulnerabilities...
2023-11-14T07:20:27.450+0100 INFO Number of language-specific files: 1
2023-11-14T07:20:27.450+0100 INFO Detecting node-pkg vulnerabilities...
Summary Report for compliance: CIS Docker Community Edition Benchmark v1.1.0
┌──────┬──────────┬───────────────────────────────────────────────────────────┬────────┬────────┐
ID Severity Control Name Status Issues
├──────┼──────────┼───────────────────────────────────────────────────────────┼────────┼────────┤
4.1 HIGH Ensure a user for the container has been created PASS 0
4.2 HIGH Ensure that containers use trusted base images (Manual) │ - │ - │
4.3 HIGH Ensure unnecessary packages are not installed in the - -
container (Manual) │ │ │
4.4 CRITICAL Ensure images are scanned and rebuilt to include security PASS 0
patches
4.5 LOW Ensure Content trust for Docker is Enabled (Manual) │ - │ - │
4.6 LOW Ensure HEALTHCHECK instructions have been added to the PASS 0
container image
4.7 HIGH Ensure update instructions are not use alone in the PASS 0
Dockerfile
4.8 HIGH Ensure setuid and setgid permissions are removed in the - -
images (Manual) │ │ │
4.9 LOW Ensure COPY is used instead of ADD in Dockerfile PASS 0
4.10 CRITICAL Ensure secrets are not stored in Dockerfiles PASS 0
4.11 MEDIUM Ensure verified packages are only Installed (Manual) │ - │ - │
└──────┴──────────┴───────────────────────────────────────────────────────────┴────────┴────────┘

Gestion de configuration

Trivy peut être configuré des manières suivantes. Chaque élément est prioritaire sur l’élément situé en dessous :

  • Les flags de la CLI
  • Les Variables d’environnement
  • Fichier de configuration

Les flags de la CLI

Vous pouvez afficher la liste des indicateurs disponibles en utilisant l’ option --help.

Terminal window
Flags:
--cache-dir string cache directory (default "/home/bob/.cache/trivy")
-c, --config string config path (default "trivy.yaml")
-d, --debug debug mode
-f, --format string version format (json)
--generate-default-config write the default config to trivy-default.yaml
-h, --help help for trivy
--insecure allow insecure server connections
-q, --quiet suppress progress bar and log output
--timeout duration timeout (default 5m0s)
-v, --version show version

Les variables d’environnement

Trivy peut être personnalisé par des variables d’environnement. La clé de la variable d’environnement est le nom du flag converti par la procédure suivante : TRIVY + _ + flag. Ce qui donne par exemple :

Terminal window
--debug=>TRIVY_DEBUG
--cache-dir=>TRIVY_CACHE_DIR

Le fichier de configuration

Il est possible d’utiliser un fichier nommé trivy.yaml pour définir les options de Trivy. Voici un exemple de fichier :

timeout: 10m
format: json
dependency-tree: true
list-all-pkgs: true
exit-code: 1
output: result.json
severity:
- HIGH
- CRITICAL
scan:
skip-dirs:
- /lib64
- /lib
- /usr/lib
- /usr/include
scanners:
- vuln
- secret
vulnerability:
type:
- os
- library
ignore-unfixed: true

La documentation des paramètres

Intégration de Trivy dans les pipelines CI/CD

L’automatisation de la sécurité dans les environnements DevOps va devenir essentiel. Intégrer Trivy dans votre pipeline CI/CD permet d’effectuer des scans de sécurité automatiques à chaque étape du développement, garantissant ainsi que les vulnérabilités soient détectées et traitées rapidement.

Exemple avec Gitlab CI/CD

Pour analyser une image déjà construite et qui a déjà été transférée dans le registre de conteneurs de GitLab. On peut utiliser un cache pour améliorer les temps de scan. Le rapport peut ensuite être stocké dans Gitlab pour des besoins futurs. Les variables d’environnement fournissent le moyen d’authentification à la registry Gitlab. Il faudra au préalable créé ses variables dans la configuration du projet.

Terminal window
container_scanning:
image:
name: docker.io/aquasec/trivy:0.47.0
entrypoint: [""]
variables:
GIT_STRATEGY: none
TRIVY_USERNAME: "$CI_REGISTRY_USER"
TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD"
TRIVY_AUTH_URL: "$CI_REGISTRY"
TRIVY_NO_PROGRESS: "true"
TRIVY_CACHE_DIR: ".trivycache/"
FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
script:
- trivy --version
# cache cleanup is needed when scanning images with the same tags, it does not remove the database
- trivy image --clear-cache
# update vulnerabilities db
- trivy image --download-db-only
# Builds report and puts it in the default workdir $CI_PROJECT_DIR, so `artifacts:` can take it from there
- trivy image --exit-code 0 --format template --template "@/contrib/gitlab.tpl"
--output "$CI_PROJECT_DIR/gl-container-scanning-report.json" "$FULL_IMAGE_NAME"
# Prints full report
- trivy image --exit-code 0 "$FULL_IMAGE_NAME"
# Fail on critical vulnerabilities
- trivy image --exit-code 1 --severity CRITICAL "$FULL_IMAGE_NAME"
cache:
paths:
- .trivycache/
artifacts:
when: always
reports:
container_scanning: gl-container-scanning-report.json
tags:
- docker-runner

Conclusion

À travers cette documentation, j’ai exploré en détail Trivy, un outil de scan de sécurité open source essentiel pour les équipes de développement moderne. De son installation simple à son intégration poussée dans les environnements CI/CD, Trivy se distingue comme un outil incontournable pour assurer la sécurité des applications et des infrastructures dans le cycle de développement.

Vous l’aurez compris Trivy est capable de scanner une variété de “targets”, y compris les images de conteneurs, les codes IaC, les dépôts Git, des images de VM…

Au final Trivy facilite l’adoption de l’approche “Shift Left”, qui demande aux équipes de traiter les problèmes de sécurité dès les premières étapes du développement. Donc Trivy représente bien plus qu’un simple outil de scan de sécurité.

Plus d’informations