Как создать устройство / dev / tun внутри непривилегированного контейнера LXC?

10

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

Мне нужно создать сервер OpenVPN внутри одного непривилегированного контейнера. Я не знаю, как позволить контейнеру создать частное сетевое устройство tun.

Я добавляю 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 как root с 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/issues/7906 . Кажется, что Docker до сих пор не поддерживает непривилегированные контейнеры. Это не обязательно лишит законной силы ваш ответ - я проверю 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. Но это не имеет значения, не так ли?
Адам Рычковски,