Update subject/2 for 2023

This commit is contained in:
nemunaire 2022-10-18 17:59:01 +02:00
parent 6b6f37b4a3
commit b99c32b547
7 changed files with 83 additions and 70 deletions

View File

@ -1,7 +1,7 @@
include ../../tutorial/pandoc-opts.mk include ../../tutorial/pandoc-opts.mk
SOURCES_PART = subject.md project-part1.md project-tbc.md sample.md SOURCES_PART = subject.md project-part1.md project-part1.1.md project-tbc.md sample.md
SOURCES = subject.md project-part1.md project-part2.md sample.md rendu.md end.md SOURCES = subject.md project-part1.md project-part1.1.md project-part2.md sample.md rendu.md end.md
all: partial.pdf subject.pdf all: partial.pdf subject.pdf

View File

@ -1,14 +1,13 @@
## Palier 5 : Automatisation de la création de l'environnement (1 point) {-} ## Palier 5 : Automatisation de la création de l'environnement (1 point) {-}
Intégrer le script `registry_play.sh`, réalisé au TP précédent, à votre Intégrer le script `registry_play` à votre programme afin de pouvoir créer un
programme afin de pouvoir créer un environnement neuf à chaque nouvelle environnement neuf à chaque nouvelle exécution.
exécution.
Vous pouvez l'utiliser tel quel, ou le réécrire pour qu'il s'intègre plus Vous pouvez l'utiliser tel quel, ou le réécrire pour qu'il s'intègre plus
facilement au sein du langage que vous avez choisi. facilement au sein du langage que vous avez choisi.
L'appel du programme se fera alors ainsi, avec l'otion `-I` pour préciser que L'appel du programme se fera alors ainsi, avec l'otion `-I <docker image>` pour
l'on s'attend à trouver le nom d'une image Docker : préciser que l'on s'attend à trouver le nom d'une image Docker :
<div lang="en-US"> <div lang="en-US">
``` ```

View File

