Comment créer un périphérique / dev / tun dans un conteneur LXC non privilégié?

10

Cette question est similaire à No tun device in lxc guest for openvpn . Le LXC a évolué et les conteneurs non privilégiés LXC ont été introduits récemment qui offrent une autre couche de sécurité contre la rupture de la prison.

J'ai besoin de créer un serveur OpenVPN dans l'un des conteneurs non privilégiés. Je ne sais pas comment laisser le conteneur créer un périphérique réseau tun privé.

Je l'ai annexé lxc.cgroup.devices.allow = c 10:200 rwmau ~/.local/share/lxc/mylxc/config.

Après avoir démarré le conteneur, mknod /dev/net/tun c 10 200revient mknod: '/dev/net/tun': Operation not permittedà l'intérieur du conteneur.

J'utilise un vanunt Ubuntu 14.04 64bit comme hôte et un conteneur créé avec

lxc-create -t download -n mylxc  -- -d ubuntu -r trusty -a amd64

Quelqu'un a-t-il réussi à faire /dev/tunfonctionner l'appareil sous LXC non privilégié?

Adam Ryczkowski
la source
Pour plus d'informations, pour que openvpn fonctionne dans un conteneur LXC non privilégié, j'ai dû ajouter lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileau fichier de configuration du conteneur, comme décrit ici: superuser.com/a/1205662/130915 Ensuite, j'ai exécuté openvpn en tant que root avec sudo à l'intérieur du conteneur.
baptx

Réponses:

3

Vous devez ajouter explicitement la capacité CAP_MKNOD à votre conteneur .

  lxc.cap.keep
          Specify the capability to be kept in the container. All other
          capabilities will be dropped. When a special value of "none"
          is encountered, lxc will clear any keep capabilities specified
          up to this point. A value of "none" alone can be used to drop
          all capabilities.

Vous pouvez également essayer d'automatiser cela (s'il vous arrive d'utiliser systemdà l'intérieur du conteneur) en utilisant:

  lxc.hook.autodev
          A hook to be run in the container's namespace after mounting
          has been done and after any mount hooks have run, but before
          the pivot_root, if lxc.autodev == 1.  The purpose of this hook
          is to assist in populating the /dev directory of the container
          when using the autodev option for systemd based containers.
          The container's /dev directory is relative to the
          ${LXC_ROOTFS_MOUNT} environment variable available when the
          hook is run.

qui peut pointer vers un script en cours d'exécution mknod.

Son utilisation dockerest très simple à réaliser. Par défaut, les conteneurs ne sont pas privilégiés .

Dans cet exemple, je tire un trustyconteneur du registre:

sudo -r sysadm_r docker pull corbinu/docker-trusty
Pulling repository corbinu/docker-trusty
...
Status: Downloaded newer image for corbinu/docker-trusty:latest

Et je le démarre en mode interactif, informant de la capacité dont j'ai besoin à l'intérieur:

sudo -r sysadm_r docker run --cap-drop ALL --cap-add MKNOD \
  -i -t corbinu/docker-trusty bash
root@46bbb43095ec:/# ls /dev/
console  fd/      full     fuse     kcore    mqueue/  null     ptmx     pts/     random   shm/     stderr   stdin    stdout   tty      urandom  zero
root@46bbb43095ec:/# mkdir /dev/net
root@46bbb43095ec:/# mknod /dev/net/tun c 10 200
root@46bbb43095ec:/# ls -lrt /dev/net/tun
crw-r--r--. 1 root root 10, 200 Apr  6 16:52 /dev/net/tun

Par opposition à:

sudo -r sysadm_r docker run --cap-drop ALL \
  -i -t corbinu/docker-trusty bash
root@9a4cdc75a5ec:/# mkdir /dev/net
root@9a4cdc75a5ec:/# mknod /dev/net/tun c 10 200
mknod: ‘/dev/net/tun’: Operation not permitted
dawud
la source
1
Je crois que ce que Docker appelle "non privilégié" est très différent de ce que cela signifie dans le langage LXC: github.com/docker/docker/issues/7906 . Il semble que Docker ne prend toujours pas en charge les conteneurs non privilégiés. Cela n'invalide pas nécessairement votre réponse - je vérifierai CAP_MKNODaprès le travail.
Adam Ryczkowski
1
Pouvez-vous me donner un petit pointeur sur la façon de modifier la capacité du conteneur non privilégié? Au moins une phrase correcte pour Google?
Adam Ryczkowski
3
L'ajout de la lxc.cap.keep = CAP_MKNODconfig fait une erreur Simultaneously requested dropping and keeping caps. J'ai vérifié tous les configs récursive ajoutés ( ubuntu.userns.conf, ubuntu.common.confet common.conf) et a trouvé une seule ligne avec lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Mais ce n'est pas pertinent non?
Adam Ryczkowski