Integrer la sécurité dés le départ avec Trivy
Mise à jour :
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.
asdf plugin add trivyasdf install trivy latestasdf global trivy latest
Installation sur macOS
Pour les utilisateurs de macOS, Trivy peut être installé via Homebrew en exécutant la commande suivante :
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 :
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 :
trivy [global flags] command [flags] target
Les principales commandes de scan
Les principales commandes de scan sont les suivantes :
image
: scanne les images de conteneursfs
: scanne les dossiersrepository
: pour les dépôts Gitrootfs
: scanne les rootfs des images ou des VMrepo
: scanne les dépôts de codesbom
: scanne les (SBOM) existantesvm
: scannes les images de machines virtuelles locales (vmdk) ou sur AWS EC2k8s
: scannes les clusters
Trivy peut utiliser des scanners spécifiques qui sont :
vuln
: pour les vulnérabilitésconfig
: pour les mauvaises configurations dans du code IACsecret
: pour les secrets stockés en clairlicense
: 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 :
trivy image --scanners vuln,secret,license alpine:latest2023-11-14T08:24:35.280+0100 INFO Vulnerability scanning is enabled2023-11-14T08:24:35.280+0100 INFO Secret scanning is enabled2023-11-14T08:24:35.280+0100 INFO If your scanning is slow, please try '--scanners vuln' to disable secret scanning2023-11-14T08:24:35.280+0100 INFO Please see also https://aquasecurity.github.io/trivy/v0.44/docs/scanner/secret/#recommendation for faster secret detection2023-11-14T08:24:35.280+0100 INFO License scanning is enabled2023-11-14T08:24:41.295+0100 INFO Detected OS: alpine2023-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 :
trivy rootfs --scanners vuln --vuln-type os --severity HIGH /2023-12-07T10:15:37.532+0100 INFO Need to update DB2023-12-07T10:15:37.532+0100 INFO DB Repository: ghcr.io/aquasecurity/trivy-db2023-12-07T10:15:37.532+0100 INFO Downloading DB...2023-12-07T10:15:39.568+0100 INFO Vulnerability scanning is enabled2023-12-07T10:15:40.358+0100 INFO Detected OS: ubuntu2023-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 ↗.
trivy image --compliance docker-cis [YOUR_IMAGE_NAME]trivy image --compliance docker-cis infisical/infisical:latest2023-11-14T07:20:12.992+0100 INFO Container image config scanners: ["config" "secret"]2023-11-14T07:20:12.992+0100 INFO Vulnerability scanning is enabled2023-11-14T07:20:12.992+0100 INFO Misconfiguration scanning is enabled2023-11-14T07:20:14.480+0100 INFO Need to update the built-in policies2023-11-14T07:20:14.480+0100 INFO Downloading the built-in policies...44.66 KiB / 44.66 KiB [------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00% ? p/s 100ms2023-11-14T07:20:27.446+0100 INFO Detected OS: alpine2023-11-14T07:20:27.446+0100 INFO Detecting Alpine vulnerabilities...2023-11-14T07:20:27.450+0100 INFO Number of language-specific files: 12023-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
.
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 :
--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: 10mformat: jsondependency-tree: truelist-all-pkgs: trueexit-code: 1output: result.jsonseverity: - HIGH - CRITICALscan: skip-dirs: - /lib64 - /lib - /usr/lib - /usr/include
scanners: - vuln - secretvulnerability: 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.
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é.