Wie erstelle ich ein / dev / tun-Gerät in einem nicht privilegierten LXC-Container?

10

Diese Frage ähnelt No tun device in lxc guest für openvpn . Der LXC hat sich weiterentwickelt und kürzlich wurden die nicht privilegierten LXC-Container eingeführt, die eine weitere Sicherheitsebene gegen das Brechen des Gefängnisses bieten.

Ich muss einen OpenVPN-Server in einem der nicht privilegierten Container erstellen. Ich weiß nicht, wie ich den Container ein privates Tun-Netzwerkgerät erstellen lassen soll.

Ich habe lxc.cgroup.devices.allow = c 10:200 rwman die angehängt ~/.local/share/lxc/mylxc/config.

Nachdem der Behälter ausgehend, mknod /dev/net/tun c 10 200zurück mknod: '/dev/net/tun': Operation not permittedin den Behälter.

Ich benutze ein Vanilla Ubuntu 14.04 64bit als Host und einen Container erstellt mit

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

Hat es jemand geschafft, das /dev/tunGerät unter nicht privilegiertem LXC zum Laufen zu bringen ?

Adam Ryczkowski
quelle
Um openvpn in einem nicht privilegierten LXC-Container zum Laufen zu bringen, musste ich lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileder Containerkonfigurationsdatei Folgendes hinzufügen : superuser.com/a/1205662/130915 Dann habe ich openvpn als root mit sudo im Container ausgeführt.
Taufe

Antworten:

3

Sie müssen Ihrem Container explizit die CAP_MKNOD- Funktion hinzufügen .

  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.

Sie können auch versuchen, dies zu automatisieren (wenn Sie es zufällig systemdim Container verwenden), indem Sie:

  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.

Dies kann auf ein laufendes Skript verweisen mknod.

Mit dockerdieser ist sehr einfach zu erreichen. Standardmäßig sind Container nicht privilegiert .

In diesem Beispiel ziehe ich einen trustyContainer aus der Registrierung:

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

Und ich starte es im interaktiven Modus und informiere über die Funktionen, die ich im Inneren benötige:

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

Im Gegensatz zu:

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
quelle
1
Ich glaube, was Docker als "nicht privilegiert" bezeichnet, unterscheidet sich erheblich von dem, was es im LXC-Sprachgebrauch bedeutet: github.com/docker/docker/issues/7906 . Es scheint, dass Docker die nicht privilegierten Container immer noch nicht unterstützt. Es macht Ihre Antwort nicht unbedingt ungültig - ich werde es CAP_MKNODnach der Arbeit überprüfen .
Adam Ryczkowski
1
Können Sie mir bitte einen kleinen Hinweis geben, wie Sie die Fähigkeit des nicht privilegierten Containers ändern können? Zumindest eine korrekte Formulierung zu Google?
Adam Ryczkowski
3
Das Hinzufügen der lxc.cap.keep = CAP_MKNODzu config macht einen Fehler Simultaneously requested dropping and keeping caps. Ich habe alle rekursiv hinzugefügten Konfigurationen ( ubuntu.userns.conf, ubuntu.common.confund common.conf) überprüft und nur eine Zeile gefunden mit lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Aber das ist irrelevant, nicht wahr?
Adam Ryczkowski