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
SOURCES_PART = subject.md project-part1.md project-tbc.md sample.md
SOURCES = subject.md project-part1.md project-part2.md sample.md rendu.md end.md
SOURCES_PART = subject.md project-part1.md project-part1.1.md project-tbc.md sample.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

View File

@ -1,14 +1,13 @@
## 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
programme afin de pouvoir créer un environnement neuf à chaque nouvelle
exécution.
Intégrer le script `registry_play` à votre programme afin de pouvoir créer un
environnement neuf à chaque nouvelle exécution.
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.
L'appel du programme se fera alors ainsi, avec l'otion `-I` pour préciser que
l'on s'attend à trouver le nom d'une image Docker :
L'appel du programme se fera alors ainsi, avec l'otion `-I <docker image>` pour
préciser que l'on s'attend à trouver le nom d'une image Docker :
<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
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
ressources.
Puis, mettez en place ces limites :
Puis, mettez en place ces limites :
* pas plus d'1 GB de mémoire utilisée ;
* 1 seul CPU au maximum ;
* 100 PIDs ;
* pas plus d'1 GB de mémoire utilisée ;
* 1 seul CPU au maximum ;
* 100 PIDs ;
* ...
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.
## 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
possible de faire un ping dans l'environnement restreint :
possible de faire un ping dans l'environnement restreint :
<div lang="en-US">
```
@ -42,15 +42,19 @@ rtt min/avg/max/mdev = 3.931/3.954/3.978/0.067 ms
```
</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
si vous êtes sur la bonne voie.
Aidez-vous du visualisateur de *capabilities* du TP (ou de `capsh(1)`, pour
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 à
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
`CAP_SYS_BOOT`) :
`CAP_SYS_BOOT`) :
<div lang="en-US">
```
@ -63,12 +67,14 @@ par exemple `arping` (qui nécessite `CAP_NET_RAW`) ou `halt` (qui nécessite
```
</div>
:::::
## Palier bonus : Utilisable par un utilisateur (2 points) {-}
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.
## Palier bonus : Utilisable par un utilisateur (2 points) {-}
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 {-}
@ -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
dans la partie sur les `chroot`.
**Ne mettez pas cet environnement dans votre tarball de rendu, il vous
sera seulement utile pour faire des tests.**
::::: {.warning}
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
l'environnement que de faire un `chroot`, ajoutez à votre programme cette
isolation rudimentaire. Et rendez-vous au prochain cours pour avoir une
meilleure isolation !
meilleure isolation !
<div lang="en-US">
```
@ -100,16 +110,16 @@ meilleure isolation !
</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
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)` ;
* `personality(2)` ;
* `pivot_root(2)` ;
* `nfsservctl(2)` ;
* `personality(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
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
*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
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.
## 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
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
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
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
monter dans `/home/student` :
monter dans `/home/student` :
<div lang="en-US">
```
@ -56,15 +56,15 @@ src/ tests/ AUTHORS configure Makefile.am README TODO
```
</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
un nom unique.
**Astuce\ :** `sethostname(2)`
**Astuce :** `sethostname(2)`
<div lang="en-US">
```
@ -77,20 +77,20 @@ shie6aif2aiH
</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
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.
## 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">
```
@ -102,7 +102,7 @@ Partant d'une liste d'interfaces sur la machine hôte similaire à :
```
</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">
```
@ -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`,
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)`,\ ...
**Astuces :** vous pouvez utiliser la `libnetlink(3)` ou même faire des appels
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.
@ -10,8 +10,8 @@ Le sujet sera mis à jour en conséquence.
Rendu
=====
Le rendu du projet final avec tous les paliers est attendu pour le samedi 13
novembre 2021 à 23:42.
Le rendu du projet final avec tous les paliers est attendu pour le samedi 3
décembre 2022 à 23:42.
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">
```
login_x-project2/
login_x-project2/README
login_x-project2/Makefile
login_x-project2/src/...
./
./README
./Makefile
./src/...
```
</div>

View File

@ -72,5 +72,9 @@ cap_user_data_t
effective: 0x0
permitted: 0x0
inheritable: 0x0
ambient:
bounding:
```
</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}
institute: EPITA
date: EPITA -- Promo 2022
date: EPITA -- Promo 2023
abstract: |
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
automatisé.
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
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.
\vspace{1em}
@ -19,19 +19,19 @@ abstract: |
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é :
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 !
pas à l'utiliser pour gagner du temps !
\vspace{1em}
Ce projet (qui sera complété au prochain cours) est à rendre à
<virli@nemunai.re> au plus tard le samedi 13 novembre 2021 à 23 h 42.
Ce projet (qui sera complété au prochain cours) sera à rendre au
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