Aller au contenu principal

Integrer la sécurité dés le départ avec 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.

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 :

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 conteneurs
  • filesystem : scanne les dossiers
  • repository : pour les dépôts Git
  • rootfs : scanne les rootfs des images ou des VM
  • sbom : scanne les (SBOM) existantes
  • vm : scannes les images de machines virtuelles locales (vmdk) ou sur AWS EC2
  • kubernetes : 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 :

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 :

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.

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.

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: 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é est un aspect crucial dans les environnements DevOps modernes. 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é.

Plus d'informations