Eu tenho um processo que é iniciado por um damon em execução como root, agora eu quero "rebaixar" os privilégios desse processo para os do usuário médio. Isso é possível? Se sim, como?
PS: rodando unix em um mac
process
privileges
Samantha Catania
fonte
fonte
setuid()
sozinho não é absolutamente suficiente.sudo tcpdump -Z
usa initgroups (3), setgid (2) e setuid (2) para eliminar os privilégios de root de seu próprio processo.fonte
initgroups
,setgid
,setuid
(Finalmente!) É precisamente o paradigma direito sobre unix, e deve sempre ser seguido. Além disso, uma função responsável "droproot" verifica se seu uid e gid foram realmente configurados, mesmo que todas as três funções principais tenham retornado com êxito.Você pode executar comandos como outros usuários usando
su
:Será executado
COMMAND
com privilégios caiu paraUSER
.Observe que, por padrão,
su
usará o interpretador de shell do usuário de destino para executar o comando. Por outro lado, o comportamento padrão desudo
é tratar o programaCOMMAND
como independente, que é executado no ambiente atual. É claro que esses comportamentos padrão podem ser alterados com várias opções e variáveis de ambiente.fonte
su
que não funcionará se USERNAME não tiver um shell definido (ou/bin/false
) enquanto o sudo funcionar.su
refletirá isso. No entanto, sempre é possível substituir isso usando o-s
switch. Observe que o objetivosu
é imitar o comportamento de um determinado usuário - que normalmente é influenciado por seu shell. Por outro lado,sudo
(por padrão) ignoraria a configuração de shell do usuário de destino.Para eliminar privilégios, você precisa de um usuário não raiz para o qual. Então é apenas uma questão de mudar para esse usuário:
Observe que isso é feito dentro do próprio programa , e não em um script de wrapper. Muitos programas requerem privilégios de root para algum propósito específico (por exemplo, para vincular a uma porta de número baixo), mas não precisam de root depois disso. Portanto, esses programas serão iniciados como root, mas eliminarão os privilégios quando não forem mais necessários.
Se você não precisa de privilégios de root, simplesmente não o execute como root. Por exemplo:
fonte
setuid
função define apenas o UID efetivo , não o UID real. Você deve usarsetreuid
se não quiser que o processo recupere os privilégios. (E o código acima não lida com privilégios suplementares grupo quer É adequado apenas para lançar código principalmente confiável..)setuid()
define userids reais e salvos; você pode estar pensandoseteuid()
. Nem todos os sistemas possuemsetreuid()
, portanto, ele não pode ser usado em qualquer lugar. A semântica exata desetuid()
é complicada, mas se você tiver o euid 0, poderá eliminar todos os privilégios de identificação de usuário tradicionaissetuid()
. A maior omissão nesta resposta é queinitgroups
ousetgroups
deve ser chamada assim comosetgid
esetuid
, e que afirmações mais completas devem ser feitas no final.Se você estiver executando um executável diferente, ou seja, você está chamando
execve
ou outroexec
membro da família de funções, talvez indiretamente através de uma função comosystem
orpopen
, e o processo filho deve ser executado sem privilégios desde o início, a maneira mais simples é obter um shell envolvido e chamadasu
. Aqui está uma visão geral de como o código pode parecer no Perl, mostrando as citações necessárias para:Se o processo filho precisar iniciar como root, mas eliminar privilégios posteriormente, consulte o código nesta resposta , que ilustra como fazer o downgrade de privilégios em um processo.
fonte