Ayrıcalıksız LXC kapsayıcısında / dev / tun cihazı nasıl oluşturulur?


10

Bu soru openvpn için lxc misafirinde ayar cihazı yok . LXC gelişti ve son zamanlarda hapishanenin kırılmasına karşı başka bir güvenlik katmanı sunan ayrıcalıksız LXC kapları piyasaya sürüldü.

Ayrıcalıksız kapsayıcılardan birinin içinde bir OpenVPN sunucusu oluşturmam gerekiyor. Konteynerin özel bir tun ağ cihazı oluşturmasına nasıl izin vereceğimi bilmiyorum.

Ben ekleme yaptım lxc.cgroup.devices.allow = c 10:200 rwmetmek ~/.local/share/lxc/mylxc/config.

Kabı başlattıktan sonra kabın içine mknod /dev/net/tun c 10 200geri döner mknod: '/dev/net/tun': Operation not permitted.

Ana bilgisayar olarak bir vanilya Ubuntu 14.04 64bit ve ile oluşturulan bir kap kullanıyorum

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

Herkes /dev/tunayrıcalıksız LXC altında cihaz çalıştırmak başardı mı?


Bilgi için, openvpn'in ayrıcalıksız bir LXC kapsayıcısında çalışmasını sağlamak lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileiçin, kap konfigürasyonuna burada açıklandığı gibi eklemek zorunda kaldım : superuser.com/a/1205662/130915 Sonra, openvpn'i sudo'nun kap içinde sudo ile çalıştırdım.
baptx

Yanıtlar:


3

Açıkça CAP_MKNOD eklemem gerekiyor yeteneği sizin için konteyner .

  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.

Ayrıca aşağıdakileri kullanarak bunu otomatikleştirmeyi de deneyebilirsiniz ( systemdkabın içinde kullanırsanız):

  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.

çalışan bir komut dosyasına işaret edebilir mknod.

dockerBunu kullanmak çok kolaydır. Varsayılan olarak, kapsayıcılar ayrıcalıksızdır .

Bu örnekte, bir trustykapsayıcı kayıt defterinden çekiyorum :

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

Ve içinde ihtiyaç duyduğum yetenek hakkında bilgi veren etkileşimli modda başlıyorum:

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

Aksine:

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
Docker'ın "ayrıcalıksız" olarak adlandırdığı şeyin LXC ifadesinde ne anlama geldiğinden oldukça farklı olduğuna inanıyorum: github.com/docker/docker/issues/7906 . Docker hala ayrıcalıklı kapları desteklemiyor gibi görünüyor. Cevabınızı mutlaka geçersiz kılmaz - CAP_MKNODişten sonra kontrol edeceğim .
Adam Ryczkowski

1
Bana ayrıcalıksız kabın kapasitesinin nasıl değiştirileceğine dair küçük bir işaretçi verebilir misiniz? En azından Google için doğru bir ifade mi?
Adam Ryczkowski

3
To lxc.cap.keep = CAP_MKNODconfig eklemek hata yapar Simultaneously requested dropping and keeping caps. Bütün yinelemeli eklenen yapılandırmalarını kontrol ( ubuntu.userns.conf, ubuntu.common.confve common.conf) ve sadece bir satır bulundu lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Ama bu alakasız değil mi?
Adam Ryczkowski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.