OverlayFS não funciona com namespace de usuário não privilegiado

3

A montagem do OverlayFS funciona de forma estranha quando acessada a partir do namespace do usuário não privilegiado. Melhor ser explicado no exemplo:

~# 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)

A sobreposição é montada e funciona conforme o esperado:

/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

Vamos tentar o namespace de usuário sem privilégios agora

~/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)

Verifique se os namespaces sem privilégios são permitidos:

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

Ok, vamos tentar:

/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

Até aí tudo bem.

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

E é aí que ele é quebrado. Aufs funciona bem no mesmo cenário (exceto que o kernel debian 4.1 não suporta mais aufs).

Existe alguma maneira de fazê-lo funcionar?

    
por Alexey Naidyonov 15.09.2015 / 13:08

2 respostas

0

Acho que isso ocorre porque target.work/work on mount pertence ao root. Você poderia tentar chown que dir depois de montar? No entanto eu encontrei caso de reprodução mais simples, só precisamos de dir que está em baixo, mas não no superior:

# 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

Se eu inserir chown user:user target.work/work depois da montagem, tudo funciona bem. Não tenho certeza se devemos pensar sobre isso como bug ou recurso do overlayfs:)

    
por 22.09.2015 / 17:58
1

Não sei se você percebeu, mas sua segunda montagem está incorreta:

-m g:0:2000000:65536 deve ser -m g:0:200000:65536 . Seu comando tem um 0 extra.

Eu segui seus passos e não encontrei nenhum erro:

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#

Estou usando um kernel um pouco mais novo:

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

Eu realmente não sei se isso ajuda você.

    
por 21.09.2015 / 02:58