Alguém pode, por favor, explicar o mecanismo set-user-ID no Unix? Qual foi a lógica por trás dessa decisão de design? Como é diferente do mecanismo de identificação do usuário eficaz?
Alguém pode, por favor, explicar o mecanismo set-user-ID no Unix? Qual foi a lógica por trás dessa decisão de design? Como é diferente do mecanismo de identificação do usuário eficaz?
Você pode conhecer as permissões normais de leitura, gravação e execução de arquivos em unix.
No entanto, em muitos aplicativos, esse tipo de estrutura de permissão - por exemplo, conceder a um determinado usuário permissão total para ler um determinado arquivo ou nenhuma permissão para ler o arquivo - é muito grosseiro. Por esse motivo, o Unix inclui outro bit de permissão, o set-user-ID
bit. Se esse bit estiver definido para um arquivo executável, sempre que um usuário que não seja o proprietário executa o arquivo, ele adquire todos os privilégios de leitura / gravação / execução do arquivo ao acessar qualquer um dos outros arquivos do proprietário!
Para definir o bit set-user-ID para um arquivo, digite
chmod u+s filename
Certifique-se de ter definido também a permissão de execução de outro grupo; seria bom ter permissão de leitura para outros grupos também. Tudo isso pode ser feito com a única declaração
chmod 4755 filename
Também é conhecido como UID salvo. Um arquivo iniciado com um bit Set-UID ativado, o UID salvo será o UID do proprietário do arquivo. Caso contrário, o UID salvo será o UID Real.
Esse UID é usado para avaliar os privilégios do processo para executar uma ação específica. O EUID pode ser alterado para Real UID ou Superuser UID, se EUID! = 0. Se EUID = 0, pode ser alterado para qualquer coisa.
Um exemplo desse programa é passwd
. Se você listá-lo na íntegra, verá que possui o bit Set-UID e o proprietário é "root". Quando um usuário normal, digamos "mtk", é executado passwd
, ele começa com:
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
man credentials
é uma boa fonte de informação neste caso. Veja também esta pergunta no SO . Para explicação histórica, consulte este post arquivado .
Em vez de chamar "definir UID" e "UID efetivo" como um mecanismo, todo o conceito de UIDs deve ser chamado assim. A lógica da existência dos vários UIDs são vários problemas com a separação de privilégios. Mesmo usuários regulares (sem privilégios) às vezes precisam fazer coisas (acessar recursos) que somente usuários privilegiados podem. Para conseguir isso facilmente, os programas podem alterar seus UIDs. Existem 3 tipos destes:
UID real - o UID que possui um processo
UID efetivo - o UID em que um processo é executado atualmente - determina as capacidades reais do processo a qualquer momento específico. Também é isso que ps
mostra o campo USER.
UID do conjunto salvo - espaço reservado usado para alternar entre UIDs reais e efetivos
A necessidade do último surge do fato de que os usuários comuns só podem alternar entre esses três e nada mais e um programa setuid geralmente precisa saber de alguma forma, quem foi o usuário que o carregou (além do UID real, não deve ser alterado, pois isso criaria confusão ainda maior).
a exaltação do mtk é boa.
O passwd
exemplo é de escalonamento de privilégios - o passwd sempre é executado como root, pois deve alterar arquivos que apenas o root pode alterar. Isso torna importante que o executável passwd não seja propenso a estouros de buffer, etc., de modo que um usuário normal inteligente possa usá-lo para usos para os quais não se destina.
Outra justificativa é proteger o usuário da mesma maneira que você pode usar su
se estiver logado como root - para diminuir ou restringir seus privilégios para tarefas específicas, não escaloná-los. Por exemplo, se eu tiver permissão para iniciar um serviço daemon que não exija acesso às minhas coisas e tenha suas próprias coisas, o que é tudo o que precisa (por exemplo, um criador de logs), executá-lo suid significará que ele só terá acesso a essas coisas e não o meu ou qualquer outro.
Observe que é possível definir o uid programaticamente, mesmo se o bit suid não estiver definido no executável , no entanto, isso não funcionará para escalação. Ou seja, se você é um usuário normal e escreve um programa que define o uid em algum momento, esse programa não pode mudar para o root. Apache funciona assim, acredito. Geralmente é iniciado pelo root e possui um processo que bifurca os filhos que alternam o uid para um usuário não privado (por exemplo, "httpd"). Esses processos filhos são o que o servidor da Web real funciona.