30 Septembre 2016

Documents interessants

La compilation avec Docker - pour que les différentes personnes qui vont devoir compiler notre code n’aient pas à gérer les dépendances

Rapport sur la sécurité des containers - très complet rapport édité par NCC Group une société de consultants en sécurité, performances et tests de logiciels. Ce rapport semble donc indépendant de Docker Inc.

Analyse de la sécurité de Docker

Whitepaper officiel sur la sécurité

Sécurité de base

  • Les applications sont isolées entre elles et isolées de l’hôte
  • Réduction de la surface d’attaque car l’accès direct aux containers est limité à l’hôte
  • Chaque container à accès à son propre système de fichier isolé du reste du système
  • Utilisation des Linux namespaces et cgroups

Les namespaces et cgroups :

Voici le fonctionnement de ces deux mécanismes inclus dans n’importe quel noyau Linux récent

Namespaces

Introduction aux namespaces

Il existes plusieurs fonctionalités aux namespaces comme on peut le voir dans le manuel :

   Namespace   Constant        Isolates
   IPC         CLONE_NEWIPC    System V IPC, POSIX message queues
   Network     CLONE_NEWNET    Network devices, stacks, ports, etc.
   Mount       CLONE_NEWNS     Mount points
   PID         CLONE_NEWPID    Process IDs
   User        CLONE_NEWUSER   User and group IDs
   UTS         CLONE_NEWUTS    Hostname and NIS domain name

Système de fichier

D’après la page de manuel (man namespaces) on peut apprendre qu’ils permettent d’isoler des applications au niveau des resources. Un exemple simple d’utilisation des namespace est la commande chroot : une fois exécutée le shell est lancé dans un namespace et de son point de vue le dossier du système de fichier que l’on à chrooté devient la racine.

Illustration chroot

Illustration chroot

Imaginons maintenant qu’un attaquant parvient à compromettre une application isolée dans un namespace, il lui est impossible de remonter à la machine hôte ou de compromettre d’autres services se trouvants dans d’autre namespaces.

Un autre cas d’utilisation possible des namespaces est de lancer des programmes inconnus sur sa machine tout en l’isolant du reste de la machine.

Processus

La gestion des processus se fait aussi très simplement :

Normalement quand un système démare un processus est lancé avec le PID 1 il peut ensuite exécuter différents programmes qui eux mêmes peuvent en exécuter d’autres. Ce qu’il se passe avec les namespace est que du point de vue de l’hote le processus sera bien le fils d’un autre processus (par exemple avec le PID 42) mais du point de vue de l’application son PID est le 1. Ceci évite ainsi que les application isolées puissent savoir quels autres processus sont exécutés sur l’hôte .

Illustration PID namespaces

Illustration PID namespaces

Cette fonctionalité est disponible depuis la version 2.6.24 du noyau

Réseau

Si un processus est lancé dans ce namespace il verra un ensemble de cartes réseaux complètements différentes de l’hôte et propre au namespace que l’on crée. Le problème est qu’il va falloir paramètrer à la main des interfaces virtuelles ainsi qu’un système de routage qui vont permettre au processus contenu dans le namespace de communiquer avec l’exterieur ou avec d’autre namespaces.

Les points de montage

Normalement Linux possède une structure de donnée contenant tous les points de montages, les disque associés, les paramètres. Il est ainsi possible de cloner cette structure dans un namespace permettant ainsi au processus contenu dedans de modifier les points de montages sans affecter la machine hôte. Ce namespace bien qu’isolant l’application des points de montage permet tout de même de voir les points de montages originaux, il est ainsi possible d’utiliser un premier processus qui va “nettoyer” les points de montages avant de démarer le processus cible.

Cgroups

Guide d’introduction aux cgroup par RedHat

Les Cgroups permettent d’allouer des ressources (mémoire, temps processeur, bande passante) à des processus.

Spécificités de Docker

Docker utilise encore différents moyens pour sécuriser les containers.

Restrictions des processus

Docker limite par défaut les fonctionalités disponible aux containers (man capabilities) pour éviter qu’un container compromis ne puisse faire des dégats sur le système hôte

Recommandations

  • Executer un kernel Linux avec les patchs GRSEC et PAX (ces patchs bien que open-source ne sont proposés qu’en version testing, les version stables étant réservées aux sponsors)
  • Installer Docker dans des machines virtuelles peut aider dans certains cas particuliers (par exemple si on à deux applications qui doivent être complètements isolées il vaut mieux les séparer dans des VM)

Conclusion

Tableau récapitulatif

Tableau récapitulatif

A faire

  • Tester Jupiter