virli/tutorial/1/namespaces.md
2015-10-07 03:45:39 +02:00

2.9 KiB

\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

42sh$ cmpns $(pgrep influxdb) $(pgrep init)
  - ipc: differ
  - mnt: differ
  - net: differ
  - pid: differ
  - user: same
  - uts: same
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

42sh# setns /bin/bash
bash# _

IPC and PID Namespaces

42sh# setns --ipc=/proc/42/ns/ipc -p /proc/42/ns/pid /bin/echo toto
toto

Net Namespace

42sh# setns --net=/proc/42/ns/net ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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

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

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.