Work on tuto 3
This commit is contained in:
parent
f216cc220c
commit
84fbd90d66
@ -1,4 +1,4 @@
|
|||||||
SOURCES = tutorial.md installation.md pseudofs.md cgroups.md capabilities.md project.md
|
SOURCES = tutorial.md installation.md chroot.md pseudofs.md capabilities.md cgroups.md project.md
|
||||||
PANDOCOPTS = --latex-engine=xelatex \
|
PANDOCOPTS = --latex-engine=xelatex \
|
||||||
--standalone \
|
--standalone \
|
||||||
--normalize \
|
--normalize \
|
||||||
|
17
tutorial/3/capabilities.md
Normal file
17
tutorial/3/capabilities.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
\newpage
|
||||||
|
|
||||||
|
Les capabilities
|
||||||
|
================
|
||||||
|
|
||||||
|
## Présentation
|
||||||
|
|
||||||
|
## La `libcap`
|
||||||
|
|
||||||
|
## Les attributs étendus
|
||||||
|
|
||||||
|
`getcap` et `setcap` sur `ping`
|
||||||
|
|
||||||
|
## Exercice : visualisateur de capabilities d'un processus
|
||||||
|
|
||||||
|
```shell
|
||||||
|
```
|
@ -1,6 +1,7 @@
|
|||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
# Utiliser les *cgroup*s
|
Utiliser les *cgroup*s
|
||||||
|
======================
|
||||||
|
|
||||||
Les *cgroup*s (pour *Control Group*s) permettent de collecter des statistiques
|
Les *cgroup*s (pour *Control Group*s) permettent de collecter des statistiques
|
||||||
sur des groupes de processus (appelés tâches) et de leur attribuer des
|
sur des groupes de processus (appelés tâches) et de leur attribuer des
|
||||||
|
96
tutorial/3/chroot.md
Normal file
96
tutorial/3/chroot.md
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
\newpage
|
||||||
|
|
||||||
|
L'isolation du pauvre
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Depuis les premières version d'Unix, il est possible de changer le répertoire
|
||||||
|
vu comme étant la racine du système de fichiers.
|
||||||
|
|
||||||
|
|
||||||
|
## Mise en place de l'environnement
|
||||||
|
|
||||||
|
Pour se créer un environnement afin de changer notre racine, il va falloir
|
||||||
|
commencer par créer le dossier de notre nouvelle racine :
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mkdir newroot
|
||||||
|
```
|
||||||
|
|
||||||
|
### `busybox`
|
||||||
|
|
||||||
|
On a déjà parlé du porjet Busybox : c'est un programme linké statiquement,
|
||||||
|
c'est-à-dire qu'il n'a pas de dépendance sur des bibliothèques
|
||||||
|
dynamiques. Il se suffit donc à lui-même dans un chroot (dans lequel on ne peut
|
||||||
|
pas accéder aux bibliothèques du système, il faudrait toutes les copier à la
|
||||||
|
main).
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cp $(which busybox) newroot/
|
||||||
|
chroot newroot /busybox ash
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `debootstrap`
|
||||||
|
|
||||||
|
`debootstrap` est le programme utilisé par l'installeur des distributions
|
||||||
|
Debian et ses dérivés. Il permet d'installer dans un dossier (en général, ce
|
||||||
|
dossier correspond au point de montage de la nouvelle racine choisi par
|
||||||
|
l'utilisateur lors de l'installation) le système de base.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
debootstrap jessie newroot/ http://httpredir.debian.org/
|
||||||
|
```
|
||||||
|
|
||||||
|
`pacstrap` est le programme équivalent pour Archlinux.
|
||||||
|
|
||||||
|
|
||||||
|
### *stage3*
|
||||||
|
|
||||||
|
Les distributions « à l'ancienne » proposent encore de télécharger leur système
|
||||||
|
de base sous forme de tarball :
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget ftp://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/20160929/stage3-amd64-20160929.tar.bz2
|
||||||
|
tar xpf stage3-amd64-*.tar.bz2 -C newroot/
|
||||||
|
```
|
||||||
|
|
||||||
|
L'avantage de télécharger l'archive de Gentoo est que l'on a déjà `gcc` dans un
|
||||||
|
environnement qui tient dans 300 MB.
|
||||||
|
|
||||||
|
|
||||||
|
## Exercice
|
||||||
|
|
||||||
|
Écrivons maintenant un programme dont le seul but est de s'échaper du `chroot`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
make escape
|
||||||
|
echo bar > ../foo
|
||||||
|
chroot .
|
||||||
|
```
|
||||||
|
|
||||||
|
Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cat ../foo
|
||||||
|
```
|
||||||
|
|
||||||
|
Mais une fois votre programme exécuté, vous devriez pouvoir !
|
||||||
|
|
||||||
|
```shell
|
||||||
|
./escape
|
||||||
|
cat /path/to/foo
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Rendu
|
||||||
|
|
||||||
|
### Fichiers
|
||||||
|
|
||||||
|
Rendez un fichier `.c` contenant un programme qui, lorsqu'il est compilé puis
|
||||||
|
exécuté dans un chroot, permet de s'en échapper pour rejoindre la véritable
|
||||||
|
racine.
|
||||||
|
|
||||||
|
|
||||||
|
### Questions
|
||||||
|
|
||||||
|
1. Citez un moyen d'empêcher l'échappement du `chroot`.
|
@ -9,7 +9,53 @@ 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 !
|
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
|
Cette semaine, il faudra faire en sorte de restreindre un groupe de processus
|
||||||
pour qu'il ne puisse pas faire de déni de service.
|
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
|
||||||
|
|
||||||
|
Après avoir mis en place les bases de votre programme,
|
||||||
|
|
||||||
|
|
||||||
|
### Stage 2 : Réduire les capabilities
|
||||||
|
|
||||||
|
|
||||||
|
### Stage 3 : Script d'initialisation
|
||||||
|
|
||||||
|
|
||||||
|
### Stage 4 : Utilisable par un utilisateur
|
||||||
|
|
||||||
|
Une autre solution
|
||||||
|
|
||||||
|
|
||||||
|
### Stage 5 : Création de l'environnement d'exécution
|
||||||
|
|
||||||
|
Plutôt que d'utiliser votre système hôte complet, il faudrait utiliser un
|
||||||
|
système contenant le struct minimum.
|
||||||
|
|
||||||
|
|
||||||
|
### Stage 6 : Isolation du pauvre
|
||||||
|
|
||||||
|
Nous n'avons pas encore vu de meilleure méthode pour mieux isoler
|
||||||
|
l'environnement que de faire un `chroot`, ajouter à votre programme cette
|
||||||
|
isolation rudimentaire.
|
||||||
|
|
||||||
|
|
||||||
|
### Stage 7 (bonus) : automatisation de l'environnement
|
||||||
|
|
||||||
|
LVM
|
||||||
|
|
||||||
|
|
||||||
## Modalité de rendu
|
## Modalité de rendu
|
||||||
|
@ -39,11 +39,9 @@ Linux emploi de nombreux systèmes de fichiers virtuels :
|
|||||||
- `/sys` : contient, principalement, des éléments de configuration du noyau, du
|
- `/sys` : contient, principalement, des éléments de configuration du noyau, du
|
||||||
matériel et des périphériques (activation de l'IPv6, taille des tampons,
|
matériel et des périphériques (activation de l'IPv6, taille des tampons,
|
||||||
clignottement des DELs, ...) ;
|
clignottement des DELs, ...) ;
|
||||||
|
- `/proc/sys` : configuration du noyau ;
|
||||||
- `/sys/firmware/efi/efivars` : pour accéder et modifier les variables de
|
- `/sys/firmware/efi/efivars` : pour accéder et modifier les variables de
|
||||||
l'UEFI ;
|
l'UEFI ;
|
||||||
- `/sys/kernel/security` ;
|
|
||||||
- debugfs ;
|
|
||||||
- configfs ;
|
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
Tous ces systèmes de fichiers sont généralement exclusivement stocké en
|
Tous ces systèmes de fichiers sont généralement exclusivement stocké en
|
||||||
@ -59,7 +57,7 @@ Explorons le pseudo système de fichiers `/proc` pour écrire un script qui va
|
|||||||
afficher des informations sur un processus donné :
|
afficher des informations sur un processus donné :
|
||||||
|
|
||||||
```
|
```
|
||||||
42sh$ ./pi $$
|
42sh$ ./procinfo $$
|
||||||
PID: 4242
|
PID: 4242
|
||||||
Path: /bin/bash
|
Path: /bin/bash
|
||||||
Arguments:
|
Arguments:
|
||||||
|
Loading…
Reference in New Issue
Block a user