Bagaimana cara membuat / dev / tun device di dalam wadah LXC yang tidak terjangkau?

10

Pertanyaan ini mirip dengan Tidak ada perangkat tun di tamu lxc untuk openvpn . LXC telah berevolusi dan kontainer LXC yang tidak terjangkau diperkenalkan baru-baru ini yang menawarkan lapisan keamanan lain terhadap penghancuran penjara.

Saya perlu membuat server OpenVPN di dalam salah satu wadah yang tidak terjangkau. Saya tidak tahu bagaimana cara membiarkan wadah membuat perangkat jaringan tun pribadi.

Saya menambahkan lxc.cgroup.devices.allow = c 10:200 rwmke ~/.local/share/lxc/mylxc/config.

Setelah memulai wadah, mknod /dev/net/tun c 10 200kembali mknod: '/dev/net/tun': Operation not permittedke dalam wadah.

Saya menggunakan vanilla Ubuntu 14.04 64bit sebagai tuan rumah dan wadah dibuat dengan

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

Adakah yang berhasil /dev/tunmenjalankan perangkat di bawah LXC yang tidak terjangkau?

Adam Ryczkowski
sumber
Sebagai informasi, untuk membuat openvpn berfungsi dalam wadah LXC yang tidak terjangkau, saya harus menambahkan lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileke file konfigurasi wadah, seperti dijelaskan di sini: superuser.com/a/1205662/130915 Kemudian, saya menjalankan openvpn sebagai root dengan sudo di dalam wadah.
baptx

Jawaban:

3

Anda perlu menambahkan kemampuan CAP_MKNOD ke wadah Anda secara eksplisit .

  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.

Anda juga dapat mencoba mengotomatiskan ini (jika Anda kebetulan menggunakan systemddi dalam wadah) menggunakan:

  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.

yang dapat menunjuk ke skrip berjalan mknod.

Menggunakan dockerini sangat mudah dilakukan. Secara default, kontainer tidak terjangkau .

Dalam contoh ini, saya menarik trustywadah dari registri:

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

Dan saya memulainya dalam mode interaktif menginformasikan tentang kemampuan yang saya butuhkan di dalam:

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

Sebagai lawan:

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
sumber
1
Saya percaya, apa yang buruh pelabuhan sebut "tidakrivileg" sangat berbeda dari apa artinya dalam bahasa LXC: github.com/docker/docker/issues/7906 . Tampaknya Docker masih tidak mendukung kontainer yang tidak memiliki hak. Itu tidak selalu membatalkan jawaban Anda - saya akan memeriksa CAP_MKNODsetelah bekerja.
Adam Ryczkowski
1
Bisakah Anda memberi saya sedikit petunjuk tentang cara mengubah kemampuan wadah yang tidak memiliki hak? Setidaknya frasa yang benar untuk Google?
Adam Ryczkowski
3
Menambahkan lxc.cap.keep = CAP_MKNODke konfigurasi membuat kesalahan Simultaneously requested dropping and keeping caps. Aku memeriksa semua konfigurasi rekursif menambahkan ( ubuntu.userns.conf, ubuntu.common.confdan common.conf) dan menemukan hanya satu baris dengan lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Tapi itu tidak relevan bukan?
Adam Ryczkowski