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 phil
não pode acessar este arquivo:
phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied
Se phil
for adicionado ao adm
grupo, 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:group
que phil:phil
ele 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?
Respostas:
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
user
e ele está no grupostudent
:Eu tenho um arquivo da seguinte maneira:
Ele não pode ler:
Agora, eu posso executar o
cat
processo no contexto do usuáriouser
E do gruporoot
. Agora, o processo do gato tem as permissões necessárias:É interessante ver o que
id
diz:Hum, mas o usuário
user
não está nesse grupo (root
). De ondeid
obtém suas informações? Se chamado sem argumento,id
usa as chamadas do sistema,getuid()
,getgid()
egetgroups()
. Portanto, oid
próprio contexto do processo é impresso. Esse contexto com o qual alteramos--userspec
.Quando chamado com um argumento,
id
apenas determina as atribuições de grupo do usuário:Para sua pergunta:
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.
fonte
EUID
faz parte chamandoinitgroups(3)
. No entanto,initgroups(3)
é uma operação relativamente cara, pois precisa enumerar todos os grupos. Por esse motivo, os processos chamam apenasinitgroups(3)
se tiverem um motivo específico para fazê-lo.Usar a
--userspec
opção onchroot
especifica o usuário e um único grupo para usar ao executar ochroot
. Para definir grupos suplementares, você precisa usar a--groups
opção também.Por padrão, os processos herdam os grupos primário e suplementar do usuário que os executa, mas, ao usar,
--userspec
você está dizendochmod
para 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.fonte
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
root
privilégios mesmo quando executado porphil
.Depois que você adiciona
phil
aoadm
grupo, ele pode executarsu phil
e executar ,su
como 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 noadm
grupo.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:phil
faz com que seja executado com o uid dephil
e o gid dephil
. Nenhum grupo adicional está definido (para o que você forneceria--groups
). Assim, o processo infantil não está noadm
grupo.Uma maneira mais normal de executar seu processo como phil seria
su phil -c "process"
. Aosu
carregar os grupos uid, gid e suplementar das informações do banco de dados do usuário,process
terã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.
fonte