Come creare un dispositivo / dev / tun all'interno di un contenitore LXC senza privilegi?


10

Questa domanda è simile a Nessun dispositivo tun in lxc guest per openvpn . L'LXC si è evoluto e recentemente sono stati introdotti i contenitori LXC non privilegiati che offrono un altro livello di sicurezza contro la rottura del carcere.

Devo creare un server OpenVPN all'interno di uno dei container non privilegiati. Non so come consentire al contenitore di creare un dispositivo di rete tun privato.

Ho aggiunto lxc.cgroup.devices.allow = c 10:200 rwmal ~/.local/share/lxc/mylxc/config.

Dopo aver avviato il contenitore, mknod /dev/net/tun c 10 200ritorna mknod: '/dev/net/tun': Operation not permittedall'interno del contenitore.

Uso un Ubuntu 14.04 64 bit vaniglia come host e un contenitore creato con

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

Qualcuno è riuscito a far /dev/tunfunzionare il dispositivo con LXC senza privilegi?


Per informazioni, per far funzionare openvpn in un contenitore LXC non privilegiato, ho dovuto aggiungere lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileil file di configurazione del contenitore, come descritto qui: superuser.com/a/1205662/130915 Quindi, ho eseguito openvpn come root con sudo all'interno del contenitore.
Baptx,

Risposte:


3

Devi aggiungere esplicitamente la capacità CAP_MKNOD al tuo contenitore .

  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.

Potresti anche provare ad automatizzare questo (se ti capita di usare systemdall'interno del contenitore) 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.

che può puntare a uno script in esecuzione mknod.

L'utilizzo di dockerquesto è molto facile da realizzare. Per impostazione predefinita, i contenitori non sono privilegiati .

In questo esempio, sto estraendo un trustycontenitore dal 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 lo sto avviando in modalità interattiva informando sulle capacità di cui ho bisogno all'interno:

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

Al contrario di:

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

1
Credo che ciò che la docker chiama "senza privilegi" sia molto diverso da ciò che significa in linguaggio LXC: github.com/docker/docker/issues/7906 . Sembra che Docker non supporti ancora i contenitori non privilegiati. Non invalida necessariamente la tua risposta - controllerò CAP_MKNODdopo il lavoro.
Adam Ryczkowski il

1
Potete darmi un piccolo suggerimento su come cambiare la capacità del contenitore senza privilegi? Almeno una frase corretta per Google?
Adam Ryczkowski il

3
L'aggiunta lxc.cap.keep = CAP_MKNODdi config fa errore Simultaneously requested dropping and keeping caps. Ho controllato tutte le configurazioni in modo ricorsivo aggiunto ( ubuntu.userns.conf, ubuntu.common.confe common.conf) ed ho trovato una sola riga con lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Ma questo è irrilevante, vero?
Adam Ryczkowski il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.