Por favor, leia esta longa introdução para entender minha preocupação sobre por que precisamos da permissão SUID para o arquivo binário executável.
- Um processo no Linux usa seu EUID para saber o ID de usuário efetivo de si mesmo.
- A permissão deste usuário é usada para decidir como esse processo interage com outros arquivos (por exemplo, se esse processo pode gravar em um arquivo)
Considere o cenário com alteração de senha via/usr/bin/passwd
Linux da vida real
- As senhas são armazenadas em
/etc/shadow
. Este arquivo pertenceroot
com permissão (rw-------
) - Se
$passwd
tiver permissãorwx--x--x
, isso significa que apenas o root pode alterar a lógica do programa passwd . - Ao
userA
executar o programa, umpasswd
processo inicia com RUID = EUID = userA
O resultado é: o programa será executado. Um passwd
processo é iniciado, mas não poderá alterar a senha, pois seu EUID é userA e userA não pode gravar em /etc/shadow
.
É quando chega a necessidade de permissão SUID . O SUID permite definir o EUID de um processo na execução de um binário para criar esse processo. o EUID será definido para o proprietário desse arquivo binário.
- Definir a permissão SUID para o proprietário de
/usr/bin/passwd
torna EUID de qualquerpasswd
processo iniciado por qualquer usuário leva o EUID deroot
- Como
root
pode escrever em/etc/shadow
, qualquer usuário pode usar opasswd
programa para iniciar umpasswd
processo que pode fazer alterações em/etc/shadow
Há permissão SUID porque no Linux, o EUID de um processo não é definido como o proprietário do arquivo binário executável (que, quando executado, criará esse processo)
Meu Linux ideal
Não há necessidade de permissão SUID . Se o arquivo executável binA for criado (e de propriedade) por userA , qualquer usuário que possa executar binA criará um processo com EUID = userA .
No contexto do cenário de mudança de senha, a lógica dessa ideia é a seguinte:
- root é o proprietário
/usr/bin/passwd
e somente root pode alterar sua lógica. - A lógica interna
/usr/bin/passwd
permite que um usuário altere apenas sua senha e não a de outros. - Outros usuários não podem modificar
/usr/bin/passwd
, apenas o root pode. /etc/shadow
só pode ser escrito porroot
O resultado é: um usuário sem privilégios userA
pode executar $passwd
. Ele vai criar um passwd
processo . Este processo tem EUID = root para que possa gravar no shadow
arquivo.
Com esta teoria, podemos alcançar: todos podem alterar sua própria senha (e apenas sua própria senha) sem permissão SUID .
Ambos os seus exemplos explicam como funciona o setuid. No entanto, em seu "Linux ideal", cada executável começaria com EUID do proprietário do executável, o que tornaria cada executável em seu sistema um executável setuid.
Isso claramente causaria muitos problemas, para mencionar alguns: todo executável de propriedade de root precisaria fazer verificações de UID e chamar
setuid()
para definir o EUID do processo de volta para não-raiz se o programa não devesse ter nenhum privilégio adicional; os usuários não podem disponibilizar executáveis para outros usuários, pois o processo seria executado com EUID errado; erros de configuração e más práticas teriam consequências críticas (comochmod 777
agora também permitiria o acesso a quaisquer arquivos de propriedade do usuário). E estes são mais.Permissões normais sem binários setuid precisam de algum outro mecanismo para permitir que usuários sem privilégios façam operações privilegiadas. Os binários setuid permitem tal elevação de privilégios e o controle de acesso é implementado na lógica do programa.
A resposta marcada respondeu perfeitamente à minha pergunta. O que coloco aqui é a lógica extra que me é útil para explicar a existência da permissão SUID em relação ao cenário de alteração de senha.
No Linux, os arquivos bin executáveis devem ser executados por diferentes usuários.
Embora muitos usuários possam usar o mesmo arquivo bin, o processo iniciado por esse arquivo bin deve ter permissões diferentes em um arquivo.
No Linux, cada processo tem o RUID . O RUID é o id do usuário que inicia esse processo. Por essa lógica, o RUID de um processo deve ser o usuário cuja permissão em um arquivo é usada por esse processo (por exemplo, um processo decide o que pode fazer com um arquivo com base no que seu usuário RUID pode fazer com esse arquivo).
No entanto, no caso de alterar a senha, o RUID por si só não é suficiente porque:
/etc/shadow
arquivo não pode ser modificado por ninguém além de root ./usr/bin/passwd
arquivo bin executável. A lógica deste programa garante que um usuário desprivilegiado possa alterar sua e somente sua senha./usr/bin/passwd
, ele iniciará umpasswd
processo cujo RUID é userA ./etc/shadow
, opasswd
processo que ele inicia também não pode gravar nesse arquivo.No Linux, a permissão que um processo tem em um arquivo é obtida da permissão que o EUID tem nesse arquivo.
Com o EUID , o root agora pode usar a permissão SUID para permitir que o usuárioA inicie um
passwd
processo que tenha o EUID definido como root . Isso efetivamente permite que opasswd
processo iniciado pelo usuário A modifique o/etc/shadow
arquivo.