Як створити / dev / tun пристрій у непривілейованому контейнері LXC?


10

Це питання схоже на No tun device у lxc guest для openvpn . LXC еволюціонував і нещодавно були представлені непривілейовані контейнери LXC, які пропонують ще один рівень безпеки від зламу в'язниці.

Мені потрібно створити сервер OpenVPN всередині одного з непривілейованих контейнерів. Я не знаю, як дозволити контейнеру створити приватний пристрій мережевої настройки.

Я додав lxc.cgroup.devices.allow = c 10:200 rwmдо ~/.local/share/lxc/mylxc/config.

Після запуску контейнера mknod /dev/net/tun c 10 200повертається mknod: '/dev/net/tun': Operation not permittedвсередину контейнера.

Я використовую ванільний Ubuntu 14.04 64bit як хост і контейнер, створений з

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

Хтось встиг /dev/tunзапустити пристрій, що працює під непривілейованим LXC?


Для інформації, щоб змусити openvpn працювати в непривілейованому контейнері LXC, мені довелося додати lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileфайл конфігурації контейнера, як описано тут: superuser.com/a/1205662/130915 Потім я запустив openvpn як корінь з sudo всередині контейнера.
baptx

Відповіді:


3

Вам потрібно явно додати можливість контейнера CAP_MKNOD до вашого контейнера .

  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.

Ви також можете спробувати автоматизувати це (якщо вам трапляється systemdвсередині контейнера), використовуючи:

  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.

що може вказувати на запущений сценарій mknod.

Використовувати dockerце дуже легко. За замовчуванням, контейнери непривілейованих .

У цьому прикладі я витягую trustyконтейнер з реєстру:

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

І я починаю його в інтерактивному режимі, інформуючи про необхідні мені можливості всередині:

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

На відміну від:

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
Я вважаю, те, що докер називає "непривілейованим", сильно відрізняється від того, що це означає на мові LXC: github.com/docker/docker/isissue/7906 . Здається, що Докер все ще не підтримує непривілейовані контейнери. Це не обов'язково скасовує вашу відповідь - я перевірю CAP_MKNODпісля роботи.
Адам Річковський

1
Чи можете ви дати мені, будь ласка, невеликий вказівник про те, як змінити можливості непривілейованого контейнера? Принаймні правильна фраза Google?
Адам Річковський

3
Додавання lxc.cap.keep = CAP_MKNODконфігурації робить помилку Simultaneously requested dropping and keeping caps. Я перевірив всі рекурсивно додав конфіги ( ubuntu.userns.conf, ubuntu.common.confі common.conf) і знайшов тільки один рядок з lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Але це не має значення, чи не так?
Адам Річковський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.