Update subject/2 for 2023
This commit is contained in:
parent
6b6f37b4a3
commit
b99c32b547
@ -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
|
||||||
|
@ -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">
|
||||||
```
|
```
|
||||||
|
@ -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)`, ...
|
||||||
|
@ -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)`, ...
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -72,5 +72,9 @@ cap_user_data_t
|
|||||||
effective: 0x0
|
effective: 0x0
|
||||||
permitted: 0x0
|
permitted: 0x0
|
||||||
inheritable: 0x0
|
inheritable: 0x0
|
||||||
|
|
||||||
|
ambient:
|
||||||
|
|
||||||
|
bounding:
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user