Scanner les vulnérabilités de vos containers

C’est un fait les conteneurs sont de plus en plus utilisés, car ils facilitent la création, et déploiements des applications. Mais attention, la sécurité des conteneurs est très importante car vous pouvez rapidement créer de graves failles dans votre SI. En effet, par exemple récemment il a été détecté des containers de la registry docker intégrant un ver de cryptojacking. Même si containers ont été retirés il est plus sage de soit construire ces images, soit de les scanner pour en connaître les vulnérabilités.

Il existe toute série de scanner dont voici la liste: - Anchor engine - Clair - Quay - MicroScanner - GCR - Trivy

C’est à ce dernier que je me suis intéressé.

Installation de trivy

Trivy est disponible sous forme de packages Debian et Centos:

Pour Centos/Redhat:

yum remove trivy
sed -i s/knqyf263/aquasecurity/g /etc/yum.repos.d/trivy.repo
yum update
yum install trivy

Pour Debian/Ubuntu:

$ apt-get remove --purge trivy
$ sed -i s/knqyf263/aquasecurity/g /etc/apt/sources.list.d/trivy.list
$ apt-get update
$ apt-get install trivy

Trivy est également disponible sous forme d’image aquasec/trivy

Utilisation de trivy

Nous allons nous intéresser à la version package et nous verrons plus tard comment l’intégrer dans votre CI.

Le plus simple est lancer la commande sur cette image

trivy aquasec/trivy

Résultat :

trivy  aquasec/trivy
2019-10-25T13:36:33.239+0200    INFO    Updating vulnerability database...
2019-10-25T13:38:53.025+0200    INFO    Updating alpine data...
 13946 / 13946 [========] 100.00% 7s
2019-10-25T13:39:01.067+0200    INFO    Updating redhat data...
 20628 / 20628 [========] 100.00% 3s
2019-10-25T13:39:04.604+0200    INFO    Updating debian data...
 29544 / 29544 [========] 100.00% 23s
2019-10-25T13:39:28.179+0200    INFO    Updating debian-oval data...
 62969 / 62969 [========] 100.00% 3s
2019-10-25T13:39:32.225+0200    INFO    Updating ubuntu data...
 31651 / 31651 [========] 100.00% 8s
2019-10-25T13:39:41.158+0200    INFO    Updating nvd data...
 130960 / 130960 [========] 100.00% 1m33s
2019-10-25T13:41:14.318+0200    WARN    You should avoid using the :latest tag as it is cached. You need to specify ’--clear-cache’ option when :latest image is changed
2019-10-25T13:41:16.969+0200    INFO    Detecting Alpine vulnerabilities...

aquasec/trivy (alpine 3.10.3)
=============================
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

Lors du premier run, trivy va installer en local une base de données de vulnéribilités dans le répertoire : ~/.cache/trivy

Ensuite il passe au scan à proprement parlé du contenu de l’image. En fait il liste tous les packages installés et recherche dans sa bdd les vulnérabilités de ceux-ci.

Prenons exemple de l’image alpine:3.9.2

+---------+------------------+----------+-------------------+---------------+--------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |             TITLE              |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
| musl    | CVE-2019-14697   | HIGH     | 1.1.20-r3         | 1.1.20-r5     | musl libc through 1.1.23       |
|         |                  |          |                   |               | has an x87 floating-point      |
|         |                  |          |                   |               | stack adjustment imbalance,    |
|         |                  |          |                   |               | related...                     |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
| openssl | CVE-2019-1543    | MEDIUM   | 1.1.1a-r1         | 1.1.1b-r1     | openssl: ChaCha20-Poly1305     |
|         |                  |          |                   |               | with long nonces               |
+         +------------------+          +                   +---------------+--------------------------------+
|         | CVE-2019-1549    |          |                   | 1.1.1d-r0     | openssl: information           |
|         |                  |          |                   |               | disclosure in fork()           |
+         +------------------+          +                   +               +--------------------------------+
|         | CVE-2019-1563    |          |                   |               | openssl: information           |
|         |                  |          |                   |               | disclosure in PKCS7_dataDecode |
|         |                  |          |                   |               | and CMS_decrypt_set1_pkey      |
+         +------------------+----------+                   +               +--------------------------------+
|         | CVE-2019-1547    | LOW      |                   |               | openssl: side-channel weak     |
|         |                  |          |                   |               | encryption vulnerability       |
+---------+------------------+----------+-------------------+---------------+--------------------------------+

On voit qu’il y en a plusieurs dont une critique.

Faites le test sur par exemple l’image mysql et vous comprendrez pourquoi il est plus sage de construire ses propres en n’intégrant que les packages nécessaires.

Il est possible de demander à trivy de ressortir en erreur sur la présence de vulnérabilités de type CRITICAL ou HIGH.

trivy --skip-update --quiet --exit-code 1 --severity HIGH,CRITICAL alpine:3.9.2

Avec comme résultat :

2019-10-25T14:04:26.566+0200    INFO    Detecting Alpine vulnerabilities...
alpine:3.9.2 (alpine 3.9.2)
===========================
Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)

+---------+------------------+----------+-------------------+---------------+--------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |             TITLE              |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
| musl    | CVE-2019-14697   | HIGH     | 1.1.20-r3         | 1.1.20-r5     | musl libc through 1.1.23       |
|         |                  |          |                   |               | has an x87 floating-point      |
|         |                  |          |                   |               | stack adjustment imbalance,    |
|         |                  |          |                   |               | related...                     |
+---------+------------------+----------+-------------------+---------------+--------------------------------+
echo $?
1

Pratique pour l’intégrer dans votre CI.

Intégration dans Gitlab-CI

Comme vu précédemment il existe une version sous forme de container qui peut être intégré à votre CI. J’ai créé un runner dédié à trivy. En effet j’ai décidé de mettre le cache de trivy dans un répertoire de ma VM et de le monter sur le volume /cache.

Dans mon gitlab-ci.yaml j’ai intégré le step suivant en indiquant que le cache se trouve dans /cache/trivy.

trivy:
  image:
    name: aquasec/trivy
    entrypoint: [""]
  tags:
    - trivy
  script:
    - trivy --skip-update --quiet --cache-dir /cache/trivy --exit-code 1 --severity HIGH,CRITICAL --format table --output report.md --vuln-type os $IMAGE

Pour éviter les updates pendant le run du ci, j’ai créé un job cron qui vient mettre à jour ce cache toutes les 2h.


Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) au travers des liens produits ci-contre, je touche une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!

comments powered by Disqus