@ -1,15 +1,15 @@
## Palier 1 : Restreindre l'environnement (2 points) {-} ## Palier 1 : Restreindre l'environnement (2 points) {-}
Après avoir mis en place les bases de votre programme, commencez par créer les 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 utiliser les différentes hiérarchies (si vous avez un noyau récent, vous pouvez utiliser les
cgroups-v2) dont vous allez avoir besoin pour limiter l'utilisation de cgroups-v2) dont vous allez avoir besoin pour limiter l'utilisation de
ressources. ressources.
Puis, mettez en place ces limites : Puis, mettez en place ces limites :
* pas plus d'1 GB de mémoire utilisée ; * pas plus d'1 GB de mémoire utilisée ;
* 1 seul CPU au maximum ; * 1 seul CPU au maximum ;
* 100 PIDs ; * 100 PIDs ;
* ... * ...
En bonus, vous pouvez gérer les cas où le noyau sur lequel s'exécute votre En bonus, vous pouvez gérer les cas où le noyau sur lequel s'exécute votre
@ -17,10 +17,10 @@ moulinette ne possède pas tous ces *CGroup*s, au lieu de planter, ne rien faire
n'est pas forcément une mauvaise solution. n'est pas forcément une mauvaise solution.
## Palier 2 : Réduire les `capabilities` (2 points) {-} ## Palier 2 : Réduire les `capabilities` (2 points) {-}
Réduisez au maximum les *capabilities*, de telle sorte qu'il ne soit pas Réduisez au maximum les *capabilities*, de telle sorte qu'il ne soit pas
possible de faire un ping dans l'environnement restreint : possible de faire un ping dans l'environnement restreint :
<div lang="en-US"> <div lang="en-US">
``` ```
@ -42,15 +42,19 @@ rtt min/avg/max/mdev = 3.931/3.954/3.978/0.067 ms
``` ```
</div> </div>
**Astuces\ :** `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ... **Astuces :** `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, `libcap(3)`, ...
Aidez-vous du visualisateur de *capabilities* de la partie 1.3 du TP, pour voir Aidez-vous du visualisateur de *capabilities* du TP (ou de `capsh(1)`, pour
si vous êtes sur la bonne voie. voir si vous êtes sur la bonne voie.
::::: {.question}
#### Je peux toujours `ping` même sans *capabilities* ! {-}
Si votre distribution vous permet d'utiliser `ping` sans privilège, utilisez à Si votre distribution vous permet d'utiliser `ping` sans privilège, utilisez à
la place n'importe quel binaire ayant besoin de *capabilities* pour vos tests, la place n'importe quel binaire ayant besoin de *capabilities* pour vos tests,
par exemple `arping` (qui nécessite `CAP_NET_RAW`) ou `halt` (qui nécessite par exemple `arping` (qui nécessite `CAP_NET_RAW`) ou `halt` (qui nécessite
`CAP_SYS_BOOT`) : `CAP_SYS_BOOT`) :
<div lang="en-US"> <div lang="en-US">
``` ```
@ -63,12 +67,14 @@ par exemple `arping` (qui nécessite `CAP_NET_RAW`) ou `halt` (qui nécessite
``` ```
</div> </div>
:::::
## Palier bonus : Utilisable par un utilisateur (2 points) {-}
Jouez avec les attributs étendus pour qu'un utilisateur non-privilégié puisse ## Palier bonus : Utilisable par un utilisateur (2 points) {-}
exécuter votre moulinette. Ajoutez la/les commande(s) à votre `Makefile` ou
script d'installation. Si vous utilisez un langage compilé, jouez avec les attributs étendus pour
qu'un utilisateur non-privilégié puisse exécuter votre moulinette. Ajoutez
la/les commande(s) à votre `Makefile` ou script d'installation.
## Création d'un environnement d'exécution minimal {-} ## Création d'un environnement d'exécution minimal {-}
@ -78,16 +84,20 @@ 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 strict minimum. Recréez un environnement minimaliste, comme on a pu en voir
dans la partie sur les `chroot`. dans la partie sur les `chroot`.
**Ne mettez pas cet environnement dans votre tarball de rendu, il vous ::::: {.warning}
sera seulement utile pour faire des tests.**
Ne mettez pas cet environnement sur votre dépôt, il vous sera seulement utile
pour faire vos tests.
:::::
## Palier 3 : Isolation du pauvre (1 point) {-} ## Palier 3 : Isolation du pauvre (1 point) {-}
Nous n'avons pas encore vu de meilleure méthode pour mieux isoler Nous n'avons pas encore vu de meilleure méthode pour mieux isoler
l'environnement que de faire un `chroot`, ajoutez à votre programme cette l'environnement que de faire un `chroot`, ajoutez à votre programme cette
isolation rudimentaire. Et rendez-vous au prochain cours pour avoir une isolation rudimentaire. Et rendez-vous au prochain cours pour avoir une
meilleure isolation ! meilleure isolation !
<div lang="en-US"> <div lang="en-US">
``` ```
@ -100,16 +110,16 @@ meilleure isolation !
</div> </div>
## Palier 4 : seccomp (2 points) {-} ## Palier 4 : seccomp (2 points) {-}
Filtrez les appels système de telle sorte qu'aucun programme exécuté dans Filtrez les appels système de telle sorte qu'aucun programme exécuté dans
votre bac à sable ne puisse plus lancer les appels système suivants : votre bac à sable ne puisse plus lancer les appels système suivants :
* `nfsservctl(2)` ; * `nfsservctl(2)` ;
* `personality(2)` ; * `personality(2)` ;
* `pivot_root(2)` ; * `pivot_root(2)` ;
* ... * ...
N'hésitez pas à en utiliser d'autres pour vos tests ;) N'hésitez pas à en utiliser d'autres pour vos tests ;)
**Astuces\ :** `seccomp(2)`, `seccomp_init(3)`, `seccomp_load(3)`, ... **Astuces :** `seccomp(2)`, `seccomp_init(3)`, `seccomp_load(3)`, ...

View File

