Um processo é executado com um uid ang um gid. Ambos têm permissões atribuídas a eles. Você poderia chamar o chroot com um userspec de um usuário e grupo, onde, na verdade, o usuário não está nesse grupo. O processo seria então executado com os usuários uid e os grupos fornecidos gid.
Veja um exemplo. Eu tenho um usuário chamado user
e ele está no grupo student
:
root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)
Eu tenho um arquivo da seguinte forma:
root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file
Ele não pode lê-lo:
user@host:~$ cat file
cat: file: Permission denied
Agora, posso execte o processo cat
no contexto do usuário user
AND do grupo root
. Agora, o processo do gato tem as permissões necessárias:
root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents
É interessante ver o que id
diz:
root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)
Hm, mas o usuário user
não está nesse grupo ( root
). De onde id
obtém suas informações? Se chamado sem argumento, id
usa as chamadas do sistema, getuid()
, getgid()
e getgroups()
. Portanto, o contexto do processo de id
é impresso. Esse contexto nós alteramos com --userspec
.
Quando chamado com um argumento, id
apenas determina as atribuições de grupo do usuário:
root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)
Para sua pergunta:
What is special about running a process with a specific user/group combo that prevents the process being able to access files owned by supplementary groups of that user and is there any way around this?
Você pode definir o contexto do processo de segurança necessário para resolver qualquer tarefa que o processo precise fazer. Todo processo tem um conjunto uid e gid sob o qual ele é executado. Normalmente, o processo "pega" os usuários chamadores como seu contexto. Com "takes", o kernel faz, caso contrário, seria um problema de segurança.
Portanto, na verdade não é o usuário, que não tem permissões para ler o arquivo, é a permissão do processo ( cat
). Mas o processo é executado com o uid / gid do usuário chamador.
Assim, você não precisa estar em um grupo específico para executar um processo com seu uid e o gid desse grupo.