Le noyau Linux permet de segmenter les privilèges de l’utilisateur root en unités distinctes appelées capabilities. Par exemple, la capability `CAP_CHOWN` permet à un utilisateur d’apporter des modifications aux UID et aux GID des fichiers. Si je veux supprimer cette possibilité, j'utiliserai le couple paramètre/valeur suivant à l'appel de la commande `run` pour Docker en CLI : `--cap-drop=chown`.
Par défaut, Docker supprime toutes ces capabilities, à l’exception de celles qui lui sont nécessaires. Comment obtenir la liste des capabilities de votre container ??? Il suffit d’utiliser `getpcaps`. Ajoutons le à l'image créé dans l'exercice sur la directive USER. Ci-après le `Dockerfile` modifié :
```bash
FROM alpine:latest
RUN mkdir /app &&\
addgroup nemart &&\
adduser -D-H-s /bin/false -G nemart jean &&\
apk --no-cache add libcap
WORKDIR /app
COPY . /app
RUN chown-R jean:nemart /app
USER jean
CMD getpcaps 1
```
Vérifiez, en lançant le conteneur, que les droits sont bien retirés. Faites un test au sein de votre conteneur.
### Avec `seccomp`
Seccomp est une fonctionnalité du noyau Linux qui permet de filtrer les appels systèmes d’un processus. Pour cela il faut, bien sûr, que le noyau de votre serveur Linux ait été construit avec cette fonctionnalité activée. Pour contrôler cela sur un hôte Linux (à adapter pour Windows) :
```bash
grep SECCOMP= /boot/config-$(uname-r)
CONFIG_SECCOMP=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
```
Docker utilise par défaut `seccomp`. Il est assez facile de vérifier cela :
```bash
docker run --rm-it exercice-user:latest sh
grep Seccomp /proc/$$/status
Seccomp: 2
```
Récupérons maintenant le profil utilisé par défaut pour Docker (le permalien : [https://gitlab.univ-lille.fr/formation-docker-cnrs/session-experimente/-/blob/7c86784ba6aa7b7860e3b777fba3481453c87908/docker-security/default.json](https://gitlab.univ-lille.fr/formation-docker-cnrs/session-experimente/-/blob/7c86784ba6aa7b7860e3b777fba3481453c87908/docker-security/default.json)) Il est disponible dans le dépôt GitLab. Nous allons le renommer pour l'appeler `mon-profil.json` et le modifier pour désactiver l'opération de `chmod`.
Nous changerons la valeur de la clef `defaultAction` pour la passer à `SCMP_ACT_ALLOW`. Puis, dans la branche `syscalls`, nous changerons la valeur de la clef `action` correspondant au nom `chmod`. La clef `action` recevra la nouvelle valeur `SCMP_ACT_ERRNO`.
Une fois ces modifications apportées, lançons le conteneur créé dans l'exercice sur la directive USER en utilisant le profil modifié. Exemple pour moi :
```bash
docker run --rm-it--security-opt seccomp:mon-profil.json exercice-user:latest sh
```
Essayez de faire un `chmod`. Qu'observez-vous ?
## Utilisation d'un scanner de vulnérabilités
Récupérez l'image de Trivy depuis le DockerHub (`aquasec/trivy`). Créez un répertoire local qui va recevoir la base de données des vulnérabilités de l'outil et montez celui-ci dans le répertoire `/root/.cache` d'un conteneur que vous appelerez `scanner`.
Effectuez maintenant un scan de toutes vulnérabilités de l'image `mysql:8.0` depuis le DockerHub (servez-vous de la slide qui présente des exemples d'utilisations de l'outil). Qu'observez-vous ? Faites à nouveau le test avec l'image `mysql:latest`. Quelle est votre conclusion ?