
Na minha máquina Linux, eu (meu usuário) tenho um grupo principal e vários outros grupos (observe que pertenço ao grupo 150):
$ id -u; id -g; id -G
1000
1000
1000 6 21 91 97 150 190 465 996 1003
Preciso isolar um comando em um namespace de usuário. Eu uso unshare --user
para isso:
$ unshare --user --map-user=4000 --map-group=4000 bash -c 'id -u; id -g; id -G'
4000
4000
4000 65534
(Observe que todos os grupos aos quais eu pertencia são mantidos, mas, como a maioria deles não está mapeada no novo namespace do usuário, eles são substituídos pelo grupo overflow, 65534, "nobody" ou "nogroup". Uma chamada para getgroups
confirma isso por retornar a lista "1000 65534 65534 65534 65534 65534 65534 65534 65534 65534 id
desduplica essa lista.)
Não tenho permissão, como usuário, para mapear qualquer grupo, exceto o grupo efetivo no namespace pai (1000). Mas aqui, preciso usar um dos meus grupos suplementares para executar um executável com privilégios escalonados (observe que /usr/bin/dumpcap
só pode ser executado se alguém estiver no grupo 150, no qual estou no namespace externo):
$ ls -n /usr/bin/dumpcap
-rwxr-xr-- 1 0 150 116928 Jun 7 21:16 /usr/bin/dumpcap
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap cap_dac_override,cap_net_admin,cap_net_raw=eip
Existe uma maneira de fazer com que um grupo no namespace do usuário seja mapeado para um grupo suplementar ao qual pertenço no namespace pai (aqui 150)? —Sem CAP_SETGID
, claro, seria muito fácil. ;-)