非特権LXCコンテナ内に/ dev / tunデバイスを作成するにはどうすればよいですか?


10

この質問は、openvpnのlxcゲストのtunデバイスなしに似ています。LXCは進化しており、刑務所の破壊に対する別のセキュリティ層を提供する非特権LXCコンテナが最近導入されました。

非特権コンテナーの1つの中に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 64ビットを使用し、コンテナは

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

/dev/tun特権のないLXCの下でデバイスを実行できた人はいますか?


詳細については、非特権LXCコンテナ内のopenvpnの仕事をするために、私は追加する必要がありましたlxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file:ここで説明するように、コンテナの設定ファイルにsuperuser.com/a/1205662/130915その後、私は、コンテナの内部にsudoでrootとしてOpenVPNを走りました。
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
dockerが「非特権」と呼ぶものは、LXC用語での意味とはかなり異なります:github.com/docker/docker/issues/7906。Dockerは非特権コンテナをまだサポートしていないようです。必ずしも回答が無効になるわけではありません- CAP_MKNOD仕事の後で確認します。
Adam Ryczkowski、2015

1
非特権コンテナの機能を変更する方法について少し教えてください。少なくともGoogleにとって正しいフレーズですか?
Adam Ryczkowski、2015

3
lxc.cap.keep = CAP_MKNOD設定にを追加するとエラーになりますSimultaneously requested dropping and keeping caps。再帰的に追加されたすべての構成(ubuntu.userns.confubuntu.common.confおよびcommon.conf)を確認したところ、lxc.cap.drop次の行が1つだけ見つかりましたlxc.cap.drop = mac_admin mac_override sys_time sys_module。しかし、それは無関係ではありませんか?
Adam Ryczkowski、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.