virli/tutorial/3/project.md

143 lines
4.7 KiB
Markdown
Raw Normal View History

2016-10-03 10:27:18 +00:00
\newpage
Projet et rendu
===============
## 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
différentes hiérarchies (si vous avez un noyau récent, vous pouvez les
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-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
Operation not permitted
```
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-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-05 20:49:08 +00:00
**Ne rendez pas cet environnement, il vous sera seulement utile pour faire des
tests.**
### 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-05 20:49:08 +00:00
isolation rudimentaire. Et rendez-vous au prochain cours pour avoir de
moyen d'isolation !
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.
Voici une arborescence type:
```
login_x-TP3/questions.txt
2016-10-05 20:49:08 +00:00
login_x-TP3/chroot/escape.c
login_x-TP3/pseudofs/rev_kdb_leds.sh
login_x-TP3/pseudofs/procinfo
login_x-TP3/caps/view_caps
login_x-TP3/cgroups/monitor
login_x-TP3/cgroups/monitor_init
login_x-TP3/mymoulette/README
login_x-TP3/mymoulette/...
2016-10-03 10:27:18 +00:00
```