tuto3: Precise chroot part

This commit is contained in:
nemunaire 2022-10-18 06:15:27 +02:00
parent 6665cfbace
commit af26d0989b

View File

@ -4,8 +4,42 @@ L'isolation ... avec `chroot`
Depuis les premières versions d'Unix, il est possible de changer le répertoire Depuis les premières versions d'Unix, il est possible de changer le répertoire
vu comme étant la racine du système de fichiers. En anglais : *change root*: 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 `chroot`. Le processus effectuant cette action ainsi que tous ses fils verront
donc une racine différente du reste du système.\ donc une racine différente du reste du système.
::::: {.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`.
:::::
Pour se créer un environnement afin de changer notre racine, il va falloir Pour se créer un environnement afin de changer notre racine, il va falloir
commencer par créer le dossier de notre nouvelle racine, peu importe où dans commencer par créer le dossier de notre nouvelle racine, peu importe où dans
@ -43,6 +77,20 @@ chroot newroot /busybox ash
Nous voici donc maintenant dans un nouveau shell (il s'agit d'`ash`, le shell Nous voici donc maintenant dans un nouveau shell (il s'agit d'`ash`, le shell
de `busybox`). de `busybox`).
::::: {.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` :
`su` pourra nous demander le mot de passe `root` ou d'autre autre utilisateur,
mais comme on a la maîtrise du fichier `/etc/shadow`, on aura mis préalablement
une valeur qui nous arrange.
:::::
Jusque-là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour Jusque-là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
`bash` : `bash` :
@ -92,13 +140,7 @@ chroot newroot/ bash
</div> </div>
### Archives *stage3*, *miniroot* ### Gentoo
Les distributions *à l'ancienne* proposent de télécharger leur système de base
sous forme de tarball :
#### Gentoo
<http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64-openrc/stage3-amd64-openrc-20211128T170532Z.tar.xz> <http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64-openrc/stage3-amd64-openrc-20211128T170532Z.tar.xz>
@ -123,7 +165,7 @@ chroot newroot/ bash
</div> </div>
#### Alpine ### Alpine
<https://dl-cdn.alpinelinux.org/alpine/v3.14/releases/x86_64/alpine-minirootfs-3.14.2-x86_64.tar.gz> <https://dl-cdn.alpinelinux.org/alpine/v3.14/releases/x86_64/alpine-minirootfs-3.14.2-x86_64.tar.gz>
@ -141,3 +183,27 @@ Alpine se contentant de Busybox pour son système de base, nous n'avons pas
chroot newroot/ ash chroot newroot/ ash
``` ```
</div> </div>
### 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é.