Как создать устройство /dev/tun внутри непривилегированного контейнера LXC?
Этот вопрос аналогичен устройству No tun в гостевой системе 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?
1 ответ
Вам необходимо явно добавить возможность 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