\newpage # Utiliser les *namespaces* ## Comparaison de *namespace* Écrivez un script ou un programme, `cmpns`, dans le langage courant de votre choix, permettant de déterminer si deux programmes s'exécutent dans les mêmes *namespaces*. ### Exemples ```sh 42sh$ cmpns $(pgrep influxdb) $(pgrep init) - ipc: differ - mnt: differ - net: differ - pid: differ - user: same - uts: same ``` ```sh 42sh$ cmpns $(pgrep init) self - ipc: same - mnt: same - net: same - pid: same - user: same - uts: same ``` Ici, `self` fait référence au processus actuellement exécuté. ## Rejoindre un *namespace* Dans le langage courant de votre choix, écrivez un programme : `setns`, permettant, à la manière de `unshare(1)` et `unshare(2)`, d'utiliser `setns(2)` via votre interpréteur. Les options attendues sont : * rejoindre un *namespace* IPC : `-i`, `--ipc` ; * rejoindre un *namespace* mount : `-m`, `--mount` ; * rejoindre un *namespace* net : `-n`, `--net` ; * rejoindre un *namespace* PID : `-p`, `--pid` ; * rejoindre un *namespace* UTS : `-u`, `--uts` ; * rejoindre un *namespace* user : `-U`, `--user`. ### Exemples ```sh 42sh# setns /bin/bash bash# _ ``` #### IPC and PID Namespaces ```sh 42sh# setns --ipc=/proc/42/ns/ipc -p /proc/42/ns/pid /bin/echo toto toto ``` #### Net Namespace ```sh 42sh# setns --net=/proc/42/ns/net ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00::00 inet 127.0.0.1/8 brd 127.255.255.255 scope lo valid_lft forever preferred_lft inet6 ::1/128 scope host valid_lft forever preferred_lft forever ``` #### UTS Namespace ```sh 42sh# hostname --fqdn koala.zoo.paris 42sh# setns --uts=/proc/42/ns/uts hostname --fqdn lynx.zoo.paris ``` ## My Little Container En utilisant le langage courant de votre choix, concevez l'exécutable `mlc`, permettant de lancer une application dans un environnement différent (comme un `chroot`, mais sans permettre de s'en échapper) et avec des privilèges réduits. Votre solution doit créer au moins un nouveau *namespace* mount et PID. Vous aurez sans doute besoin de : `clone(2)`, `capabilities(7)`, `capset(2)`, `pivot_root(2)`, ### Exemples ```sh 42sh# ls newroot bin etc home usr root proc var 42sh# mlc newroot/ /bin/bash bash# ls ../../../ bin etc home usr root proc var bash# escape_chroot ls bin etc home usr root proc var bash# ls -ld /proc/[0-9]* | wc -l 2 bash# curl http://www.linuxcontainers.org/ | md5sum 0123456789abcdef bash# ping 8.8.8.8 Operation not permitted ``` ## Rendu Pour chaque exercice de cette partie, vous pouvez rendre un seul fichier s'il s'agit d'un script ; sinon, vous devez rendre une tarball contenant un `Makefile` permettant de générer les éventuels exécutables et/ou un `README` expliquant comment s'en servir. Vous devez donc rendre 3 fichiers : `cmpns` ou `cmpns.tar.bz2`, `setns` ou `setns.tar.bz2` et `mlc` ou `mlc.tar.bz2`. \vspace{3em} Bon courage !