docker-internals: add part on CoreOS Clair
This commit is contained in:
parent
e1b1f8e1b3
commit
f89b5e88e6
4 changed files with 155 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
||||||
SOURCES = tutorial.md setup.md oci.md manifest.md runc.md linuxkit.md vxlan.md rendu.md
|
SOURCES = tutorial.md clair.md oci.md manifest.md runc.md linuxkit.md vxlan.md rendu.md
|
||||||
PANDOCOPTS = --latex-engine=xelatex \
|
PANDOCOPTS = --latex-engine=xelatex \
|
||||||
--standalone \
|
--standalone \
|
||||||
--normalize \
|
--normalize \
|
||||||
|
|
154
tutorial/docker-internals/clair.md
Normal file
154
tutorial/docker-internals/clair.md
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
Une vision plus Clair de la sécurité ?
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Nous avons vu, au travers de tous les précédents TP, 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Clair
|
||||||
|
|
||||||
|
Le principal outil pour indexer et chercher des vulnérabilités est
|
||||||
|
[`Clair`](https://github.com/coreos/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é.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
Commençons par lancer notre propre instance de `Clair`, à l'aide d'un
|
||||||
|
`docker-compose.yml` :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```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.6
|
||||||
|
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>
|
||||||
|
|
||||||
|
Vous trouverez un exemple de configuration dans le [dépôt du
|
||||||
|
projet](https://raw.githubusercontent.com/coreos/clair/master/config.yaml.sample). 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 :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```shell
|
||||||
|
curl http://localhost:6060/v1/namespaces
|
||||||
|
curl http://localhost:6060/v1/namespaces/debian:9/vulnerabilities?limit=10
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
## PAClair
|
||||||
|
|
||||||
|
Afin de pouvoir réaliser à la demande et sans registre privé, l'analyse de
|
||||||
|
conteneur, nous allons utiliser le programme
|
||||||
|
[`paclair`](https://github.com/yebinama/paclair) :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```shell
|
||||||
|
pip3 install paclair
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Il nécessite un fichier de configuration pour être utilisé, essayez :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```yml
|
||||||
|
General:
|
||||||
|
clair_url: 'http://localhost:6060'
|
||||||
|
Plugins:
|
||||||
|
Docker:
|
||||||
|
class: paclair.plugins.docker_plugin.DockerPlugin
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Pour obtenir un rapport d'analyse, on commence par envoyer les couches de
|
||||||
|
l'image à `Clair` :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```shell
|
||||||
|
paclair --conf conf.yml Docker nemunaire/fic-admin push
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Puis on lui demande la génération d'un rapport `html` :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```shell
|
||||||
|
paclair --conf conf.yml Docker nemunaire/fic-admin analyse --output-format html --output-report file
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Si l'on souhaite uniquement avoir des statistiques dans la console :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```shell
|
||||||
|
42sh$ paclair --conf conf.yml Docker node:latest analyse --output-format stats
|
||||||
|
Unknown: 2
|
||||||
|
Negligible: 1
|
||||||
|
Medium: 5
|
||||||
|
High: 4
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
## Exercice {.unnumbered}
|
||||||
|
|
||||||
|
Déterminez le nombre de vulnérabilités dans les principales images officielles
|
||||||
|
du [Docker Hub](https://hub.docker.com/explore), notamment `nginx`, `golang`,
|
||||||
|
`reddis`, ...
|
BIN
tutorial/docker-internals/hubvuln.png
Normal file
BIN
tutorial/docker-internals/hubvuln.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 53 KiB |
BIN
tutorial/docker-internals/paclair.png
Normal file
BIN
tutorial/docker-internals/paclair.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
Loading…
Add table
Add a link
Reference in a new issue