कैसे unprivileged LXC कंटेनर के अंदर / देव / ट्यून डिवाइस बनाने के लिए?


10

यह प्रश्न Openvpn के लिए lxc अतिथि में नो ट्यून डिवाइस के समान है । 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आ जाता है।

मैं मेजबान के रूप में एक वेनिला उबंटू 14.04 64 बिट का उपयोग करता हूं और एक कंटेनर बनाया जाता है

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

क्या किसी ने /dev/tunअनपेक्षित एलएक्ससी के तहत डिवाइस चलाने में कामयाबी हासिल की ?


जानकारी के लिए, एक unprivileged LXC कंटेनर में ओपनवीपीएन काम करने के लिए, मुझे lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=fileकंटेनर कॉन्फ़िगर फ़ाइल में जोड़ना होगा, जैसे यहाँ वर्णित है: superuser.com/a/1205662/130915 फिर, मैंने कंटेनर के अंदर sudo के साथ रूट के रूप में openppn चलाया।
बपतिस्मा

जवाबों:


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
मेरा मानना ​​है कि, जो कि "अनप्रीविलाइज्ड" कहता है, एलएक्ससी पार्लियामेंट में इसका अर्थ काफी अलग है: github.com/docker/docker/issues/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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.