Como as permissões do Linux funcionam quando um processo está sendo executado como um grupo específico?

12

Isso é algo que eu não consegui encontrar muita informação, então qualquer ajuda seria apreciada.

Meu entendimento é assim. Pegue o seguinte arquivo:

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

O usuário philnão pode acessar este arquivo:

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

Se philfor adicionado ao admgrupo, ele pode:

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014

Se, no entanto, um processo é iniciado enquanto definindo explicitamente o user:groupque phil:philele não pode ler o arquivo. Processo iniciado assim:

nice -n 19 chroot --userspec phil:phil / sh -c "process"

Se o processo for iniciado como phil:adm, ele poderá ler o arquivo:

nice -n 19 chroot --userspec phil:adm / sh -c "process"

Então a questão é realmente:

O que há de especial na execução de um processo com uma combinação específica de usuário / grupo que impede o processo de acessar arquivos pertencentes a grupos suplementares desse usuário e existe alguma maneira de contornar isso?

phil-lavin
fonte
Observe que o shell não tem nada a ver com isso: as permissões não são processadas pelo shell. Se eles onde você pode ganhar raiz, escrevendo um novo shell.
Ctrl-alt-delor

Respostas:

9

Um processo é executado com um uid ang a gid. Ambos têm permissões atribuídas a eles. Você pode chamar chroot com uma especificação de usuário de um usuário e grupo, onde na verdade o usuário não está nesse grupo. O processo seria executado com os usuários uid e os grupos fornecidos gid.

Veja um exemplo. Eu tenho um usuário chamado usere ele está no grupo student:

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

Eu tenho um arquivo da seguinte maneira:

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

Ele não pode ler:

user@host:~$ cat file
cat: file: Permission denied 

Agora, eu posso executar o catprocesso no contexto do usuário userE 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 iddiz:

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)

Hum, mas o usuário usernão está nesse grupo ( root). De onde idobtém suas informações? Se chamado sem argumento, idusa as chamadas do sistema, getuid(), getgid()e getgroups(). Portanto, o idpróprio contexto do processo é impresso. Esse contexto com o qual alteramos --userspec.

Quando chamado com um argumento, idapenas 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:

O que há de especial na execução de um processo com uma combinação específica de usuário / grupo que impede o processo de acessar arquivos pertencentes a grupos suplementares desse usuário e existe alguma maneira de contornar isso?

Você pode definir o contexto do processo de segurança necessário para resolver qualquer tarefa que o processo precise executar. Todo processo tem um conjunto uid e gid sob o qual ele é executado. Normalmente, o processo "considera" os usuários que chamam uid e gid como seu contexto. Com "takes", quero dizer que o kernel faz, caso contrário, seria um problema de segurança.

Então, na verdade, não é o usuário, que não tem permissão para ler o arquivo, são as permissões do processo ( cat). Mas o processo é executado com o uid / gid do usuário que está chamando.

Portanto, você não precisa estar em um grupo específico para que um processo seja executado com seu uid e o gid desse grupo.

caos
fonte
2
Um processo normalmente possui apenas as credenciais do grupo principal. Ele pode obter acesso às credenciais dos grupos secundários dos quais EUIDfaz parte chamando initgroups(3). No entanto, initgroups(3)é uma operação relativamente cara, pois precisa enumerar todos os grupos. Por esse motivo, os processos chamam apenas initgroups(3)se tiverem um motivo específico para fazê-lo.
lcd047
6

Usar a --userspecopção on chrootespecifica o usuário e um único grupo para usar ao executar o chroot. Para definir grupos suplementares, você precisa usar a --groupsopção também.

Por padrão, os processos herdam os grupos primário e suplementar do usuário que os executa, mas, ao usar, --userspecvocê está dizendo chmodpara substituir isso usando o grupo único especificado.

A documentação detalhada das permissões no Linux está disponível na página de credentials(7)manual.

Stephen Kitt
fonte
2

Quando você faz login no Linux, o processo de login login - após verificar se você pode fazer login como phil - obtém o uid de phil e os grupos aos quais ele pertence, definindo-os como um processo que é iniciado como seu shell. Os grupos uid, gid e suplementares são uma propriedade do processo.

Qualquer programa posterior iniciado depois disso é descendente desse shell e simplesmente recebe uma cópia dessas credenciais. * Isso explica por que a alteração dos direitos do usuário não afeta os processos em execução. As alterações serão captadas no próximo login, no entanto.

* A exceção são os programas cujos bits setuid ou setgid estão definidos, que terão um ID de usuário efetivo diferente . Isso é usado, por exemplo, no su (1) para que ele possa ser executado com rootprivilégios mesmo quando executado por phil.

Depois que você adiciona philao admgrupo, ele pode executar su phile executar , sucomo root, verificar se ele realmente fornece a senha de phil e colocá-lo em um shell com os grupos uid, gid e suplementares aos quais pertence. E, como isso é feito após adicionar o usuário ao grupo, esse shell já estaria no admgrupo.

Não considero o chroot (1) o programa mais adequado para rodar como um usuário diferente , mas certamente faz o trabalho. O parâmetro --userspec phil:philfaz com que seja executado com o uid de phile o gid de phil. Nenhum grupo adicional está definido (para o que você forneceria --groups). Assim, o processo infantil não está no admgrupo.

Uma maneira mais normal de executar seu processo como phil seria su phil -c "process". Ao sucarregar os grupos uid, gid e suplementar das informações do banco de dados do usuário, processterão as mesmas credenciais que o usuário possui atualmente.

¹ Pode ser o login (1) , sshd, su, gdb ou outros programas. Além disso, provavelmente está sendo gerenciado através de módulos pam.

Anjo
fonte