tuto3: Spelling
This commit is contained in:
parent
be453216f8
commit
6b6f37b4a3
@ -103,7 +103,7 @@ meilleure isolation !
|
|||||||
## Palier 4 : seccomp (2 points) {-}
|
## Palier 4 : seccomp (2 points) {-}
|
||||||
|
|
||||||
Filtrez les appels système de telle sorte qu'aucun programme exécuté dans
|
Filtrez les appels système de telle sorte qu'aucun programme exécuté dans
|
||||||
votre bac à sable ne puisse plus lancer les appels systèmes suivants :
|
votre bac à sable ne puisse plus lancer les appels système suivants :
|
||||||
|
|
||||||
* `nfsservctl(2)` ;
|
* `nfsservctl(2)` ;
|
||||||
* `personality(2)` ;
|
* `personality(2)` ;
|
||||||
|
@ -9,9 +9,10 @@ processus :
|
|||||||
* les processus *non-privilégiés* : dont l'identifiant numérique de son
|
* les processus *non-privilégiés* : dont l'identifiant numérique de son
|
||||||
utilisateur n'est pas 0.
|
utilisateur n'est pas 0.
|
||||||
|
|
||||||
Lors des différents tests de permission fait par le noyau, les processus
|
Lors des différents tests de permission faits par le noyau, les processus
|
||||||
privilégiés outrepassaient ces tests, tandis que les autres devaient passer les
|
privilégiés outrepassaient ces tests, tandis que les autres devaient passer les
|
||||||
tests de l'effective UID, effective GID, et autres groupes supplémentaires...
|
tests de l'*effective UID*, *effective GID*, et autres groupes
|
||||||
|
supplémentaires...
|
||||||
|
|
||||||
Dans les années 90, ce système s'est rélévé être un peu trop basique et
|
Dans les années 90, ce système s'est rélévé être un peu trop basique et
|
||||||
conduisait régulièrement à des abus, au moyen de vulnérabilités trouvées dans
|
conduisait régulièrement à des abus, au moyen de vulnérabilités trouvées dans
|
||||||
@ -37,7 +38,7 @@ passe. Pourtant bien que l'on puisse lire le fichier `/etc/passwd`, seul `root`
|
|||||||
peut y apporter des modifications (il en est de même pour `/etc/shadow` qui
|
peut y apporter des modifications (il en est de même pour `/etc/shadow` qui
|
||||||
contient les hashs des mots de passe).
|
contient les hashs des mots de passe).
|
||||||
|
|
||||||
C'est ainsi qu'est apparu le `suid-bit` parmi les modes des fichiers. Lorsque
|
C'est ainsi qu'est apparu le `suid-bit` parmi les modes de fichiers. Lorsque
|
||||||
ce bit est défini sur un binaire exécutable, au moment de l'exécution, le
|
ce bit est défini sur un binaire exécutable, au moment de l'exécution, le
|
||||||
contexte passe à celui du propriétaire du fichier (`root` si le propriétaire
|
contexte passe à celui du propriétaire du fichier (`root` si le propriétaire
|
||||||
est `root`, mais cela fonctionne quelque soit le propriétaire du fichier : on
|
est `root`, mais cela fonctionne quelque soit le propriétaire du fichier : on
|
||||||
@ -68,7 +69,7 @@ d'écrire sur une interface réseau.
|
|||||||
### Et ainsi les privilèges furent séparés
|
### Et ainsi les privilèges furent séparés
|
||||||
|
|
||||||
Depuis Linux 2.2 (en 1998), les différentes actions réclamant des privilèges
|
Depuis Linux 2.2 (en 1998), les différentes actions réclamant des privilèges
|
||||||
sont regroupés en catégories que l'on appelle *capabilities*. Chacune donne
|
sont regroupées en catégories que l'on appelle *capabilities*. Chacune donne
|
||||||
accès à un certain nombre d'actions, on trouve notamment :
|
accès à un certain nombre d'actions, on trouve notamment :
|
||||||
|
|
||||||
* `CAP_CHOWN` : permet de modifier le propriétaire d'un fichier de manière
|
* `CAP_CHOWN` : permet de modifier le propriétaire d'un fichier de manière
|
||||||
@ -83,7 +84,7 @@ accès à un certain nombre d'actions, on trouve notamment :
|
|||||||
|
|
||||||
Petit point historique, Linux n'est pas à l'origine du concept de
|
Petit point historique, Linux n'est pas à l'origine du concept de
|
||||||
*capabilities*, il s'agit au départ de la norme POSIX 1003.1e, mais celle-ci
|
*capabilities*, il s'agit au départ de la norme POSIX 1003.1e, mais celle-ci
|
||||||
s'est éteinte auprès le 17e *draft*. Il devait y être standardisé de nombreux
|
s'est éteinte après le 17\textsuperscript{ème} *draft*. Il devait y être standardisé de nombreux
|
||||||
composants améliorant la sécurité des systèmes POSIX, notamment les
|
composants améliorant la sécurité des systèmes POSIX, notamment les
|
||||||
*capabilities* POSIX, les *ACL POSIX*, ...
|
*capabilities* POSIX, les *ACL POSIX*, ...
|
||||||
|
|
||||||
@ -142,7 +143,7 @@ Tout d'abord, il faut noter que chaque *thread* dispose de 5 ensembles de
|
|||||||
*capabilities*. Ceux-ci sont utilisés de la façon suivante :
|
*capabilities*. Ceux-ci sont utilisés de la façon suivante :
|
||||||
|
|
||||||
- ***bounding*** (B) : c'est l'ensemble limitant des *capabilities* qui pourront
|
- ***bounding*** (B) : c'est l'ensemble limitant des *capabilities* qui pourront
|
||||||
faire l'objet d'un calcul lors des prochaines exécutions. Quelques soit les
|
faire l'objet d'un calcul lors des prochaines exécutions. Quelques soient les
|
||||||
*capabilities* que peut nous faire gagner une exécution, si la *capability*
|
*capabilities* que peut nous faire gagner une exécution, si la *capability*
|
||||||
ne se trouve pas dans le *bounding set*, elle ne sera pas considérée et il
|
ne se trouve pas dans le *bounding set*, elle ne sera pas considérée et il
|
||||||
sera impossible de l'obtenir. L'option `--cap-drop` de Docker modifie cet
|
sera impossible de l'obtenir. L'option `--cap-drop` de Docker modifie cet
|
||||||
@ -328,7 +329,7 @@ struct vfs_cap_data {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
La valeur `magic` contient la version sur 1 octet, puis 3 octets sont réservés
|
La valeur `magic` contient la version sur 1 octet, puis 3 octets sont réservés
|
||||||
pour des flags. Actuellement un seul flag existe, il s'agit de
|
pour des *flags*. Actuellement un seul *flag* existe, il s'agit de
|
||||||
`VFS_CAP_FLAGS_EFFECTIVE` qui détermine si la liste effective de *capabilities*
|
`VFS_CAP_FLAGS_EFFECTIVE` qui détermine si la liste effective de *capabilities*
|
||||||
du programme doit être remplie avec les *capabilities* *permitted* si elle doit
|
du programme doit être remplie avec les *capabilities* *permitted* si elle doit
|
||||||
rester vide (auquel cas ce sera au programme de s'ajouter les *capabilities* au
|
rester vide (auquel cas ce sera au programme de s'ajouter les *capabilities* au
|
||||||
@ -391,7 +392,7 @@ naissance au nouveau processus et $p′$ le nouveau processus.\
|
|||||||
On remarque que sans les *ambients capabilities*, on perd systématiquement les
|
On remarque que sans les *ambients capabilities*, on perd systématiquement les
|
||||||
*capabilities* dont on disposait avant l'`execve(2)`, car $f_I$ n'est que très
|
*capabilities* dont on disposait avant l'`execve(2)`, car $f_I$ n'est que très
|
||||||
rarement défini sur un exécutable. Dans le cas général, on récupère donc soit
|
rarement défini sur un exécutable. Dans le cas général, on récupère donc soit
|
||||||
$f_P$, soit $p_A$ (les deux étant exclusif : si $f_P$ est défini, $p′_A$ est
|
$f_P$, soit $p_A$ (les deux étant exclusifs : si $f_P$ est défini, $p′_A$ est
|
||||||
vide).
|
vide).
|
||||||
|
|
||||||
Bien entendu, lorsque l'on se trouve dans le contexte d'exécution de `root` (ou
|
Bien entendu, lorsque l'on se trouve dans le contexte d'exécution de `root` (ou
|
||||||
@ -436,7 +437,7 @@ par l'ensemble *bounding*.
|
|||||||
|
|
||||||
On utilise les appels système `capget(2)` et `capset(2)` pour respectivement
|
On utilise les appels système `capget(2)` et `capset(2)` pour respectivement
|
||||||
connaître les *capabilities* actuelles de notre fil d'exécution et pour les
|
connaître les *capabilities* actuelles de notre fil d'exécution et pour les
|
||||||
écraser. Ces appels systèmes utilisent une structure d'en-tête et une structure
|
écraser. Ces appels système utilisent une structure d'en-tête et une structure
|
||||||
de données, qui sont définies dans `linux/capability.h` :
|
de données, qui sont définies dans `linux/capability.h` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
@ -479,9 +480,9 @@ structures `vfs_cap_data` et `vfs_ns_cap_data` : il n'y a pas de notion de
|
|||||||
*namespace* ici.
|
*namespace* ici.
|
||||||
|
|
||||||
Il y a eu un couac dans les en-têtes distribués avec Linux 2.6.25, causant des
|
Il y a eu un couac dans les en-têtes distribués avec Linux 2.6.25, causant des
|
||||||
*buffers overflow* dans les applications qui n'avaient pas prévues de gérer les
|
*buffers overflow* dans les applications qui n'avaient pas prévu de gérer les
|
||||||
versions. Cela a été corrigé dans la version 2.6.26 : un avertissement est
|
versions. Cela a été corrigé dans la version 2.6.26 : un avertissement est
|
||||||
consigné dans les journaux systèmes en cas d'utilisation malheureuse de la
|
consigné dans les journaux système en cas d'utilisation malheureuse de la
|
||||||
version 2.
|
version 2.
|
||||||
|
|
||||||
:::::
|
:::::
|
||||||
@ -515,7 +516,7 @@ Le second paramètre attendu est l'une des constantes représentant une
|
|||||||
*capability*.\
|
*capability*.\
|
||||||
|
|
||||||
Avec `PR_CAPBSET_READ`, `prctl(2)` retournera 0 si la *capability* ne fait pas
|
Avec `PR_CAPBSET_READ`, `prctl(2)` retournera 0 si la *capability* ne fait pas
|
||||||
parti de l'ensemble *bounding*, ou 1 si elle est bien présente.
|
partie de l'ensemble *bounding*, ou 1 si elle est bien présente.
|
||||||
|
|
||||||
Avec `PR_CAPBSET_DROP`, `prctl(2)` retirera la *capability* passée en argument
|
Avec `PR_CAPBSET_DROP`, `prctl(2)` retirera la *capability* passée en argument
|
||||||
de l'ensemble *bounding*. Une fois cette action effectuée, il est impossible de
|
de l'ensemble *bounding*. Une fois cette action effectuée, il est impossible de
|
||||||
@ -527,7 +528,7 @@ Dans la pratique, on préférera utiliser `cap_get_bound(3)` et
|
|||||||
:::::
|
:::::
|
||||||
|
|
||||||
Enfin, le *thread* peut aussi modifier à sa guise l'ensemble *ambient*, à
|
Enfin, le *thread* peut aussi modifier à sa guise l'ensemble *ambient*, à
|
||||||
condition que les *capabilities* ajoutées soient dans les ensemble *permitted*
|
condition que les *capabilities* ajoutées soient dans les ensembles *permitted*
|
||||||
et *inheritable*.
|
et *inheritable*.
|
||||||
|
|
||||||
::::: {.code}
|
::::: {.code}
|
||||||
@ -541,7 +542,7 @@ préciser l'action que l'on veut réaliser :\
|
|||||||
- `PR_CAP_AMBIENT_LOWER` : retire la *capability* précisée comme troisième
|
- `PR_CAP_AMBIENT_LOWER` : retire la *capability* précisée comme troisième
|
||||||
paramètre ;
|
paramètre ;
|
||||||
- `PR_CAP_AMBIENT_IS_SET` : retourne 1 si la *capability* précisée comme
|
- `PR_CAP_AMBIENT_IS_SET` : retourne 1 si la *capability* précisée comme
|
||||||
troisième paramètre fait parti de l'ensemble *ambient*, sinon retourne 0 ;
|
troisième paramètre fait partie de l'ensemble *ambient*, sinon retourne 0 ;
|
||||||
- `PR_CAP_AMBIENT_CLEAR_ALL` : vide l'ensemble *ambient*.
|
- `PR_CAP_AMBIENT_CLEAR_ALL` : vide l'ensemble *ambient*.
|
||||||
|
|
||||||
:::::
|
:::::
|
||||||
@ -682,7 +683,7 @@ amont.
|
|||||||
|
|
||||||
Je vous recommande la lecture des *man* suivants :
|
Je vous recommande la lecture des *man* suivants :
|
||||||
|
|
||||||
* `capabilities(7)` : énumérant tous les capabilities, leur utilisation, etc. ;
|
* `capabilities(7)` : énumérant tous les *capabilities*, leur utilisation, etc. ;
|
||||||
* `xattrs(7)` : à propos des attributs étendus.
|
* `xattrs(7)` : à propos des attributs étendus.
|
||||||
|
|
||||||
Et de ces quelques articles :
|
Et de ces quelques articles :
|
||||||
@ -697,5 +698,5 @@ Et de ces quelques articles :
|
|||||||
<https://forums.grsecurity.net/viewtopic.php?f=7&t=2522#p10271>
|
<https://forums.grsecurity.net/viewtopic.php?f=7&t=2522#p10271>
|
||||||
* [Linux Capabilities on HackTricks](https://book.hacktricks.xyz/linux-unix/privilege-escalation/linux-capabilities) :\
|
* [Linux Capabilities on HackTricks](https://book.hacktricks.xyz/linux-unix/privilege-escalation/linux-capabilities) :\
|
||||||
<https://book.hacktricks.xyz/linux-unix/privilege-escalation/linux-capabilities>
|
<https://book.hacktricks.xyz/linux-unix/privilege-escalation/linux-capabilities>
|
||||||
- [POSIZ Access Control Lists on Linux](https://www.usenix.org/legacy/publications/library/proceedings/usenix03/tech/freenix03/full_papers/gruenbacher/gruenbacher_html/main.html) :\
|
- [POSIX Access Control Lists on Linux](https://www.usenix.org/legacy/publications/library/proceedings/usenix03/tech/freenix03/full_papers/gruenbacher/gruenbacher_html/main.html) :\
|
||||||
<https://www.usenix.org/legacy/publications/library/proceedings/usenix03/tech/freenix03/full_papers/gruenbacher/gruenbacher_html/main.html>
|
<https://www.usenix.org/legacy/publications/library/proceedings/usenix03/tech/freenix03/full_papers/gruenbacher/gruenbacher_html/main.html>
|
||||||
|
@ -68,7 +68,7 @@ SELECT * from "$my_cgroup_name";
|
|||||||
Liste non exhaustive de données à monitorer :
|
Liste non exhaustive de données à monitorer :
|
||||||
|
|
||||||
* Nombre d'IOs effectué ;
|
* Nombre d'IOs effectué ;
|
||||||
* nobre d'octets lus/écrits sur les disques ;
|
* nombre d'octets lus/écrits sur les disques ;
|
||||||
* temps de calcul utilisé (`userspace`, `system`, tout confondu) ;
|
* temps de calcul utilisé (`userspace`, `system`, tout confondu) ;
|
||||||
* ...
|
* ...
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
\newpage
|
|
||||||
|
|
||||||
Les *cgroup*s
|
Les *cgroup*s
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
@ -33,10 +31,10 @@ spécifique :
|
|||||||
- [`freezer`
|
- [`freezer`
|
||||||
:](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/freezer-subsystem.html)
|
:](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/freezer-subsystem.html)
|
||||||
pour suspendre et reprendre l'exécution d'un groupe de tâches ;
|
pour suspendre et reprendre l'exécution d'un groupe de tâches ;
|
||||||
- [`hugetlb` :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/hugetlb.html) statistiques et limitation de l'usage de la fonctionnalité `HugeTLB` (permettant d'obtenir des pages mémoires plus grande que 4 kB) ;
|
- [`hugetlb` :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/hugetlb.html) statistiques et limitation de l'usage de la fonctionnalité `HugeTLB` (permettant d'obtenir des pages mémoires plus grandes que 4 kB) ;
|
||||||
- [`memory` :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/memory.html) statistiques et limitation d'usage de la mémoire vive et de la *swap* ;
|
- [`memory` :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/memory.html) statistiques et limitation d'usage de la mémoire vive et de la *swap* ;
|
||||||
- [`net_cls` (v1 seulement) :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/net_cls.html) applique un `classid` à tous les paquets émis par les tâches du *cgroup*, pour filtrage par le pare-feu en sortie ;
|
- [`net_cls` (v1 seulement) :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/net_cls.html) applique un `classid` à tous les paquets émis par les tâches du *cgroup*, pour filtrage par le pare-feu en sortie ;
|
||||||
- [`net_prio` (v1 seulement) :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/net_prio.html) surcharge la valeur de l'option de priorité `SO_PRIORITY`, ordonant la file d'attente des paquets sortants ;
|
- [`net_prio` (v1 seulement) :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/net_prio.html) surcharge la valeur de l'option de priorité `SO_PRIORITY`, ordonnant la file d'attente des paquets sortants ;
|
||||||
- [`pids` :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/pids.html) statistiques et limitation du nombre de processus ;
|
- [`pids` :](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/pids.html) statistiques et limitation du nombre de processus ;
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
@ -83,12 +81,16 @@ Avant d'aller plus loin, notez que les exemples seront donnés pour les deux
|
|||||||
versions des `cgroup`s à chaque fois.
|
versions des `cgroup`s à chaque fois.
|
||||||
|
|
||||||
::::: {.question}
|
::::: {.question}
|
||||||
|
|
||||||
|
#### Quelles sont différences entre les deux versions des *cgroups* ? {-}
|
||||||
|
|
||||||
La principale différence entre les deux est la fusion des différents
|
La principale différence entre les deux est la fusion des différents
|
||||||
sous-systèmes au sein d'une même arborescence. Dans la première version, chaque
|
sous-systèmes au sein d'une même arborescence. Dans la première version, chaque
|
||||||
sous-système disposait de sa propre arborescence et il fallait créer les
|
sous-système disposait de sa propre arborescence et il fallait créer les
|
||||||
groupes et associer les tâches pour chaque sous-système. Avec la seconde
|
groupes et associer les tâches pour chaque sous-système. Avec la seconde
|
||||||
version, une seule création est nécessaire, quelque soit le nombre de
|
version, une seule création est nécessaire, quelque soit le nombre de
|
||||||
sous-systèmes que l'on souhaite utiliser.
|
sous-systèmes que l'on souhaite utiliser.
|
||||||
|
|
||||||
:::::
|
:::::
|
||||||
|
|
||||||
|
|
||||||
@ -236,7 +238,7 @@ for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Maintenant, nous alloner donné l'ordre au noyau de ne plus allouer de temps de
|
Maintenant, nous allons donner l'ordre au noyau de ne plus allouer de temps de
|
||||||
calcul à notre shell et ses fils :
|
calcul à notre shell et ses fils :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
@ -388,7 +390,7 @@ limites que vous avez définies :
|
|||||||
|
|
||||||
### Pour aller plus loin {-}
|
### Pour aller plus loin {-}
|
||||||
|
|
||||||
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
|
Pour tout connaître en détail, [la série d'articles de Neil Brown sur les
|
||||||
Control groups](https://lwn.net/Articles/604609/)[^lwncgroups] est excellente !
|
Control groups](https://lwn.net/Articles/604609/)[^lwncgroups] est excellente !
|
||||||
Plus [cet article sur la version 2](https://lwn.net/Articles/679786/)[^lwncgroupsv2].
|
Plus [cet article sur la version 2](https://lwn.net/Articles/679786/)[^lwncgroupsv2].
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ En route vers la contenerisation
|
|||||||
================================
|
================================
|
||||||
|
|
||||||
Nous avons vu un certain nombre de fonctionnalités offertes par le noyau Linux
|
Nous avons vu un certain nombre de fonctionnalités offertes par le noyau Linux
|
||||||
pour limiter ou autoriser ou contraindre différents usages des ressources de
|
pour limiter, autoriser ou contraindre différents usages des ressources de
|
||||||
notre machine.
|
notre machine.
|
||||||
|
|
||||||
Il est temps maintenant de commencer à parler d'isolation, mais ... cela fait
|
Il est temps maintenant de commencer à parler d'isolation, mais ... cela fait
|
||||||
|
@ -85,7 +85,7 @@ 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
|
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` :
|
`/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,
|
`su` pourra nous demander le mot de passe `root` ou d'un autre utilisateur,
|
||||||
mais comme on a la maîtrise du fichier `/etc/shadow`, on aura mis préalablement
|
mais comme on a la maîtrise du fichier `/etc/shadow`, on aura mis préalablement
|
||||||
une valeur qui nous arrange.
|
une valeur qui nous arrange.
|
||||||
|
|
||||||
@ -95,10 +95,10 @@ Jusque-là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
|
|||||||
`bash` :
|
`bash` :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```bash
|
```
|
||||||
42sh$ cp $(which bash) newroot/
|
42sh$ cp $(which bash) newroot/
|
||||||
42sh# chroot newroot /bash
|
42sh# chroot newroot /bash
|
||||||
chroot: failed to run command ‘bash’: No such file or directory
|
chroot: failed to run command 'bash': No such file or directory
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ De quel fichier est-il question ici ?
|
|||||||
### `debootstrap`, `pacstrap`
|
### `debootstrap`, `pacstrap`
|
||||||
|
|
||||||
`debootstrap` est le programme utilisé par l'installeur des distributions
|
`debootstrap` est le programme utilisé par l'installeur des distributions
|
||||||
Debian et ses dérivées. Il permet d'installer dans un dossier (en général, ce
|
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 choisie par
|
dossier correspond au point de montage de la nouvelle racine choisie par
|
||||||
l'utilisateur lors de l'installation) le système de base.
|
l'utilisateur lors de l'installation) le système de base.
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ debootstrap bullseye newroot/ http://httpredir.debian.org/debian/
|
|||||||
peut s'utiliser depuis n'importe quel environnement ou distribution,
|
peut s'utiliser depuis n'importe quel environnement ou distribution,
|
||||||
`pacstrap` nécessite d'avoir installé et configuré `pacman` (le gestionnaire de
|
`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
|
paquets d'Arch Linux), ce qui est le cas si vous êtes sous Arch Linux ou ses
|
||||||
dérivées.
|
dérivés.
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```bash
|
```bash
|
||||||
|
@ -4,8 +4,9 @@ Statistiques et contrôle des processus
|
|||||||
======================================
|
======================================
|
||||||
|
|
||||||
Maintenant que nous avons pu voir en détail comment utiliser Docker, nous
|
Maintenant que nous avons pu voir en détail comment utiliser Docker, nous
|
||||||
allons tâcher d'apprendre comment il fonctionne en nous penchant sur un certain
|
allons tâcher d'appréhender les techniques qu'il met en œuvre. De nombreuses
|
||||||
nombre de fonctionnalités de Linux.
|
fonctionnalités du noyau Linux sont en effet sollicitées : certaines sont là
|
||||||
|
depuis longtemps, quelques unes sont standardisées, d'autres sont plus récentes.
|
||||||
|
|
||||||
Dans un premier temps, nous allons aborder la manière dont le noyau Linux
|
Dans un premier temps, nous allons aborder la manière dont le noyau Linux
|
||||||
permet de contrôler les processus : que ce soit en collectant des informations
|
permet de contrôler les processus : que ce soit en collectant des informations
|
||||||
|
@ -114,7 +114,7 @@ compte sont ceux contenus dans le `cgroup`.
|
|||||||
## Esquiver l'OOM killer ?
|
## Esquiver l'OOM killer ?
|
||||||
|
|
||||||
Le passage de l'OOM killer relevant parfois de la roulette russe, il peut être
|
Le passage de l'OOM killer relevant parfois de la roulette russe, il peut être
|
||||||
intéressant, pour certain processus, de vouloir faire en sorte qu'ils aient
|
intéressant, pour certains processus, de vouloir faire en sorte qu'ils aient
|
||||||
moins de chance d'arriver en tête du classement, même s'ils occupent beaucoup
|
moins de chance d'arriver en tête du classement, même s'ils occupent beaucoup
|
||||||
de mémoire. On pourrait par exemple vouloir que des services importants ou des
|
de mémoire. On pourrait par exemple vouloir que des services importants ou des
|
||||||
programmes contenant notre travail en cours (potentiellement non-enregistré !)
|
programmes contenant notre travail en cours (potentiellement non-enregistré !)
|
||||||
@ -158,7 +158,7 @@ read(<fd of eventfd()>, &ret, sizeof(ret));
|
|||||||
|
|
||||||
D'autres notifications peuvent être mises en place, selon le même principe sur
|
D'autres notifications peuvent être mises en place, selon le même principe sur
|
||||||
d'autres fichiers, notamment `memory.usage_in_bytes`, pour être prévenu dès
|
d'autres fichiers, notamment `memory.usage_in_bytes`, pour être prévenu dès
|
||||||
lors que l'on franchi dans un sens ou dans l'autre un certain palier. Le palier
|
lors que l'on franchit dans un sens ou dans l'autre un certain palier. Le palier
|
||||||
qui nous intéresse est à indiquer comme troisième argument à
|
qui nous intéresse est à indiquer comme troisième argument à
|
||||||
`cgroup.event_control`.
|
`cgroup.event_control`.
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ meilleure isolation !
|
|||||||
## Palier 4 : seccomp (2 points) {-}
|
## Palier 4 : seccomp (2 points) {-}
|
||||||
|
|
||||||
Filtrez les appels système de telle sorte qu'aucun programme exécuté dans
|
Filtrez les appels système de telle sorte qu'aucun programme exécuté dans
|
||||||
votre bac à sable ne puisse plus lancer les appels systèmes suivants :
|
votre bac à sable ne puisse plus lancer les appels système suivants :
|
||||||
|
|
||||||
* `nfsservctl(2)` ;
|
* `nfsservctl(2)` ;
|
||||||
* `personality(2)` ;
|
* `personality(2)` ;
|
||||||
|
@ -21,4 +21,4 @@ moment où vous n'utilisez pas une bibliothèque qui abstrait complètement cett
|
|||||||
plomberie, n'hésitez pas à l'utiliser !
|
plomberie, n'hésitez pas à l'utiliser !
|
||||||
|
|
||||||
Gardez en tête que ce projet sera à continuer au prochain TP, où il sera
|
Gardez en tête que ce projet sera à continuer au prochain TP, où il sera
|
||||||
principalement question de faire des appels systèmes.
|
principalement question de faire des appels système.
|
||||||
|
@ -126,10 +126,10 @@ uts:[4026531838]
|
|||||||
Explorons le pseudo système de fichiers `/sys` pour écrire un script
|
Explorons le pseudo système de fichiers `/sys` pour écrire un script
|
||||||
qui va, en fonction de ce que vous avez de disponible :
|
qui va, en fonction de ce que vous avez de disponible :
|
||||||
|
|
||||||
* afficher des statistiques sur notre batterie ;
|
* afficher des statistiques sur votre batterie ;
|
||||||
* afficher des statistiques la fréquence du CPU.
|
* afficher des statistiques sur la fréquence du CPU.
|
||||||
|
|
||||||
##### `batinfo.sh` {-}\
|
##### `batinfo.sh` {-}
|
||||||
|
|
||||||
Voici un exemple d'utilisation :
|
Voici un exemple d'utilisation :
|
||||||
|
|
||||||
@ -157,8 +157,9 @@ Remaining time: N/A
|
|||||||
Pour les détails sur l'organisation de ce dossier, regardez :\
|
Pour les détails sur l'organisation de ce dossier, regardez :\
|
||||||
<https://www.kernel.org/doc/Documentation/power/power_supply_class.txt>.
|
<https://www.kernel.org/doc/Documentation/power/power_supply_class.txt>.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
##### `cpuinfo.sh` {-}\
|
##### `cpuinfo.sh` {-}
|
||||||
|
|
||||||
Voici un exemple d'utilisation :
|
Voici un exemple d'utilisation :
|
||||||
|
|
||||||
@ -181,7 +182,7 @@ Thermal throttle count: 0
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
N'hésitez pas à rajouter toute sorte d'information intéressantes !
|
N'hésitez pas à rajouter toute sorte d'informations intéressantes !
|
||||||
|
|
||||||
|
|
||||||
#### `rev_kdb_leds.sh`, `suspend_schedule.sh`
|
#### `rev_kdb_leds.sh`, `suspend_schedule.sh`
|
||||||
@ -190,10 +191,10 @@ Maintenant que vous savez lire des informations dans `/sys`, tentons d'aller
|
|||||||
modifier le comportement de notre système. Au choix, réalisez l'un des scripts
|
modifier le comportement de notre système. Au choix, réalisez l'un des scripts
|
||||||
suivants, en fonction du matériel dont vous disposez :
|
suivants, en fonction du matériel dont vous disposez :
|
||||||
|
|
||||||
* inverser l'état des diodes de notre clavier ;
|
* inverser l'état des diodes de votre clavier ;
|
||||||
* mettre en veille votre machine, en ayant programmé une heure de réveil.
|
* mettre en veille votre machine, en ayant programmé une heure de réveil.
|
||||||
|
|
||||||
##### `rev_kdb_leds.sh` {-}\
|
##### `rev_kdb_leds.sh` {-}
|
||||||
|
|
||||||
Si vous avez :
|
Si vous avez :
|
||||||
|
|
||||||
@ -201,7 +202,7 @@ Si vous avez :
|
|||||||
* capslock Off,
|
* capslock Off,
|
||||||
* scrolllock Off ;
|
* scrolllock Off ;
|
||||||
|
|
||||||
Après avoir exécuté le script, nous devrions avoir :
|
Après avoir exécuté le script, vous devriez avoir :
|
||||||
|
|
||||||
* numlock Off,
|
* numlock Off,
|
||||||
* capslock On,
|
* capslock On,
|
||||||
@ -218,7 +219,9 @@ Voici un exemple d'utilisation :
|
|||||||
`input20` correspond à l'identifiant de votre clavier, sous
|
`input20` correspond à l'identifiant de votre clavier, sous
|
||||||
`/sys/class/input/`.
|
`/sys/class/input/`.
|
||||||
|
|
||||||
##### `suspend_schedule.sh` {-}\
|
---
|
||||||
|
|
||||||
|
##### `suspend_schedule.sh` {-}
|
||||||
|
|
||||||
Votre script prendra en argument l'heure à laquelle votre machine doit être
|
Votre script prendra en argument l'heure à laquelle votre machine doit être
|
||||||
réveillée, avant de la mettre effectivement en veille.
|
réveillée, avant de la mettre effectivement en veille.
|
||||||
|
@ -7,10 +7,10 @@ Est attendu d'ici le cours suivant :
|
|||||||
|
|
||||||
- vos réponses à l'évaluation du cours,
|
- vos réponses à l'évaluation du cours,
|
||||||
- [SRS] tous les exercices de ce TP,
|
- [SRS] tous les exercices de ce TP,
|
||||||
- [GISTRE] les projets paliers du [projet final](https://virli.nemunai.re/project-gistre.pdf).
|
- [GISTRE] les premiers paliers du [projet final](https://virli.nemunai.re/project-gistre.pdf).
|
||||||
|
|
||||||
|
|
||||||
Arborescence attendue
|
Arborescence attendue (SRS)
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Tous les fichiers identifiés comme étant à rendre sont à placer dans un dépôt
|
Tous les fichiers identifiés comme étant à rendre sont à placer dans un dépôt
|
||||||
|
@ -2,7 +2,7 @@ Secure Computing Mode
|
|||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
Plus connue sous l'acronyme *seccomp*, cette fonctionnalité du noyau Linux
|
Plus connue sous l'acronyme *seccomp*, cette fonctionnalité du noyau Linux
|
||||||
permet de restreindre les appels systèmes qu'un processus est autorisé à
|
permet de restreindre les appels système qu'un processus est autorisé à
|
||||||
utiliser. En cas d'appel non autorisé, le processus fautif est directement tué
|
utiliser. En cas d'appel non autorisé, le processus fautif est directement tué
|
||||||
(`SIGKILL`) par le noyau, ou, lorsque c'est précisé, un code `errno`
|
(`SIGKILL`) par le noyau, ou, lorsque c'est précisé, un code `errno`
|
||||||
particulier peut être renvoyé au programme.
|
particulier peut être renvoyé au programme.
|
||||||
@ -53,7 +53,7 @@ autorisé conduit à un `SIGKILL` du processus.
|
|||||||
|
|
||||||
Plus modulable que le mode strict, le mode de filtrage permet une grande
|
Plus modulable que le mode strict, le mode de filtrage permet une grande
|
||||||
amplitude en permettant au programmeur de définir finement quels appels
|
amplitude en permettant au programmeur de définir finement quels appels
|
||||||
systèmes le programme est autorisé à faire ou non, et quelle sentence est
|
système le programme est autorisé à faire ou non, et quelle sentence est
|
||||||
exécutée en cas de faute.
|
exécutée en cas de faute.
|
||||||
|
|
||||||
Notons que les processus fils issus (`fork(2)` ou `clone(2)`) d'un processus
|
Notons que les processus fils issus (`fork(2)` ou `clone(2)`) d'un processus
|
||||||
@ -87,6 +87,7 @@ sleep: cannot read realtime clock: Operation not permitted
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Dans cet exemple, l'appel système filtré est `nanosleep(2)`.
|
Dans cet exemple, l'appel système filtré est `nanosleep(2)` (on
|
||||||
|
utilise `strace(2)` pour le découvrir).
|
||||||
|
|
||||||
:::::
|
:::::
|
||||||
|
@ -7,11 +7,11 @@ date: Mercredi 19 octobre 2022
|
|||||||
abstract: |
|
abstract: |
|
||||||
Ce premier TP consacré aux Linux Internals va nous permettre
|
Ce premier TP consacré aux Linux Internals va nous permettre
|
||||||
d'appréhender les notions de pseudos systèmes de fichiers, de
|
d'appréhender les notions de pseudos systèmes de fichiers, de
|
||||||
cgroups ainsi que de capabilities.
|
*cgroups* ainsi que de *capabilities*.
|
||||||
|
|
||||||
\vspace{1em}
|
\vspace{1em}
|
||||||
|
|
||||||
Les exercices de ce cours sont à rendre au plus tard le mercredi 9
|
Les exercices de ce cours sont à rendre au plus tard le mardi 8
|
||||||
novembre 2022 à 23 h 42. Consultez la dernière partie pour plus
|
novembre 2022 à 23 h 42. Consultez la dernière partie pour plus
|
||||||
d'informations sur les éléments à rendre.
|
d'informations sur les éléments à rendre.
|
||||||
...
|
...
|
||||||
|
@ -55,7 +55,7 @@ Nous avons pu ici modifier le nom de la machine, sans que cela n'affecte notre
|
|||||||
machine hôte.
|
machine hôte.
|
||||||
|
|
||||||
|
|
||||||
#### Les appels systèmes
|
#### Les appels système
|
||||||
|
|
||||||
L'appel système par excellence pour contrôler l'isolation d'un nouveau
|
L'appel système par excellence pour contrôler l'isolation d'un nouveau
|
||||||
processus est `clone(2)`.
|
processus est `clone(2)`.
|
||||||
|
@ -6,7 +6,7 @@ institute: EPITA
|
|||||||
date: Mercredi 7 novembre 2018
|
date: Mercredi 7 novembre 2018
|
||||||
abstract: |
|
abstract: |
|
||||||
Le but de cette seconde partie sur les mécanismes internes du noyau
|
Le but de cette seconde partie sur les mécanismes internes du noyau
|
||||||
va nous permettre d'utiliser les commandes et les appels systèmes
|
va nous permettre d'utiliser les commandes et les appels système
|
||||||
relatifs aux espaces de noms du noyau Linux ainsi que d'appréhender
|
relatifs aux espaces de noms du noyau Linux ainsi que d'appréhender
|
||||||
la complexité des sytèmes de fichiers.
|
la complexité des sytèmes de fichiers.
|
||||||
...
|
...
|
||||||
|
@ -6,7 +6,7 @@ institute: EPITA
|
|||||||
date: Jeudi 7 octobre 2021
|
date: Jeudi 7 octobre 2021
|
||||||
abstract: |
|
abstract: |
|
||||||
Le but de ce second TP sur les mécanismes internes du noyau va nous
|
Le but de ce second TP sur les mécanismes internes du noyau va nous
|
||||||
permettre d'utiliser les commandes et les appels systèmes relatifs
|
permettre d'utiliser les commandes et les appels système relatifs
|
||||||
aux *namespaces* ainsi que d'appréhender la complexité des systèmes
|
aux *namespaces* ainsi que d'appréhender la complexité des systèmes
|
||||||
de fichiers.
|
de fichiers.
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ Si les capabilities sont un regroupement grossier de fonctionnalités
|
|||||||
du noyau, seccomp est un filtre que l'on peut définir pour chaque
|
du noyau, seccomp est un filtre que l'on peut définir pour chaque
|
||||||
appel système. Liste blanche, liste noire, tout est possible.
|
appel système. Liste blanche, liste noire, tout est possible.
|
||||||
|
|
||||||
Docker filtre notamment tous les appels systèmes qui pourraient
|
Docker filtre notamment tous les appels système qui pourraient
|
||||||
déborder à l'extérieur du conteneur : il n'est par exemple pas
|
déborder à l'extérieur du conteneur : il n'est par exemple pas
|
||||||
possible de changer l'heure dans un conteneur, car il n'y a
|
possible de changer l'heure dans un conteneur, car il n'y a
|
||||||
aujourd'hui aucun mécanisme pour isoler les visions des dates d'un
|
aujourd'hui aucun mécanisme pour isoler les visions des dates d'un
|
||||||
|
@ -14,7 +14,7 @@ contient pas de modification ou de suppression : chaque fichier est normal).
|
|||||||
L'authentification est facultative et est laissée à l'appréciation du
|
L'authentification est facultative et est laissée à l'appréciation du
|
||||||
fournisseur de service. Étant donné que nous allons utiliser le [Docker
|
fournisseur de service. Étant donné que nous allons utiliser le [Docker
|
||||||
Hub](https://hub.docker.com/), le registre par défaut de `docker`, nous allons
|
Hub](https://hub.docker.com/), le registre par défaut de `docker`, nous allons
|
||||||
devoir nous plier à leur mécanisme d'authentification : chaque requête au
|
devoir nous plier à son mécanisme d'authentification : chaque requête au
|
||||||
registre doit être effectuée avec un jeton, que l'on obtient en s'authentifiant
|
registre doit être effectuée avec un jeton, que l'on obtient en s'authentifiant
|
||||||
auprès d'un service dédié. Ce service peut délivrer un jeton sans authentifier
|
auprès d'un service dédié. Ce service peut délivrer un jeton sans authentifier
|
||||||
l'interlocuteur, en restant anonyme ; dans ce cas, on ne pourra accéder qu'aux
|
l'interlocuteur, en restant anonyme ; dans ce cas, on ne pourra accéder qu'aux
|
||||||
@ -79,14 +79,14 @@ curl -s \
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Dans la liste des manifests retournés, nous devons récupérer son `digest`. Dans
|
Dans la liste des *manifests* retournés, nous devons récupérer son `digest`. Dans
|
||||||
tout l'écosystème OCI, les `digest` servent à la fois de chemin d'accès et de
|
tout l'écosystème OCI, les `digest` servent à la fois de chemin d'accès et de
|
||||||
somme de contrôle.
|
somme de contrôle.
|
||||||
|
|
||||||
|
|
||||||
## Lecture du manifest
|
## Lecture du *manifest*
|
||||||
|
|
||||||
Demandons maintenant le manifest correspondant à notre matériel et à notre
|
Demandons maintenant le *manifest* correspondant à notre matériel et à notre
|
||||||
système d'exploitation :
|
système d'exploitation :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
@ -99,14 +99,14 @@ curl -s \
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Nous voici donc maintenant avec le manifest de notre image. Nous pouvons
|
Nous voici donc maintenant avec le *manifest* de notre image. Nous pouvons
|
||||||
constater qu'il n'a bien qu'une seule couche, ouf !
|
constater qu'il n'a bien qu'une seule couche, ouf !
|
||||||
|
|
||||||
|
|
||||||
## Récupération de la configuration et de la première couche
|
## Récupération de la configuration et de la première couche
|
||||||
|
|
||||||
Les deux éléments que l'on cherche à récupérer vont se trouver dans le
|
Les deux éléments que l'on cherche à récupérer vont se trouver dans le
|
||||||
répertoire `blobs`, il ne s'agit en effet plus de manifest. Si les manifests
|
répertoire `blobs`, il ne s'agit en effet plus de *manifest*. Si les *manifests*
|
||||||
sont toujours stockés par le registre lui-même, les blobs peuvent être délégués
|
sont toujours stockés par le registre lui-même, les blobs peuvent être délégués
|
||||||
à un autre service, par exemple dans le cloud, chez Amazon S3, un CDN, etc.
|
à un autre service, par exemple dans le cloud, chez Amazon S3, un CDN, etc.
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ wget --header "Authorization: Bearer ${TOKEN}" \
|
|||||||
|
|
||||||
## Extraction
|
## Extraction
|
||||||
|
|
||||||
Le type indiqué par le manifest pour cette couche était :
|
Le type indiqué par le *manifest* pour cette couche était :
|
||||||
|
|
||||||
application/vnd.docker.image.rootfs.diff.tar.gzip
|
application/vnd.docker.image.rootfs.diff.tar.gzip
|
||||||
|
|
||||||
@ -159,6 +159,8 @@ Hello from Docker!
|
|||||||
|
|
||||||
::::: {.exercice}
|
::::: {.exercice}
|
||||||
|
|
||||||
|
#### Assemblage {-}
|
||||||
|
|
||||||
Réalisez un script pour automatiser l'ensemble de ces étapes :
|
Réalisez un script pour automatiser l'ensemble de ces étapes :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user