Como criar um dispositivo / dev / tun dentro de um contêiner LXC sem privilégios?

10

Esta pergunta é semelhante ao No tun device no lxc guest para openvpn . O LXC evoluiu e os contêineres LXC sem privilégios foram introduzidos recentemente, oferecendo outra camada de segurança contra a quebra da prisão.

Preciso criar um servidor OpenVPN dentro de um dos contêineres sem privilégios. Não sei como deixar o contêiner criar um dispositivo de rede tun privado.

Anexei lxc.cgroup.devices.allow = c 10:200 rwmao ~/.local/share/lxc/mylxc/config.

Após iniciar o contêiner, mknod /dev/net/tun c 10 200retorna para mknod: '/dev/net/tun': Operation not permitteddentro do contêiner.

Eu uso um Ubuntu 14.04 64bit de baunilha como host e um contêiner criado com

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

Alguém conseguiu fazer o /dev/tundispositivo rodar sob LXC sem privilégios?

Adam Ryczkowski
fonte
Para obter informações, para fazer o openvpn funcionar em um contêiner LXC sem privilégios, tive que adicionar lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileao arquivo de configuração do contêiner, como descrito aqui: superuser.com/a/1205662/130915 Em seguida, executei o openvpn como root com sudo dentro do contêiner.
baptx 28/01/19

Respostas:

3

Você precisa adicionar explicitamente o recurso CAP_MKNOD ao seu contêiner .

  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.

Você também pode tentar automatizar isso (se você usar systemddentro do contêiner) 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.

o que pode apontar para um script em execução mknod.

Usar dockerisso é muito fácil de realizar. Por padrão, os contêineres não têm privilégios .

Neste exemplo, estou puxando um trustycontêiner do registro:

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

E estou iniciando no modo interativo, informando sobre a capacidade de que preciso 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

Ao contrário de:

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
fonte
1
Acredito que o que o docker chama de "não privilegiado" é bem diferente do que significa no jargão LXC: github.com/docker/docker/issues/7906 . Parece que o Docker ainda não suporta os contêineres sem privilégios. Isso não invalida necessariamente sua resposta - vou verificar CAP_MKNODdepois do trabalho.
Adam Ryczkowski
1
Você pode me dar uma dica sobre como alterar a capacidade do contêiner sem privilégios? Pelo menos uma frase correta para o Google?
Adam Ryczkowski
3
Adicionar a lxc.cap.keep = CAP_MKNODconfiguração comete um erro Simultaneously requested dropping and keeping caps. Eu verifiquei todas as configurações de forma recursiva adicionado ( ubuntu.userns.conf, ubuntu.common.confe common.conf) e encontrou apenas uma linha com lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Mas isso é irrelevante, não é?
Adam Ryczkowski