subject: follow tuto, theme + pandoc 2
This commit is contained in:
parent
0e98f229b8
commit
6eeec595f2
|
@ -1,15 +1,6 @@
|
||||||
|
include ../../tutorial/pandoc-opts.mk
|
||||||
|
|
||||||
SOURCES = subject.md project.md rendu.md end.md
|
SOURCES = subject.md project.md rendu.md end.md
|
||||||
PANDOCOPTS = --latex-engine=xelatex \
|
|
||||||
--standalone \
|
|
||||||
--normalize \
|
|
||||||
--smart \
|
|
||||||
-M lang=fr-FR \
|
|
||||||
-M fontsize=12pt \
|
|
||||||
-M papersize=a4paper \
|
|
||||||
-M mainfont="Linux Libertine O" \
|
|
||||||
-M monofont="Inconsolata" \
|
|
||||||
-M sansfont="Linux Biolinum O" \
|
|
||||||
--include-in-header=../../tutorial/header.tex
|
|
||||||
|
|
||||||
|
|
||||||
all: subject.pdf
|
all: subject.pdf
|
||||||
|
|
|
@ -92,7 +92,7 @@ Voici les notes retrouvées dans les derniers échanges avec le sous-traitant :
|
||||||
![Vue d'ensemble des échanges de données entre les services](FIC-overview.png)
|
![Vue d'ensemble des échanges de données entre les services](FIC-overview.png)
|
||||||
|
|
||||||
|
|
||||||
### Palier 0 : Récupérer les images
|
### Palier 0 : Récupérer les images {-}
|
||||||
|
|
||||||
Le sous-traitant a laissé des images Docker sur le Docker Store, vous pourrez
|
Le sous-traitant a laissé des images Docker sur le Docker Store, vous pourrez
|
||||||
vous baser dessus pour commencer.
|
vous baser dessus pour commencer.
|
||||||
|
@ -114,12 +114,14 @@ Durant la durée du projet, les images seront peut-être amenées à être mises
|
||||||
jour, si vous vous trouvez bloqué, commencez par vérifier que vous avez bien la
|
jour, si vous vous trouvez bloqué, commencez par vérifier que vous avez bien la
|
||||||
dernière version disponible de l'image :
|
dernière version disponible de l'image :
|
||||||
|
|
||||||
```shell
|
<div lang="en-US">
|
||||||
docker pull nemunaire/fic-admin nemunaire/fic-backend nemunaire/fic-frontend
|
```bash
|
||||||
|
docker pull nemunaire/fic-admin nemunaire/fic-backend nemunaire/fic-frontend
|
||||||
```
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Palier 1 : `docker-compose.yml`
|
### Palier 1 : `docker-compose.yml` {-}
|
||||||
|
|
||||||
Maintenant que vous arrivez à lancer les images, rendez cela reproductible en
|
Maintenant que vous arrivez à lancer les images, rendez cela reproductible en
|
||||||
inscrivant tout ça dans un fichier YAML, compréhensible par `docker-compose` !
|
inscrivant tout ça dans un fichier YAML, compréhensible par `docker-compose` !
|
||||||
|
@ -133,7 +135,7 @@ Vous devriez avoir ces services :
|
||||||
* `nginx` (ou `apache`, ...).
|
* `nginx` (ou `apache`, ...).
|
||||||
|
|
||||||
|
|
||||||
### Palier 2 : retrouver les `Dockerfile`
|
### Palier 2 : retrouver les `Dockerfile` {-}
|
||||||
|
|
||||||
Maintenant que vous êtes en mesure de lancer le service, il serait temps de ne
|
Maintenant que vous êtes en mesure de lancer le service, il serait temps de ne
|
||||||
plus dépendre d'une image que l'on ne peut plus modifier facilement.
|
plus dépendre d'une image que l'on ne peut plus modifier facilement.
|
||||||
|
@ -149,7 +151,7 @@ Arriverez-vous à générer des images plus propres que celles du prestataire
|
||||||
disparu ?!
|
disparu ?!
|
||||||
|
|
||||||
|
|
||||||
#### Astuces
|
#### Astuces {-}
|
||||||
|
|
||||||
Les différents projets sont organisés au sein d'un
|
Les différents projets sont organisés au sein d'un
|
||||||
[dépôt monolithique](https://danluu.com/monorepo/). Les projets ont des
|
[dépôt monolithique](https://danluu.com/monorepo/). Les projets ont des
|
||||||
|
@ -157,9 +159,11 @@ dépendances entre les dossiers qui se trouvent à la racine (qui sont
|
||||||
l'équivalent de bibliothèques). Vous allez sans doute vouloir placer les trois
|
l'équivalent de bibliothèques). Vous allez sans doute vouloir placer les trois
|
||||||
`Dockerfile` à la racine pour simplifier les étapes de construction des images :
|
`Dockerfile` à la racine pour simplifier les étapes de construction des images :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
```shell
|
```shell
|
||||||
docker image build --file Dockerfile-admin .
|
docker image build --file Dockerfile-admin .
|
||||||
```
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
Les
|
Les
|
||||||
[*multi-stage builds*](https://docs.docker.com/engine/userguide/eng-image/multistage-build/)
|
[*multi-stage builds*](https://docs.docker.com/engine/userguide/eng-image/multistage-build/)
|
||||||
|
@ -171,14 +175,14 @@ supporte cette syntaxe, vous pouvez ajouter des scripts et autant de
|
||||||
l'option de mettre à jour votre Docker !).
|
l'option de mettre à jour votre Docker !).
|
||||||
|
|
||||||
|
|
||||||
### Palier 3 : `fic-server.yml` prêt pour le déploiement
|
### Palier 3 : `fic-server.yml` prêt pour le déploiement {-}
|
||||||
|
|
||||||
À présent, faites les éventuelles adaptations nécessaires pour que votre
|
À présent, faites les éventuelles adaptations nécessaires pour que votre
|
||||||
fichier `docker-compose.yml` puisse s'exécuter au sein d'un cluster de
|
fichier `docker-compose.yml` puisse s'exécuter au sein d'un cluster de
|
||||||
plusieurs machines. Via `docker stack deploy`.
|
plusieurs machines. Via `docker stack deploy`.
|
||||||
|
|
||||||
|
|
||||||
### Palier 4 : `fic-server.yml` prêt pour la production
|
### Palier 4 : `fic-server.yml` prêt pour la production {-}
|
||||||
|
|
||||||
Comme indiqué dans les notes du prestataire, en production, le frontend se
|
Comme indiqué dans les notes du prestataire, en production, le frontend se
|
||||||
trouve sur une machine distincte du backend.
|
trouve sur une machine distincte du backend.
|
||||||
|
@ -188,7 +192,7 @@ données ! Il est fort probable que vous ayez à ajouter des services à votre
|
||||||
fichier YAML.
|
fichier YAML.
|
||||||
|
|
||||||
|
|
||||||
### Palier 5 (bonus) : `fic-server.yml` sécurisé
|
### Palier 5 (bonus) : `fic-server.yml` sécurisé {-}
|
||||||
|
|
||||||
Vous avez indiqués des mots de passes bidons dans votre YAML ? Rangez les
|
Vous avez indiqués des mots de passes bidons dans votre YAML ? Rangez les
|
||||||
informations sensibles au sein de
|
informations sensibles au sein de
|
||||||
|
|
|
@ -3,18 +3,21 @@ title: Virtualisation légère -- Projet n^o^ 1
|
||||||
author: Pierre-Olivier *nemunaire* Mercier
|
author: Pierre-Olivier *nemunaire* Mercier
|
||||||
institute: EPITA
|
institute: EPITA
|
||||||
date: EPITA -- SRS 2018
|
date: EPITA -- SRS 2018
|
||||||
|
abstract: |
|
||||||
|
M. Dessi, votre DSI, vient vous voir, paniqué : une grande
|
||||||
|
conférence se tient dans deux semaines, l'entreprise avait été
|
||||||
|
mandatée de longue date pour réaliser une interface d'animation pour
|
||||||
|
un des événements majeurs et cela fait un mois maintenant qu'il est
|
||||||
|
sans nouvelle du sous-traitant à qui cette tâche avait été
|
||||||
|
confiée. On ne peut pas attendre davantage, vous êtes dépêché pour
|
||||||
|
terminer le projet qui a été laissé en plan par le sous-traitant.
|
||||||
|
|
||||||
|
\vspace{1em}
|
||||||
|
|
||||||
|
Ce projet est à rendre à <virli@nemunai.re> au plus tard le jeudi 9
|
||||||
|
novembre 2017 à 8 h 42.
|
||||||
...
|
...
|
||||||
|
|
||||||
M. Dessi, votre DSI, vient vous voir, paniqué : une grande conférence se tient
|
/newpage
|
||||||
dans deux semaines, l'entreprise avait été mandatée de longue date pour
|
|
||||||
réaliser une interface d'animation pour un des événements majeurs et cela fait
|
|
||||||
un mois maintenant qu'il est sans nouvelle du sous-traitant à qui cette tâche
|
|
||||||
avait été confiée. On ne peut pas attendre davantage, vous êtes dépêché pour
|
|
||||||
terminer le projet qui a été laissé en plan par le sous-traitant.
|
|
||||||
|
|
||||||
\vspace{1em}
|
# Paliers
|
||||||
|
|
||||||
Ce projet est à rendre à <virli@nemunai.re> au plus tard le jeudi 9 novembre
|
|
||||||
2017 à 8 h 42.
|
|
||||||
|
|
||||||
\tableofcontents
|
|
||||||
|
|
|
@ -1,15 +1,6 @@
|
||||||
|
include ../../tutorial/pandoc-opts.mk
|
||||||
|
|
||||||
SOURCES = subject.md project-part1.md project-part2.md sample.md rendu.md end.md
|
SOURCES = subject.md project-part1.md project-part2.md sample.md rendu.md end.md
|
||||||
PANDOCOPTS = --latex-engine=xelatex \
|
|
||||||
--standalone \
|
|
||||||
--normalize \
|
|
||||||
--smart \
|
|
||||||
-M lang=fr-FR \
|
|
||||||
-M fontsize=12pt \
|
|
||||||
-M papersize=a4paper \
|
|
||||||
-M mainfont="Linux Libertine O" \
|
|
||||||
-M monofont="FantasqueSansMono-Regular" \
|
|
||||||
-M sansfont="Linux Biolinum O" \
|
|
||||||
--include-in-header=../../tutorial/header.tex
|
|
||||||
|
|
||||||
|
|
||||||
all: subject.pdf
|
all: subject.pdf
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
## Palier 1 : Restreindre l'environnement (2 points) {.unnumbered}
|
## 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
|
||||||
|
@ -17,56 +17,56 @@ 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) {.unnumbered}
|
## 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">
|
||||||
```shell
|
```
|
||||||
42sh# ping 9.9.9.9
|
42sh# ping 9.9.9.9
|
||||||
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.
|
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.
|
||||||
64 bytes from 9.9.9.9: icmp_seq=1 ttl=56 time=3.93 ms
|
64 bytes from 9.9.9.9: icmp_seq=1 ttl=56 time=3.93 ms
|
||||||
64 bytes from 9.9.9.9: icmp_seq=2 ttl=56 time=3.97 ms
|
64 bytes from 9.9.9.9: icmp_seq=2 ttl=56 time=3.97 ms
|
||||||
^C
|
^C
|
||||||
--- 9.9.9.9 ping statistics ---
|
--- 9.9.9.9 ping statistics ---
|
||||||
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
|
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
|
||||||
rtt min/avg/max/mdev = 3.931/3.954/3.978/0.067 ms
|
rtt min/avg/max/mdev = 3.931/3.954/3.978/0.067 ms
|
||||||
|
|
||||||
42sh# ./mymoulette /bin/bash
|
42sh# ./mymoulette /bin/bash
|
||||||
bash# curl http://www.linuxcontainers.org/ | md5sum
|
bash# curl http://www.linuxcontainers.org/ | md5sum
|
||||||
c7d68d1cb4737125a84cd69f55add202
|
c7d68d1cb4737125a84cd69f55add202
|
||||||
|
|
||||||
bash# ping 9.9.9.9
|
bash# ping 9.9.9.9
|
||||||
ping: icmp open socket: Permission denied
|
ping: icmp open socket: Permission denied
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Astuces : `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ...
|
**Astuces\ :** `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ...
|
||||||
|
|
||||||
Aidez-vous du visualisateur de *capabilities* de la partie 4, pour voir si vous
|
Aidez-vous du visualisateur de *capabilities* de la partie 4 du TP, pour voir
|
||||||
êtes sur la bonne voie.
|
si vous êtes sur la bonne voie.
|
||||||
|
|
||||||
|
|
||||||
## Palier 3 : Utilisable par un utilisateur (1 point) {.unnumbered}
|
## Palier 3 : Utilisable par un utilisateur (1 point) {-}
|
||||||
|
|
||||||
Jouez avec les attributs étendus pour qu'un utilisateur non-privilégié puisse
|
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
|
exécuter votre moulinette. Ajoutez la/les commande(s) à votre Makefile ou
|
||||||
script d'installation.
|
script d'installation.
|
||||||
|
|
||||||
|
|
||||||
## Création d'un environnement d'exécution minimal {.unnumbered}
|
## Création d'un environnement d'exécution minimal {-}
|
||||||
|
|
||||||
Plutôt que d'utiliser votre système hôte au complet, avec tous ses programmes
|
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
|
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
|
**Ne mettez pas cet environnement dans votre tarball de rendu, il vous
|
||||||
sera seulement utile pour faire des tests.**
|
sera seulement utile pour faire des tests.**
|
||||||
|
|
||||||
|
|
||||||
## Palier 4 : Isolation du pauvre (1 point) {.unnumbered}
|
## Palier 4 : 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
|
||||||
|
@ -74,17 +74,17 @@ isolation rudimentaire. Et rendez-vous au prochain cours pour avoir une
|
||||||
meilleure isolation !
|
meilleure isolation !
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```shell
|
```
|
||||||
42sh$ which firefox
|
42sh$ which firefox
|
||||||
/usr/bin/firefox
|
/usr/bin/firefox
|
||||||
42sh# ./mymoulette ./newrootfs/ /bin/bash
|
42sh# ./mymoulette ./newrootfs/ /bin/bash
|
||||||
bash# which firefox
|
bash# which firefox
|
||||||
which: no firefox in (/usr/bin:/usr/local/bin:/bin:/opt/bin)
|
which: no firefox in (/usr/bin:/usr/local/bin:/bin:/opt/bin)
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## Palier 5 : seccomp (2 points) {.unnumbered}
|
## Palier 5 : seccomp (2 points) {-}
|
||||||
|
|
||||||
Filtrez les appels systèmes de telle sorte qu'aucun programme exécuté dans
|
Filtrez les appels systèmes de telle sorte qu'aucun programme exécuté dans
|
||||||
votre bac à sable ne puisse plus lancer les appels systèmes suivants :
|
votre bac à sable ne puisse plus lancer les appels systèmes suivants :
|
||||||
|
@ -96,10 +96,10 @@ votre bac à sable ne puisse plus lancer les appels systèmes suivants :
|
||||||
|
|
||||||
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)`, ...
|
||||||
|
|
||||||
|
|
||||||
## Palier bonus : Automatisation de la création de l'environnement (5 points) {.unnumbered}
|
## Palier bonus : Automatisation de la création de l'environnement (5 points) {-}
|
||||||
|
|
||||||
Pour *moulinéter* plusieurs étudiants en parallèle, vous allez avoir besoin de
|
Pour *moulinéter* plusieurs étudiants en parallèle, vous allez avoir besoin de
|
||||||
plusieurs environnements identiques. Plutôt que de recopier cet environnement,
|
plusieurs environnements identiques. Plutôt que de recopier cet environnement,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
## Palier 6 : Une vraie isolation (2 points) {.unnumbered}
|
## 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`.
|
||||||
|
@ -6,10 +6,10 @@ 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) {.unnumbered}
|
## 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 7 : Empêcher les fuites d'information (2 points) {.unnumbered}
|
## 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,72 +27,78 @@ 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 7 bis : Volume attaché au code à moulinéter (1 point) {.unnumbered}
|
## 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">
|
||||||
```
|
```
|
||||||
42sh$ ./mymoulette ./newrootfs/ /bin/bash
|
42sh$ ./mymoulette ./newrootfs/ /bin/bash
|
||||||
bash# ls /home/student/
|
bash# ls /home/student/
|
||||||
bash#
|
bash# ls /var/lib/git/login_x/42sh/
|
||||||
42sh$ ./mymoulette -v /var/lib/git/login_x/42sh/ ./newrootfs/ /bin/bash
|
ls: cannot access '/var/lib/git/login_x/42sh/': No such file or directory
|
||||||
|
|
||||||
|
42sh$ ls /var/lib/git/login_x/42sh/
|
||||||
|
src/ tests/ AUTHORS configure Makefile.am README TODO
|
||||||
|
|
||||||
|
42sh$ ./mymoulette -v /var/lib/git/login_x/42sh/ ./newrootfs/ /bin/bash
|
||||||
bash# ls /home/student/
|
bash# ls /home/student/
|
||||||
src/ tests/ AUTHORS configure Makefile.am README TODO
|
src/ tests/ AUTHORS configure Makefile.am README TODO
|
||||||
bash#
|
bash#
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Astuce : `mount(2)`, `mkdir(2)`.
|
**Astuce\ :** `mount(2)`, `mkdir(2)`.
|
||||||
|
|
||||||
|
|
||||||
## Palier 8 : Identification du conteneur (1 point) {.unnumbered}
|
## 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">
|
||||||
```
|
```
|
||||||
42sh$ ./mymoulette ./newrootfs/ hostname
|
42sh$ ./mymoulette ./newrootfs/ hostname
|
||||||
ush9ukohh3Ch
|
ush9ukohh3Ch
|
||||||
42sh$ ./mymoulette ./newrootfs/ hostname
|
|
||||||
shie6aif2aiH
|
42sh$ ./mymoulette ./newrootfs/ hostname
|
||||||
|
shie6aif2aiH
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## Palier 9 : `pivot_root` (3 points) {.unnumbered}
|
## Palier 9 : `pivot_root` (3 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 `pivot_root(2)`,
|
**Attention\ :** vos filtres `seccomp` filtrant l'appel système
|
||||||
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 10 : Bac à sable connecté (2 points) {.unnumbered}
|
## Palier 10 : Bac à sable connecté (2 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">
|
||||||
```
|
```
|
||||||
42sh$ ip link
|
42sh$ ip link
|
||||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
|
||||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||||
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
|
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
|
||||||
link/ether 90:2b:34:5e:fa:a7 brd ff:ff:ff:ff:ff:ff
|
link/ether 90:2b:34:5e:fa:a7 brd ff:ff:ff:ff:ff:ff
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -100,28 +106,28 @@ Vous devrez pouvoir `ping`er votre conteneur depuis votre hôte :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ ip address
|
42sh$ ip address
|
||||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
|
||||||
[...]
|
[...]
|
||||||
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
||||||
[...]
|
[...]
|
||||||
3: veth3e06cad@if82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
|
3: veth3e06cad@if82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
|
||||||
link/ether 42:a2:a0:89:54:ef brd ff:ff:ff:ff:ff:ff
|
link/ether 42:a2:a0:89:54:ef brd ff:ff:ff:ff:ff:ff
|
||||||
inet 10.10.10.41/24 brd 10.10.10.255 scope global veth3e06cad
|
inet 10.10.10.41/24 brd 10.10.10.255 scope global veth3e06cad
|
||||||
valid_lft forever preferred_lft forever
|
valid_lft forever preferred_lft forever
|
||||||
42sh$ ping 10.10.10.42
|
42sh$ ping 10.10.10.42
|
||||||
PING 10.10.10.42 (10.10.10.42) 56(84) bytes of data.
|
PING 10.10.10.42 (10.10.10.42) 56(84) bytes of data.
|
||||||
64 bytes from 10.10.10.42: icmp_seq=1 ttl=56 time=3.90 ms
|
64 bytes from 10.10.10.42: icmp_seq=1 ttl=56 time=3.90 ms
|
||||||
64 bytes from 10.10.10.42: icmp_seq=2 ttl=56 time=3.78 ms
|
64 bytes from 10.10.10.42: icmp_seq=2 ttl=56 time=3.78 ms
|
||||||
^C
|
^C
|
||||||
--- 10.10.10.42 ping statistics ---
|
--- 10.10.10.42 ping statistics ---
|
||||||
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
|
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
|
||||||
rtt min/avg/max/mdev = 3.789/3.847/3.906/0.085 ms
|
rtt min/avg/max/mdev = 3.789/3.847/3.906/0.085 ms
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
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 aux
|
**Astuces\ :** vous pouvez utiliser la `libnetlink(3)` ou même faire des appels
|
||||||
programmes `ip(8)`, `brctl(8)`, ...
|
aux programmes `ip(8)`, `brctl(8)`,\ ...
|
||||||
|
|
|
@ -5,12 +5,12 @@ Exemples
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ ./mymoulette -h
|
42sh$ ./mymoulette -h
|
||||||
MyMoulette, the students' nightmare, now highly secured
|
MyMoulette, the students' nightmare, now highly secured
|
||||||
Usage: ./mymoulette [-v student_workdir] environment moulette_prog [moulette_arg [...]]
|
Usage: ./mymoulette [-v student_workdir] environment moulette_prog [moulette_arg [...]]
|
||||||
environment is the path to the directory containing the new rootfs
|
environment is the path to the directory containing the new rootfs
|
||||||
moulette_prog will be the first program to be launched, must already be in the environment
|
moulette_prog will be the first program to be launched, must already be in the environment
|
||||||
student_workdir is the directory containing the code to grade
|
student_workdir is the directory containing the code to grade
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -19,32 +19,32 @@ Exemples
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ ip address show veth0l
|
42sh$ ip address show veth0l
|
||||||
2: veth0l@if82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
|
2: veth0l@if82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
|
||||||
link/ether 42:a2:a0:89:54:ef brd ff:ff:ff:ff:ff:ff
|
link/ether 42:a2:a0:89:54:ef brd ff:ff:ff:ff:ff:ff
|
||||||
inet 10.10.10.41/24 brd 10.10.10.255 scope global veth3e06cad
|
inet 10.10.10.41/24 brd 10.10.10.255 scope global veth3e06cad
|
||||||
valid_lft forever preferred_lft forever
|
valid_lft forever preferred_lft forever
|
||||||
|
|
||||||
42sh$ ./mymoulette ./newrootfs/ /usr/bin/ip address show veth0r
|
42sh$ ./mymoulette ./newrootfs/ /usr/bin/ip address show veth0r
|
||||||
2: veth0r@if82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
|
2: veth0r@if82: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
|
||||||
link/ether 42:a2:a0:89:55:ef brd ff:ff:ff:ff:ff:ff
|
link/ether 42:a2:a0:89:55:ef brd ff:ff:ff:ff:ff:ff
|
||||||
inet 10.10.10.42/24 brd 10.10.10.255 scope global veth3e06cad
|
inet 10.10.10.42/24 brd 10.10.10.255 scope global veth3e06cad
|
||||||
valid_lft forever preferred_lft forever
|
valid_lft forever preferred_lft forever
|
||||||
|
|
||||||
42sh$ ping -c 1 10.10.10.42
|
42sh$ ping -c 1 10.10.10.42
|
||||||
PING 10.10.10.42 (10.10.10.42) 56(84) bytes of data.
|
PING 10.10.10.42 (10.10.10.42) 56(84) bytes of data.
|
||||||
64 bytes from 10.10.10.42: icmp_seq=1 ttl=56 time=3.90 ms
|
64 bytes from 10.10.10.42: icmp_seq=1 ttl=56 time=3.90 ms
|
||||||
|
|
||||||
--- 10.10.10.42 ping statistics ---
|
--- 10.10.10.42 ping statistics ---
|
||||||
1 packets transmitted, 1 received, 0% packet loss, time 1003ms
|
1 packets transmitted, 1 received, 0% packet loss, time 1003ms
|
||||||
rtt min/avg/max/mdev = 3.789/3.847/3.906/0.085 ms
|
rtt min/avg/max/mdev = 3.789/3.847/3.906/0.085 ms
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ ./mymoulette ./newrootfs/ /usr/bin/curl http://www.linuxcontainers.org/ | md5sum
|
42sh$ ./mymoulette ./newrootfs/ /usr/bin/curl http://www.linuxcontainers.org/ | md5sum
|
||||||
c7d68d1cb4737125a84cd69f55add202
|
c7d68d1cb4737125a84cd69f55add202
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -53,7 +53,23 @@ Exemples
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ ./mymoulette ./newrootfs/ /bin/ping 9.9.9.9
|
42sh$ ./mymoulette ./newrootfs/ /bin/ping 9.9.9.9
|
||||||
ping: icmp open socket: Permission denied
|
ping: icmp open socket: Permission denied
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```
|
||||||
|
42sh$ ./mymoulette ./newrootfs/ /usr/local/bin/view_caps
|
||||||
|
cap_user_header_t
|
||||||
|
-----------------
|
||||||
|
Version: 20080522
|
||||||
|
PID: 0
|
||||||
|
|
||||||
|
cap_user_data_t
|
||||||
|
---------------
|
||||||
|
effective: 0x0
|
||||||
|
permitted: 0x0
|
||||||
|
inheritable: 0x0
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,35 +3,35 @@ title: Virtualisation légère -- Projet
|
||||||
author: Pierre-Olivier *nemunaire* Mercier
|
author: Pierre-Olivier *nemunaire* Mercier
|
||||||
institute: EPITA
|
institute: EPITA
|
||||||
date: EPITA -- SRS 2019
|
date: EPITA -- SRS 2019
|
||||||
|
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
|
||||||
|
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,
|
||||||
|
vous vous assurerez de l'isolation de chaque étudiant.
|
||||||
|
|
||||||
|
\vspace{1em}
|
||||||
|
|
||||||
|
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 !
|
||||||
|
|
||||||
|
\vspace{1em}
|
||||||
|
|
||||||
|
Ce projet est à rendre à <virli@nemunai.re> au plus tard le dimanche
|
||||||
|
25 novembre 2018 à 23 h 42.
|
||||||
...
|
...
|
||||||
|
|
||||||
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 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, vous vous assurerez de l'isolation de chaque
|
|
||||||
étudiant.
|
|
||||||
|
|
||||||
\vspace{1em}
|
|
||||||
|
|
||||||
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 !
|
|
||||||
|
|
||||||
\vspace{1em}
|
|
||||||
|
|
||||||
Ce projet est à rendre à <virli@nemunai.re> au plus tard le dimanche
|
|
||||||
25 novembre 2018 à 23 h 42.
|
|
||||||
|
|
||||||
\tableofcontents
|
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
Paliers
|
Paliers
|
||||||
|
|
Loading…
Reference in New Issue
Block a user