@ -1,15 +1,15 @@
## Palier 5 : Une vraie isolation (2 points) {-} ## Palier 6 : Une vraie isolation (2 points) {-}
En plus du `chroot`, assignez de nouveaux *namespaces* au processus que vous En plus du `chroot`, assignez de nouveaux *namespaces* au processus que vous
allez lancer : `cgroups`, `IPC`, `mount`, `net`, `PID`, `UTS`. allez lancer : `cgroups`, `IPC`, `mount`, `net`, `PID`, `UTS`.
Il est requis que le nouveau processus ne puisse pas s'échapper de ses Il est requis que le nouveau processus ne puisse pas s'échapper de ses
*namespaces* ! *namespaces* !
**Astuce\ :** `unshare(2)`. **Astuce :** `unshare(2)`.
## Palier bonus : Révolution des utilisateurs (2 points) {-} ## Palier bonus : Révolution des utilisateurs (2 points) {-}
Utilisez le *namespace* `user` pour vous permettre de ne plus avoir besoin de 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 lancer votre moulinette en tant que `root` ou avec plus de *capabilities* que
@ -19,7 +19,7 @@ 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. caps, ...), après vous être dissocié de cet espace de noms.
## Palier 6 : Empêcher les fuites d'information (2 points) {-} ## 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 Démontez tous les systèmes de fichiers qui ne sont pas nécessaires au
fonctionnement de votre conteneur et remontez les partitions fonctionnement de votre conteneur et remontez les partitions
@ -27,17 +27,17 @@ fonctionnement de votre conteneur et remontez les partitions
N'oubliez pas de remonter les systèmes de fichiers pour lesquels cette 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. opération est nécessaire afin de terminer l'étape d'isolation.
**Astuce\ :** `mount(2)`. **Astuce :** `mount(2)`.
## Palier 6 bis : Volume attaché au code à moulinéter (1 point) {-} ## Palier 7 bis : Volume attaché au code à moulinéter (1 point) {-}
Ajoutez une option à votre moulinette afin de lier le dossier (qui se trouve 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 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\ : 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 L'option devra attendre le répertoire contenant le code de l'étudiant, et le
monter dans `/home/student` : monter dans `/home/student` :
<div lang="en-US"> <div lang="en-US">
``` ```
@ -56,15 +56,15 @@ src/ tests/ AUTHORS configure Makefile.am README TODO
``` ```
</div> </div>
**Astuce\ :** `mount(2)`, `mkdir(2)`. **Astuce :** `mount(2)`, `mkdir(2)`.
## Palier 7 : Identification du conteneur (1 point) {-} ## Palier 8 : Identification du conteneur (1 point) {-}
Maintenant que vous avez votre conteneur, personalisez-le un peu en lui donnant Maintenant que vous avez votre conteneur, personalisez-le un peu en lui donnant
un nom unique. un nom unique.
**Astuce\ :** `sethostname(2)` **Astuce :** `sethostname(2)`
<div lang="en-US"> <div lang="en-US">
``` ```
@ -77,20 +77,20 @@ shie6aif2aiH
</div> </div>
## Palier 8 : `pivot_root` (3 points) {-} ## Palier 9 : `pivot_root` (2 points) {-}
Effectuez un `pivot_root(2)` de telle sorte qu'il ne reste plus de trace du Effectuez un `pivot_root(2)` de telle sorte qu'il ne reste plus de trace du
système de fichiers hôte. système de fichiers hôte.
**Astuce\ :** `pivot_root(2)`, `umount(2)`. **Astuce :** `pivot_root(2)`, `umount(2)`.
**Attention\ :** vos filtres `seccomp` filtrant l'appel système **Attention :** vos filtres `seccomp` filtrant l'appel système
`pivot_root(2)`, vous devrez donc ne les appliquer qu'après cette étape. `pivot_root(2)`, vous devrez donc ne les appliquer qu'après cette étape.
## Palier 9 : Bac à sable connecté (3 points) {-} ## Palier 10 : Bac à sable connecté (3 points) {-}
Partant d'une liste d'interfaces sur la machine hôte similaire à : Partant d'une liste d'interfaces sur la machine hôte similaire à :
<div lang="en-US"> <div lang="en-US">
``` ```
@ -102,7 +102,7 @@ Partant d'une liste d'interfaces sur la machine hôte similaire à :
``` ```
</div> </div>
Vous devrez pouvoir `ping`er votre conteneur depuis votre hôte : Vous devrez pouvoir `ping`er votre conteneur depuis votre hôte :
<div lang="en-US"> <div lang="en-US">
``` ```
@ -129,5 +129,5 @@ rtt min/avg/max/mdev = 3.789/3.847/3.906/0.085 ms
Dans l'exemple ci-dessus, l'interface dans le conteneur a l'IP `10.10.10.42`, 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`. 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 **Astuces :** vous pouvez utiliser la `libnetlink(3)` ou même faire des appels
aux programmes `ip(8)`, `brctl(8)`,\ ... aux programmes `ip(8)`, `brctl(8)`, ...

View File

@ -1,4 +1,4 @@
## Palier 5 à 10 : *To be continued* {-} ## Palier 6 à 10 : *To be continued* {-}
Nous verrons ensemble de meilleures techniques d'isolation au prochain cours. Nous verrons ensemble de meilleures techniques d'isolation au prochain cours.
@ -10,8 +10,8 @@ Le sujet sera mis à jour en conséquence.
Rendu Rendu
===== =====
Le rendu du projet final avec tous les paliers est attendu pour le samedi 13 Le rendu du projet final avec tous les paliers est attendu pour le samedi 3
novembre 2021 à 23:42. décembre 2022 à 23:42.
Il n'est pas attendu de rendu intermédiaire pour cette première partie seule. Il n'est pas attendu de rendu intermédiaire pour cette première partie seule.
@ -24,10 +24,10 @@ cela dépendra de votre avancée dans le projet) :
<div lang="en-US"> <div lang="en-US">
``` ```
login_x-project2/ ./
login_x-project2/README ./README
login_x-project2/Makefile ./Makefile
login_x-project2/src/... ./src/...
``` ```
</div> </div>

