virli/tutorial/docker-internals/clair.md
2020-09-14 15:46:13 +02:00

5.3 KiB

\newpage

Une vision plus Clair de la sécurité

Nous avons vu, au travers de nos TPs jusqu'à présent, que Docker nous apportait un certain degré de sécurité d'emblée au lancement du conteneur. Cela peut sans doute paraître quelque peu rassurant pour la personne chargée d'administrer la machine hébergeant les conteneurs, car cela lui apporte des garanties quant à l'effort de cloisonnement mis en place.

Mais doit-on pour autant s'arrêter là et considérer que nous avons réglé l'ensemble des problématiques de sécurité liées aux conteneurs ?

Évidemment, non : une fois nos services lancés dans des conteneurs, il ne sont pas moins exposés aux bugs et autres failles applicatives ; qu'elles soient dans notre code ou celui d'une bibliothèque, accessible par rebond, ...

Il est donc primordial de ne pas laisser ses conteneurs à l'abandon une fois leur image créée et envoyée en production. Nos conteneurs doivent être regénérés sitôt que leur image de base est mise à jour (une mise à jour d'une image telle que Debian, Ubuntu ou Redhat n'apparaît que pour cela) ou bien lorsqu'un des programmes ou bibliothèques que l'on a installé ensuite.

Convaincu ? Cela sonne encore comme des bonnes pratiques difficile à mettre en œuvre, pouvant mettre en péril tout un système d'information. Pour s'en protéger, nous allons avoir besoin de réaliser à intervalles réguliers une analyse statique de nos conteneurs.

Rapport d'analyse statique des vulnérabilités d'un conteneur

Clair

Le principal outil pour indexer et chercher des vulnérabilités est Clair, du projet CoreOS. À partir des informations mises à disposition par les équipes de sécurités des principales distributions, cela alimente en continu une base de données qui sera accéder au moment de l'analyse.

L'outil se présente sous la forme d'un serveur autonome dans la récupération de ses données sources, auquel nous pourrons interagir au moyen d'une API : pour lui envoyer des images et lui demander une analyse. Les clients de cette API seront soit les registres directement, soit un programme dédié.

Scan de vulnérabilités sur le Docker Hub

Commençons par lancer notre propre instance de Clair, à l'aide d'un docker-compose.yml :

```yml version: '3' services: postgres: container_name: clair_postgres image: postgres:latest restart: unless-stopped environment: - POSTGRES_PASSWORD

clair: container_name: clair_clair image: quay.io/coreos/clair:v2.0.9 restart: unless-stopped depends_on: - postgres ports: - "6060-6061:6060-6061" links: - postgres volumes: - /tmp:/tmp - ./clair_config:/config command: [-config, /config/config.yaml]

</div>

Prenez quelques minutes pour comprendre ce `docker-compose.yml` : notez la
présence de la variable d'environnement `POSTGRES_PASSWORD`, non définie : ce
sera la variable présente dans votre environnement, au moment du
`docker-compose up` qui sera utilisée. N'oubliez pas de la définir :

<div lang="en-US">
```bash
export POSTGRES_PASSWORD=$(openssl rand -base64 16)

Parmi les volumes partagés avec clair, il y a un dossier ./clair_config. Notez le ./ au début, qui indique que le dossier sera recherché relativement par rapport à l'emplacement du docker-compsose.yml.

Dans ce dossier, vous devez placer un exemplaire du fichier de configuration dont un exemple se trouve dans le dépôt du projet. N'oubliez pas de changer le nom d'hôte et le mot de passe pour se connecter au conteneur de base de données.

Une fois lancé, la base nécessite d'être initialisée. L'opération peut prendre plusieurs minutes. Vous pouvez suivre l'avancement de l'ajout via :

PAClair

Afin de pouvoir réaliser à la demande et sans registre privé, l'analyse de conteneur, nous allons utiliser le programme paclair :

```bash pip3 install paclair ```

Il nécessite un fichier de configuration pour être utilisé, essayez :

```yml General: clair_url: 'http://localhost:6060' Plugins: Docker: class: paclair.plugins.docker_plugin.DockerPlugin ```

Pour obtenir un rapport d'analyse, on commence par envoyer les couches de l'image à Clair :

```bash paclair --conf conf.yml Docker nemunaire/fic-admin push ```

Puis on lui demande la génération d'un rapport html :

```bash paclair --conf conf.yml Docker nemunaire/fic-admin analyse --output-format html --output-report file ```

Si l'on souhaite uniquement avoir des statistiques dans la console :

```bash 42sh$ paclair --conf conf.yml Docker node:latest analyse --output-format stats Unknown: 2 Negligible: 1 Medium: 5 High: 4 ```

Exercice {-}

Déterminez le nombre de vulnérabilités dans les principales images officielles du Docker Hub, notamment nginx, golang, redis, ...