วิธีการสร้าง / dev / tun อุปกรณ์ภายในตู้คอนเทนเนอร์ LXC ที่ไม่ได้รับสิทธิพิเศษ


10

คำถามนี้จะคล้ายกับไม่มีอุปกรณ์ถังแขก 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ภายในคอนเทนเนอร์

ฉันใช้ vanilla Ubuntu 14.04 64 บิตเป็นโฮสต์และสร้างด้วยคอนเทนเนอร์

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ไฟล์ config ของคอนเทนเนอร์ดังที่อธิบายไว้ที่นี่: 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/issues/7906 ดูเหมือนว่า Docker ยังคงไม่รองรับคอนเทนเนอร์ที่ไม่มีสิทธิใช้งาน ไม่จำเป็นต้องทำให้คำตอบของคุณไม่ถูกต้อง - ฉันจะตรวจสอบCAP_MKNODหลังเลิกงาน
Adam Ryczkowski

1
คุณช่วยชี้หน่อยว่าจะเปลี่ยนความสามารถของภาชนะที่ไม่มีสิทธิได้หรือไม่? อย่างน้อยวลีที่ถูกต้องให้กับ Google?
Adam Ryczkowski

3
การเพิ่มการตั้งค่าที่ทำให้เกิดข้อผิดพลาดlxc.cap.keep = CAP_MKNOD Simultaneously requested dropping and keeping capsฉันจะตรวจสอบ configs เพิ่มซ้ำทั้งหมด ( ubuntu.userns.conf, ubuntu.common.confและcommon.conf) และพบเพียงบรรทัดเดียวกับ:lxc.cap.drop lxc.cap.drop = mac_admin mac_override sys_time sys_moduleแต่นั่นไม่เกี่ยวข้องใช่ไหม?
Adam Ryczkowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.