¿Cómo crear / dev / tun dispositivo dentro del contenedor LXC sin privilegios?

10

Esta pregunta es similar a No tun device in lxc guest for openvpn . El LXC ha evolucionado y los contenedores LXC sin privilegios se introdujeron recientemente que ofrecen otra capa de seguridad contra la ruptura de la cárcel.

Necesito crear un servidor OpenVPN dentro de uno de los contenedores sin privilegios. No sé cómo dejar que el contenedor cree un dispositivo de red tun privado.

Anexé lxc.cgroup.devices.allow = c 10:200 rwma la ~/.local/share/lxc/mylxc/config.

Después de comenzar el contenedor, mknod /dev/net/tun c 10 200regresa mknod: '/dev/net/tun': Operation not permitteddentro del contenedor.

Utilizo un Ubuntu 14.04 de 64 bits de vainilla como host y un contenedor creado con

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

¿Alguien logró hacer que el /dev/tundispositivo se ejecute bajo LXC sin privilegios?

Adam Ryczkowski
fuente
Para obtener información, para que openvpn funcione en un contenedor LXC sin privilegios, tuve que agregar lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileal archivo de configuración del contenedor, como se describe aquí: superuser.com/a/1205662/130915 Luego, ejecuté openvpn como root con sudo dentro del contenedor.
baptx

Respuestas:

3

Debe agregar explícitamente la capacidad CAP_MKNOD a su contenedor .

  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.

También puede intentar automatizar esto (si lo usa systemddentro del contenedor) usando:

  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.

que puede apuntar a un script en ejecución mknod.

Usar dockeresto es muy fácil de lograr. Por defecto, los contenedores no tienen privilegios .

En este ejemplo, estoy extrayendo un trustycontenedor del registro:

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

Y lo estoy iniciando en modo interactivo informando sobre la capacidad que necesito dentro:

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

Opuesto a:

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
fuente
1
Creo que lo que Docker llama "no privilegiado" es bastante diferente de lo que significa en lenguaje LXC: github.com/docker/docker/issues/7906 . Parece que Docker todavía no admite los contenedores sin privilegios. No necesariamente invalida su respuesta: lo comprobaré CAP_MKNODdespués del trabajo.
Adam Ryczkowski
1
¿Me puede dar un pequeño indicio sobre cómo cambiar la capacidad del contenedor sin privilegios? ¿Al menos una frase correcta para Google?
Adam Ryczkowski
3
Agregar la lxc.cap.keep = CAP_MKNODconfiguración a hace un error Simultaneously requested dropping and keeping caps. He comprobado todas las configuraciones añadidas de forma recursiva ( ubuntu.userns.conf, ubuntu.common.confy common.conf) y se encontró sólo una línea con lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Pero eso es irrelevante, ¿no?
Adam Ryczkowski