4.2 KiB
Palier 6 : Une vraie isolation (2 points)
En plus du chroot
, assignez de nouveaux namespaces au processus que vous
allez lancer : cgroups
, IPC
, mount
, net
, PID
, UTS
.
Il est requis que le nouveau processus ne puisse pas s'échapper de ses namespaces !
Astuce : unshare(2)
.
Palier bonus : Révolution des utilisateurs (2 points)
Utilisez le namespace user
pour vous permettre de ne plus avoir besoin de
lancer votre moulinette en tant que root
ou avec plus de capabilities que
nécessaire dans vos attributs étendus.
Vous aurez besoin de déplacer le code écrit pour les premiers paliers (cgroups, caps, ...), après vous être dissocié de cet espace de noms.
Palier 7 : Empêcher les fuites d'information (2 points)
Démontez tous les systèmes de fichiers qui ne sont pas nécessaires au fonctionnement de votre conteneur et remontez les partitions
N'oubliez pas de remonter les systèmes de fichiers pour lesquels cette opération est nécessaire afin de terminer l'étape d'isolation.
Astuce : mount(2)
.
Palier 7 bis : Volume attaché au code à moulinéter (1 point)
Ajoutez une option à votre moulinette afin de lier le dossier (qui se trouve
sur la machine hôte) contenant le code d'un étudiant, à l'intérieur du
conteneur. Cette option est similaire à l'option --volume
/-v
de Docker :
L'option devra attendre le répertoire contenant le code de l'étudiant, et le
monter dans /home/student
:
Astuce : mount(2)
, mkdir(2)
.
Palier 8 : Identification du conteneur (1 point)
Maintenant que vous avez votre conteneur, personalisez-le un peu en lui donnant un nom unique.
Astuce : sethostname(2)
Palier 9 : pivot_root
(3 points)
Effectuez un pivot_root(2)
de telle sorte qu'il ne reste plus de trace du
système de fichiers hôte.
Astuce : pivot_root(2)
, umount(2)
.
Attention : vos filtres seccomp
filtrant l'appel système pivot_root(2)
,
vous devrez donc ne les appliquer qu'après cette étape.
Palier 10 : Bac à sable connecté (2 points)
Partant d'une liste d'interfaces sur la machine hôte similaire à :
Vous devrez pouvoir ping
er votre conteneur depuis votre hôte :
Dans l'exemple ci-dessus, l'interface dans le conteneur a l'IP 10.10.10.42
,
tandis que la machine hôte a l'IP 10.10.10.41
.
Astuces : vous pouvez utiliser la libnetlink(3)
ou même faire des appels aux
programmes ip(8)
, brctl(8)
, ...