web-dev-qa-db-ja.com

OverlayFSは、特権のないユーザー名前空間では機能しません

OverlayFSマウントは、非特権ユーザー名前空間内からアクセスすると奇妙に機能します。例で説明するのが最適です:

~# uname -a
Linux Host 4.1.0-1-AMD64 #1 SMP Debian 4.1.3-1 (2015-08-03) x86_64 GNU/Linux
~# runuser - test -c id
uid=2000(test) gid=2000(test) groups=2000(test)
~# cat /etc/subuid /etc/subgid | grep test
test:200000:65536
test:200000:65536
~# cd ~test
/home/test# mkdir -p upper/test1 lower/test2 target target.work
/home/test# chown -R test:test upper lower target target.work
/home/test# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
/home/test# mount | grep test
overlay on /home/test/target type overlay (rw,relatime,lowerdir=lower,upperdir=upper,workdir=target.work)

オーバーレイがマウントされ、期待どおりに機能します。

/home/test# runuser - test
~$ cd target
~/target$ ls -l
total 8
drwxr-xr-x 2 test test 4096 Sep 15 13:50 test1
drwxr-xr-x 2 test test 4096 Sep 15 13:50 test2
~/target$ mkdir test3
~/target$ mkdir test2/test2-3
~/target$ mkdir test1/test1-3

特権のないユーザー名前空間を今すぐ試してみましょう

~/target$ ^D
/home/test/target# cd ..
/home/test# umount target
/home/test# rm -rf upper lower target target.work
/home/test# mkdir -p upper/test1 lower/test2 target target.work
/home/test# chown -R 200000:200000 upper lower target target.work
/home/test# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
/home/test# mount | grep test
overlay on /home/test/target type overlay (rw,relatime,lowerdir=lower,upperdir=upper,workdir=target.work)

特権のない名前空間が許可されていることを確認してください。

/home/test# sysctl -w kernel.unprivileged_userns_clone=1

さて、それを試してみましょう:

/home/test# runuser - test
~$ lxc-usernsexec -m u:0:200000:65536 -m g:0:200000:65536 -m u:65536:2000:1 -m g:65536:2000:1 -- /bin/bash
~# cd target
~/target# ls -l
total 8
drwxr-xr-x 2 root root 4096 Sep 15 13:57 test1
drwxr-xr-x 2 root root 4096 Sep 15 13:57 test2

ここまでは順調ですね。

~/target# mkdir test3
~/target# mkdir test2/test2-3
~/target# mkdir test1/test1-3
mkdir: cannot create directory 'test1/test1-3': Permission denied

そして、これはそれが壊れるところです。 Aufsは同じシナリオで正常に動作します(debian 4.1カーネルがaufsをサポートしなくなったことを除いて)。

それを機能させる方法はありますか?

3

これは、マウントのtarget.work/workがルートに属しているためだと思います。マウント後にそのディレクトリをchownしてみてください。ただし、より単純な再現の場合は、下にあるdirが必要ですが、上にはありません。

# from user
mkdir -p upper lower/test2 target target.work
# from root
mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
# from user again
unshare -Ur touch target/test2/1

マウント後にchown user:user target.work/workを挿入すると、すべて問題なく動作します。これをoverlayfsのバグまたは機能と見なすべきかどうかわからない:)

0
LK4D4

あなたが気づいたかどうかはわかりませんが、2番目のマウントが正しくありません:

-m g:0:2000000:65536-m g:0:200000:65536である必要があります。コマンドには追加の0があります。

私はあなたの手順に従いましたが、エラーは見つかりませんでした。

root@clone-newuser:/home/test# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
root@clone-newuser:/home/test# runuser - test
test@clone-newuser:~$ lxc-usernsexec -m u:0:100000:65536 -m g:0:100000:65536 -m u:65536:1000:1 -m g:65536:1000:1 -- /bin/bash
root@clone-newuser:~# ls
lower  target  target.work  upper
root@clone-newuser:~# cd target
root@clone-newuser:~/target# ls
test1  test2
root@clone-newuser:~/target# mkdir test3
root@clone-newuser:~/target# mkdir test2/test2-3
root@clone-newuser:~/target# mkdir test1/test1-3
root@clone-newuser:~/target#

ただし、少し新しいカーネルを使用しています。

root@clone-newuser:/home/test# uname -srm
Linux 4.1.7-040107-generic x86_64

これがあなたに役立つかどうかは本当にわかりません。

1
David Calavera