Jak stworzyć / dev / tun urządzenie w nieuprzywilejowanym kontenerze LXC?

10

To pytanie jest podobne do No tun device w lxc guest dla openvpn . LXC ewoluował i niedawno wprowadzono nieuprzywilejowane kontenery LXC, które oferują kolejną warstwę zabezpieczenia przed złamaniem więzienia.

Muszę utworzyć serwer OpenVPN w jednym z nieuprzywilejowanych kontenerów. Nie wiem, jak pozwolić kontenerowi utworzyć prywatne urządzenie sieciowe tun.

Dołączyłem lxc.cgroup.devices.allow = c 10:200 rwmdo ~/.local/share/lxc/mylxc/config.

Po uruchomieniu kontenera mknod /dev/net/tun c 10 200wraca mknod: '/dev/net/tun': Operation not permitteddo kontenera.

Używam waniliowego Ubuntu 14.04 64bit jako hosta i kontenera utworzonego za pomocą

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

Czy ktoś zdołał /dev/tunuruchomić urządzenie pod nieuprzywilejowanym systemem LXC?

Adam Ryczkowski
źródło
Aby uzyskać informacje, aby openvpn działał w nieuprzywilejowanym kontenerze LXC, musiałem dodać lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=filedo pliku konfiguracyjnego kontenera, jak opisano tutaj: superuser.com/a/1205662/130915 Następnie uruchomiłem openvpn jako root z sudo wewnątrz kontenera.
baptx

Odpowiedzi:

3

Musisz jawnie dodać możliwość CAP_MKNOD do swojego kontenera .

  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.

Możesz także spróbować zautomatyzować to (jeśli zdarzy ci się używać systemdwewnątrz kontenera), używając:

  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.

co może wskazywać na uruchomiony skrypt mknod.

Korzystanie z dockertego jest bardzo łatwe do osiągnięcia. Domyślnie kontenery są nieuprzywilejowane .

W tym przykładzie wyciągam trustykontener z rejestru:

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

I zaczynam w trybie interaktywnym, informując o możliwościach, których potrzebuję w środku:

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

W przeciwieństwie do:

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
źródło
1
Uważam, że to, co doker nazywa „nieuprzywilejowanym”, różni się od tego, co oznacza w języku LXC : github.com/docker/docker/issues/7906 . Wygląda na to, że Docker nadal nie obsługuje nieuprzywilejowanych kontenerów. To niekoniecznie unieważnia twoją odpowiedź - sprawdzę CAP_MKNODpo pracy.
Adam Ryczkowski
1
Czy możesz mi podać trochę wskazówek, jak zmienić możliwości nieuprzywilejowanego kontenera? Przynajmniej poprawne zdanie do Google?
Adam Ryczkowski
3
Dodanie lxc.cap.keep = CAP_MKNODdo konfiguracji powoduje błąd Simultaneously requested dropping and keeping caps. Sprawdziłem wszystkie rekursywnie dodanych configs ( ubuntu.userns.conf, ubuntu.common.confi common.conf) i znalazł tylko jedną linię z lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Ale to nie ma znaczenia, prawda?
Adam Ryczkowski