tuto3: Precise chroot part
This commit is contained in:
parent
6665cfbace
commit
af26d0989b
@ -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é.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user