tuto3: Precise chroot part

This commit is contained in:
nemunaire 2022-10-18 06:15:27 +02:00
parent 6665cfbace
commit af26d0989b
1 changed files with 75 additions and 9 deletions

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
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
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
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
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
`bash` :
@ -92,13 +140,7 @@ chroot newroot/ bash
</div>
### Archives *stage3*, *miniroot*
Les distributions *à l'ancienne* proposent de télécharger leur système de base
sous forme de tarball :
#### Gentoo
### Gentoo
<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>
#### Alpine
### Alpine
<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
```
</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é.