2016-10-03 10:27:18 +00:00
|
|
|
\newpage
|
|
|
|
|
|
|
|
Projet et rendu
|
|
|
|
===============
|
|
|
|
|
2016-10-06 01:58:52 +00:00
|
|
|
Les exercices de ce TP ne sont pas à rendre.
|
|
|
|
|
|
|
|
|
2016-10-03 10:27:18 +00:00
|
|
|
## Sujet
|
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
**Ce projet, étalé sur ce TP et le TP suivant, constitue le cœur de la notation
|
|
|
|
de ce cours.**
|
|
|
|
|
2016-10-03 10:27:18 +00:00
|
|
|
Vous allez commencer aujourd'hui un projet qui s'étendra au prochain TP et qui
|
|
|
|
consistera à réaliser la partie d'isolation de la moulinette des ACUs !
|
|
|
|
|
|
|
|
Cette semaine, il faudra faire en sorte de restreindre un groupe de processus
|
2016-10-05 09:13:56 +00:00
|
|
|
pour qu'il ne puisse pas faire de déni de service sur notre machine.
|
|
|
|
|
|
|
|
Il n'y a pas de restriction sur le langage utilisé, vous pouvez tout aussi bien
|
|
|
|
utiliser du C, du C++, du Python, etc.
|
|
|
|
|
|
|
|
L'usage de bibliothèques **non relatives** au projet est autorisé : le but de
|
|
|
|
ce sujet est d'évaluer votre compréhension et votre utilisation de la
|
|
|
|
tuyauterie bas-niveau du noyau liée à la virtualisation légère, à partir du
|
|
|
|
moment où vous n'utilisez pas une bibliothèque qui abstrait complètement cette
|
|
|
|
plomberie, n'hésitez pas à l'utiliser !
|
|
|
|
|
|
|
|
Gardez en tête que ce projet sera à continuer au prochain TP, où il sera
|
|
|
|
principalement question de faire des appels système.
|
|
|
|
|
|
|
|
|
|
|
|
### Stage 1 : Restreindre l'environnement
|
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
Après avoir mis en place les bases de votre programme, commencez par créer les
|
2016-10-06 01:58:52 +00:00
|
|
|
différentes hiérarchies (si vous avez un noyau récent, vous pouvez utiliser les
|
2016-10-05 20:49:08 +00:00
|
|
|
cgroups-v2) dont vous allez avoir besoin pour limiter l'utilisation de
|
|
|
|
ressources.
|
|
|
|
|
|
|
|
Puis, mettez en place ces limites :
|
|
|
|
|
|
|
|
* pas plus d'1 GB de mémoire utilisée ;
|
|
|
|
* 1 seul CPU au maximum ;
|
2016-10-06 01:58:52 +00:00
|
|
|
* 100 PIDs ;
|
2016-10-05 20:49:08 +00:00
|
|
|
* ...
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-06 01:58:52 +00:00
|
|
|
En bonus, vous pouvez gérer les cas où le noyau sur lequel s'exécute votre
|
|
|
|
moulinette ne possède pas tous ces *CGroup*s, au lieu de planter, ne rien faire
|
|
|
|
n'est pas forcément une mauvaise solution.
|
|
|
|
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
### Stage 2 : Réduire les *capabilities*
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
Réduisez au maximum les capabilities, de telle sorte qu'il ne soit pas possible
|
|
|
|
de faire un ping dans l'environnement restreint :
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
```shell
|
|
|
|
42sh# ping 8.8.8.8
|
|
|
|
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
|
|
|
|
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=3.93 ms
|
|
|
|
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=3.97 ms
|
|
|
|
^C
|
|
|
|
--- 8.8.8.8 ping statistics ---
|
|
|
|
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
|
|
|
|
rtt min/avg/max/mdev = 3.931/3.954/3.978/0.067 ms
|
|
|
|
|
|
|
|
42sh# ./mymoulette /bin/bash
|
|
|
|
bash# curl http://www.linuxcontainers.org/ | md5sum
|
|
|
|
59e714c4331e71ac3529a6502994ef1d
|
|
|
|
|
|
|
|
bash# ping 8.8.8.8
|
2016-10-06 01:58:52 +00:00
|
|
|
ping: icmp open socket: Permission denied
|
2016-10-05 20:49:08 +00:00
|
|
|
```
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
Astuces : `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ...
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-06 01:58:52 +00:00
|
|
|
Aidez-vous du visualisateur de *capabilities* de la partie 4, pour voir si vous
|
|
|
|
êtes sur la bonne voie.
|
|
|
|
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
### Stage 3 : Utilisable par un utilisateur
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
Jouez avec les attributs étendus pour qu'un utilisateur non-privilégié puisse
|
|
|
|
exécuter votre moulinette. Ajouter la/les commande(s) à votre Makefile ou
|
|
|
|
script d'installation.
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
### Création d'un environnement d'exécution minimal
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
Plutôt que d'utiliser votre système hôte au complet, avec tous ses programmes
|
|
|
|
et toutes ses bibliothèques, il faudrait utiliser un système contenant le
|
|
|
|
strict minimum. Recréez un environnement minimaliste, comme on a pu en voir
|
|
|
|
dans la partie sur les *chroot*.
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-06 01:58:52 +00:00
|
|
|
**Ne mettez pas cet environnement dans votre tarball de rendu, il vous
|
|
|
|
sera seulement utile pour faire des tests.**
|
2016-10-05 20:49:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
### Stage 4 : Isolation du pauvre
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
|
|
Nous n'avons pas encore vu de meilleure méthode pour mieux isoler
|
|
|
|
l'environnement que de faire un `chroot`, ajouter à votre programme cette
|
2016-10-06 01:58:52 +00:00
|
|
|
isolation rudimentaire. Et rendez-vous au prochain cours pour avoir une
|
|
|
|
meilleure d'isolation !
|
2016-10-05 20:49:08 +00:00
|
|
|
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
### Stage 5 (bonus) : automatisation de la création de l'environnement
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
Pour moulinéter plusieurs étudiants en parallèle, vous allez avoir besoin de
|
|
|
|
plusieurs environnements identiques. Plutôt que de recopier cet environnement,
|
|
|
|
de le nettoyer, de le recréer, pour chaque étudiant, ajoutez à votre moulinette
|
|
|
|
un support pour LVM : utiliser des *snapshots* pour figer votre environnement
|
|
|
|
et le dupliquer facilement pour chaque étudiant.
|
2016-10-05 09:13:56 +00:00
|
|
|
|
2016-10-05 20:49:08 +00:00
|
|
|
L'usage est laissé à votre discrétion : vous pouvez ajouter un/des paramètres à
|
|
|
|
votre moulette pour indiquer le volume LVM à utiliser ou le définir en dur ou
|
|
|
|
encore séparer la création de l'environnement et de la snapshot initiale dans
|
|
|
|
un programme distinct.
|
2016-10-03 10:27:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Modalité de rendu
|
|
|
|
|
|
|
|
Un service automatique s'occupe de réceptionner vos rendus, de faire les
|
|
|
|
vérifications nécessaires et de vous envoyer un accusé de réception (ou de
|
|
|
|
rejet).
|
|
|
|
|
|
|
|
Ce service écoute sur l'adresse <virli@nemunai.re>, c'est donc à cette adresse
|
|
|
|
et exclusivement à celle-ci que vous devez envoyer vos rendus. Tout rendu
|
|
|
|
envoyé à une autre adresse et/ou non signé et/ou reçu après la correction ne
|
|
|
|
sera pas pris en compte.
|
|
|
|
|
|
|
|
|
|
|
|
## Tarball
|
|
|
|
|
|
|
|
Tous les fichiers identifiés comme étant à rendre pour ce TP sont à
|
|
|
|
placer dans une tarball (pas d'archive ZIP, RAR, ...).
|
|
|
|
|
|
|
|
Les réponses aux questions sont à regrouper dans un fichier `questions.txt` à
|
|
|
|
placer à la racine de votre rendu.
|
|
|
|
|
2016-10-06 01:58:52 +00:00
|
|
|
Voici une arborescence type :
|
2016-10-03 10:27:18 +00:00
|
|
|
|
|
|
|
```
|
|
|
|
login_x-TP3/questions.txt
|
2016-10-05 20:49:08 +00:00
|
|
|
login_x-TP3/mymoulette/README
|
|
|
|
login_x-TP3/mymoulette/...
|
2016-10-03 10:27:18 +00:00
|
|
|
```
|