Làm cách nào để tạo / dev / tun thiết bị bên trong container LXC không có đặc quyền?


10

Câu hỏi này tương tự như Không có thiết bị điều chỉnh trong lxc khách cho openvpn . LXC đã phát triển và các container LXC không được ưu tiên đã được giới thiệu gần đây cung cấp một lớp bảo mật khác chống lại việc phá vỡ nhà tù.

Tôi cần tạo một máy chủ OpenVPN bên trong một trong những container không có đặc quyền. Tôi không biết làm thế nào để cho container tạo một thiết bị mạng riêng.

Tôi đã nối lxc.cgroup.devices.allow = c 10:200 rwmvào ~/.local/share/lxc/mylxc/config.

Sau khi khởi động container, mknod /dev/net/tun c 10 200trở lại mknod: '/dev/net/tun': Operation not permittedbên trong container.

Tôi sử dụng vanilla Ubuntu 14.04 64bit làm máy chủ lưu trữ và bộ chứa được tạo bằng

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

Có ai quản lý để có được /dev/tunthiết bị chạy dưới LXC không có đặc quyền?


Để biết thông tin, để làm cho openvpn hoạt động trong một thùng chứa LXC không có đặc quyền, tôi đã phải thêm lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=filevào tệp cấu hình vùng chứa, như được mô tả ở đây: superuser.com/a/1205662/130915 Sau đó, tôi chạy openvpn với quyền root với sudo bên trong container.
baptx

Câu trả lời:


3

Bạn cần thêm rõ ràng khả năng CAP_MKNOD vào thùng chứa của mình .

  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.

Bạn cũng có thể thử tự động hóa việc này (nếu bạn tình cờ sử dụng systemdbên trong container) bằng cách sử dụng:

  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.

có thể trỏ đến một kịch bản đang chạy mknod.

Sử dụng dockerđiều này là rất dễ dàng để thực hiện. Theo mặc định, các container không được ưu tiên .

Trong ví dụ này, tôi đang lấy một trustycontainer từ sổ đăng ký:

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

Và tôi đang bắt đầu nó trong chế độ tương tác thông báo về khả năng tôi cần bên trong:

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

Như trái ngược với:

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
Tôi tin rằng, cái mà docker gọi là "không có đặc quyền" hoàn toàn khác với ý nghĩa của nó theo cách nói của LXC: github.com/docker/docker/issues/7906 . Có vẻ như Docker vẫn không hỗ trợ các container không có đặc quyền. Nó không nhất thiết làm mất hiệu lực câu trả lời của bạn - Tôi sẽ kiểm tra CAP_MKNODsau khi làm việc.
Adam Ryczkowski

1
Bạn có thể cho tôi xin một con trỏ nhỏ về cách thay đổi khả năng của container không có đặc quyền không? Ít nhất là một cụm từ chính xác cho Google?
Adam Ryczkowski

3
Thêm lxc.cap.keep = CAP_MKNODvào cấu hình làm cho lỗi Simultaneously requested dropping and keeping caps. Tôi đã kiểm tra tất cả các configs đệ quy thêm ( ubuntu.userns.conf, ubuntu.common.confcommon.conf) và nhận thấy chỉ có một phù hợp với lxc.cap.drop: lxc.cap.drop = mac_admin mac_override sys_time sys_module. Nhưng điều đó không liên quan phải không?
Adam Ryczkowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.