2022-05-04 09:18:16 +00:00
|
|
|
|
L'isolation ... avec `chroot`
|
|
|
|
|
-----------------------------
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2016-10-06 01:58:52 +00:00
|
|
|
|
Depuis les premières versions d'Unix, il est possible de changer le répertoire
|
2021-10-05 15:23:09 +00:00
|
|
|
|
vu comme étant la racine du système de fichiers. En anglais : *change root*:
|
|
|
|
|
`chroot`. Le processus effectuant cette action ainsi que tous ses fils verront
|
2022-10-18 04:15:27 +00:00
|
|
|
|
donc une racine différente du reste du système.
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2022-10-18 04:15:27 +00:00
|
|
|
|
::::: {.code}
|
|
|
|
|
|
|
|
|
|
Le noyau stocke le chemin de la racine courante dans les informations de notre
|
|
|
|
|
processus :
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```c
|
|
|
|
|
// From linux/sched.h
|
|
|
|
|
struct task_struct {
|
|
|
|
|
[...]
|
|
|
|
|
/* Filesystem information: */
|
|
|
|
|
struct fs_struct *fs;
|
|
|
|
|
[...]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// From linux/fs_struct.h
|
|
|
|
|
struct fs_struct {
|
|
|
|
|
int users;
|
|
|
|
|
spinlock_t lock;
|
|
|
|
|
seqcount_spinlock_t seq;
|
|
|
|
|
int umask;
|
|
|
|
|
int in_exec;
|
|
|
|
|
struct path root;
|
|
|
|
|
struct path pwd;
|
|
|
|
|
};
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
Ici dans `root`.
|
|
|
|
|
|
|
|
|
|
On retrouve la racine exposée sous forme de lien symbolique dans
|
|
|
|
|
`/proc/$$/root`.
|
|
|
|
|
|
|
|
|
|
:::::
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
|
|
|
|
Pour se créer un environnement afin de changer notre racine, il va falloir
|
2021-10-05 15:23:09 +00:00
|
|
|
|
commencer par créer le dossier de notre nouvelle racine, peu importe où dans
|
|
|
|
|
l'arborescence :
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
mkdir newroot
|
2016-10-05 09:13:56 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
|
|
|
|
|
Nous allons ensuite remplir ce dossier afin qu'il soit vraiment utilisable
|
|
|
|
|
comme une racine : rien n'est strictement obligatoire, on s'assure simplement
|
|
|
|
|
d'avoir de quoi bidouiller : un shell sera amplement suffisant pour commencer.
|
|
|
|
|
|
2016-10-05 09:13:56 +00:00
|
|
|
|
### `busybox`
|
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
Queques mots, pour commencer, à propos du projet Busybox : c'est un programme
|
|
|
|
|
couteau-suisse qui implémente tous les binaires vitaux pour avoir un système
|
|
|
|
|
fonctionnel et utilisable : `ls`, `sh`, `cat`, mais aussi `init`, `mdev` (un
|
|
|
|
|
`udev`-like, cela permet de découvrir les périphériques attachés afin de les
|
|
|
|
|
exposer dans `/dev` notamment). C'est un programme *linké* statiquement,
|
|
|
|
|
c'est-à-dire qu'il ne va pas chercher ni charger de bibliothèque dynamique à
|
|
|
|
|
son lancement. Il se suffit donc à lui-même dans un *chroot*, car il n'a pas de
|
|
|
|
|
dépendances. Nous pouvons donc tester notre première isolation :
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
cp $(which busybox) newroot/
|
|
|
|
|
chroot newroot /busybox ash
|
2016-10-05 09:13:56 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
Nous voici donc maintenant dans un nouveau shell (il s'agit d'`ash`, le shell
|
|
|
|
|
de `busybox`).
|
|
|
|
|
|
2022-10-18 04:15:27 +00:00
|
|
|
|
::::: {.question}
|
|
|
|
|
|
|
|
|
|
#### Faut-il être `root` pour faire un `chroot` ? {-}
|
|
|
|
|
|
|
|
|
|
Oui, seul un utilisateur avec la *capability* `CAP_SYS_CHROOT` peut le faire !\
|
|
|
|
|
|
|
|
|
|
En fait, il est possible de duper le système avec un fichier `/etc/passwd` et
|
|
|
|
|
`/etc/shadow` que l'on maîtrise, et un binaire *setuid root* tel que `su` :
|
2022-10-18 14:40:31 +00:00
|
|
|
|
`su` pourra nous demander le mot de passe `root` ou d'un autre utilisateur,
|
2022-10-18 04:15:27 +00:00
|
|
|
|
mais comme on a la maîtrise du fichier `/etc/shadow`, on aura mis préalablement
|
|
|
|
|
une valeur qui nous arrange.
|
|
|
|
|
|
|
|
|
|
:::::
|
|
|
|
|
|
2022-05-12 00:46:31 +00:00
|
|
|
|
Jusque-là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
|
2021-10-05 15:23:09 +00:00
|
|
|
|
`bash` :
|
2017-10-22 22:14:32 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
2022-10-18 14:40:31 +00:00
|
|
|
|
```
|
2018-11-16 01:38:41 +00:00
|
|
|
|
42sh$ cp $(which bash) newroot/
|
|
|
|
|
42sh# chroot newroot /bash
|
2022-10-18 14:40:31 +00:00
|
|
|
|
chroot: failed to run command 'bash': No such file or directory
|
2017-10-22 22:14:32 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
De quel fichier est-il question ici ?
|
2017-10-22 22:14:32 +00:00
|
|
|
|
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
### `debootstrap`, `pacstrap`
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
|
|
|
|
`debootstrap` est le programme utilisé par l'installeur des distributions
|
2022-10-18 14:40:31 +00:00
|
|
|
|
Debian et ses dérivés. Il permet d'installer dans un dossier (en général, ce
|
2016-10-06 01:58:52 +00:00
|
|
|
|
dossier correspond au point de montage de la nouvelle racine choisie par
|
2016-10-05 09:13:56 +00:00
|
|
|
|
l'utilisateur lors de l'installation) le système de base.
|
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
2021-10-05 15:23:09 +00:00
|
|
|
|
debootstrap bullseye newroot/ http://httpredir.debian.org/debian/
|
2016-10-05 09:13:56 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
`pacstrap` est le programme équivalent pour Arch Linux. Alors que `debootstrap`
|
|
|
|
|
peut s'utiliser depuis n'importe quel environnement ou distribution,
|
|
|
|
|
`pacstrap` nécessite d'avoir installé et configuré `pacman` (le gestionnaire de
|
|
|
|
|
paquets d'Arch Linux), ce qui est le cas si vous êtes sous Arch Linux ou ses
|
2022-10-18 14:40:31 +00:00
|
|
|
|
dérivés.
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
pacstrap newroot/
|
|
|
|
|
```
|
|
|
|
|
</div>
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
Dans les deux cas, nous nous retrouvons avec un dossier `newroot` contenant une
|
2022-02-24 19:43:43 +00:00
|
|
|
|
distribution complète minimale, dans laquelle nous pouvons entrer :
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
2021-10-05 15:23:09 +00:00
|
|
|
|
chroot newroot/ bash
|
2016-10-05 09:13:56 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
|
|
|
|
|
2022-10-18 04:15:27 +00:00
|
|
|
|
### Gentoo
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
<http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64-openrc/stage3-amd64-openrc-20211128T170532Z.tar.xz>
|
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
2021-10-05 15:23:09 +00:00
|
|
|
|
tar xpf stage3-amd64-*.tar.xz -C newroot/
|
2016-10-05 09:13:56 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
::::: {.more}
|
|
|
|
|
L'avantage de télécharger l'archive de Gentoo est que l'on a déjà `gcc` dans un
|
|
|
|
|
environnement qui tient dans 200 MB.
|
|
|
|
|
:::::
|
|
|
|
|
|
|
|
|
|
Comme pour les autres distributions vues précédemment, nous pouvons entrer dans
|
2022-02-24 19:43:43 +00:00
|
|
|
|
notre nouvelle racine comme ceci :
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
2021-10-05 15:23:09 +00:00
|
|
|
|
chroot newroot/ bash
|
2016-10-05 09:13:56 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2021-10-05 15:23:09 +00:00
|
|
|
|
|
2022-10-18 04:15:27 +00:00
|
|
|
|
### Alpine
|
2016-10-05 09:13:56 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
<https://dl-cdn.alpinelinux.org/alpine/v3.14/releases/x86_64/alpine-minirootfs-3.14.2-x86_64.tar.gz>
|
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2021-10-05 15:23:09 +00:00
|
|
|
|
```bash
|
|
|
|
|
tar xpf alpine-minirootfs-*.tar.xz -C newroot/
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```
|
2021-10-05 15:23:09 +00:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
Alpine se contentant de Busybox pour son système de base, nous n'avons pas
|
2022-02-24 19:43:43 +00:00
|
|
|
|
`bash`, mais on peut tout de même lancer `ash` :
|
2021-10-05 15:23:09 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
chroot newroot/ ash
|
2016-10-05 09:13:56 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2022-10-18 04:15:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Utiliser une image OCI ?
|
|
|
|
|
|
|
|
|
|
Pourquoi pas : nous avons réalisé précédemment un script pour interagir avec le
|
|
|
|
|
registre, c'est le moment de l'utiliser !
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
./registry_play.sh library/hello-world:latest
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
Si on se contente de l'image `hello-world`, on va pouvoir exécuter le binaire
|
|
|
|
|
principal :
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
chroot rootfs/ /hello
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
Bien sûr, des images de base comme `debian` ou `alpine` devraient fonctionner
|
|
|
|
|
également sans difficulté.
|