View File

@ -72,5 +72,9 @@ cap_user_data_t
effective: 0x0 effective: 0x0
permitted: 0x0 permitted: 0x0
inheritable: 0x0 inheritable: 0x0
ambient:
bounding:
``` ```
</div> </div>

View File

@ -1,17 +1,17 @@
--- ---
title: Virtualisation légère -- Projet n^o^ 2 title: Virtualisation légère -- Projet n^o^ 3
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps} author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: EPITA -- Promo 2022 date: EPITA -- Promo 2023
abstract: | abstract: |
Le laboratoire des assistants a besoin de votre expertise afin de Le laboratoire des assistants a besoin de votre expertise afin de
renforcer la sécurité et la réactivité de son système de correction renforcer la sécurité et la réactivité de son système de correction
automatisé. automatisé.
Votre mission consistera à réaliser la partie d'isolation de la Votre mission consistera à réaliser la partie d'isolation de la
moulinette des ACUs : dans un premier temps vous ferez en sorte de moulinette des ACUs : dans un premier temps vous ferez en sorte de
restreindre un groupe de processus pour qu'il ne puisse pas faire de restreindre un groupe de processus pour qu'il ne puisse pas faire de
déni de service sur notre machine ; puis dans une seconde partie, déni de service sur notre machine ; puis dans une seconde partie,
vous vous assurerez de l'isolation de chaque étudiant. vous vous assurerez de l'isolation de chaque étudiant.
\vspace{1em} \vspace{1em}
@ -19,19 +19,19 @@ abstract: |
Il n'y a pas de restriction sur le langage utilisé, vous pouvez tout Il n'y a pas de restriction sur le langage utilisé, vous pouvez tout
aussi bien utiliser du C, du C++, du Python, etc. aussi bien utiliser du C, du C++, du Python, etc.
L'usage de bibliothèques **non relatives** au projet est autorisé : L'usage de bibliothèques **non relatives** au projet est autorisé :
le but de ce sujet est d'évaluer votre compréhension et votre le but de ce sujet est d'évaluer votre compréhension et votre
utilisation de la tuyauterie bas-niveau du noyau liée à la utilisation de la tuyauterie bas-niveau du noyau liée à la
virtualisation légère. À partir du moment où vous n'utilisez pas une virtualisation légère. À partir du moment où vous n'utilisez pas une
bibliothèque qui abstrait complètement cette plomberie, n'hésitez bibliothèque qui abstrait complètement cette plomberie, n'hésitez
pas à l'utiliser ! pas à l'utiliser pour gagner du temps !
\vspace{1em} \vspace{1em}
Ce projet (qui sera complété au prochain cours) est à rendre à Ce projet (qui sera complété au prochain cours) sera à rendre au
<virli@nemunai.re> au plus tard le samedi 13 novembre 2021 à 23 h 42. plus tard le samedi 3 décembre 2022 à 23 h 42.
Ce projet est **obligatoire pour tous les GISTRE**, et optionnel pour les SRS. Ce projet est **obligatoire pour les GISTRE**, et optionnel pour les SRS.
... ...
\newpage \newpage