em um ambiente Linux, preciso matar um processo iniciado pelo usuário2 se eu for usuário1 sem ser sudoers ou usando root. Você sabe se existe uma maneira de definir isso ao iniciar o processo? Como uma lista de usuários autorizados a matar o processo?
O fato é que instâncias simultâneas do mesmo processo podem ser iniciadas por usuários diferentes, por isso não é conveniente definir o ID do grupo para o processo. Outros usuários que não estão no grupo não poderão iniciar um segundo processo paralelo.
O que tenho é uma lista de usuários com permissão para iniciar o processo, definido no banco de dados, antes de iniciar o processo, verifico se o usuário atual está na lista e, se sim, inicio o processo com o usuário atual. Se um segundo usuário permitir fazer isso, interromper o processo, eu gostaria que ele fizesse isso, mas não quero que ele sofra.
Portanto, eu estava pensando em criar um processo em execução como root, que recebe a solicitação para matar processos de um usuário, verifica se o usuário tem permissão para iniciar / parar o processo e o mata.
Você acha que poderia ser a melhor solução?
Respostas:
Sinto muito, mas isso simplesmente não é possível (isso é por design). No entanto, se membros de um grupo comum, o usuário1 pode gravar em um arquivo que o processo do usuário2 verifica, indicando para o processo que ele deve finalizar.
Ou, o usuário2 pode executar algo em segundo plano que verifica um arquivo e envia os sinais apropriados. O usuário1 simplesmente precisa gravar nesse arquivo. Isso pode ser mais fácil, pois não exigiria nenhuma modificação dos programas do usuário2.
Convencionalmente, não, o usuário1 não pode enviar sinais POSIX para o processo do usuário2.
fonte
A menos que ACLs, SELinux ou qualquer outra coisa tenha uma maneira melhor de fazê-lo, a maneira como eu vi isso é com um script SetUID . Como você pode imaginar, eles são famosos por serem riscos à segurança.
Em relação ao seu caso, diga que procOwner é o nome de usuário do proprietário do processo, e userA (uid 1000), userB (uid 1201) e userC (uid 1450) são as pessoas autorizadas a interromper o processo.
killmyproc.bash:
Em seguida, defina o proprietário e as permissões com:
E também coloque userA, userB e userC no grupo
procGroup
.fonte
Não é convencional - fazer com que qualquer usuário venha e mate os processos de outra pessoa é a vulnerabilidade final de negação de serviço.
Isso pode ser feito se o processo de destino cooperar. Uma maneira seria monitorar um evento externo (como um arquivo sendo criado em / var / tmp ou uma mensagem em um soquete), instruindo-o a se matar. Se você não puder gravá-lo para fazer isso, poderá criar um wrapper para ele que o inicie e faça o monitoramento, matando o processo filho se o evento ocorrer.
fonte
Não, você não pode.
Se você deseja compartilhar processos com outros usuários, inicie o processo com um ID de usuário comum.
fonte
Obviamente, você pode escrever o programa de forma que ele termine normalmente quando receber um determinado sinal (termo usado livremente para significar "um evento predeterminado", não um sinal POSIX) de um certo (lista de) usuários.
fonte
Você pode escrever um programa suid que somente usuários de um determinado grupo podem executar e que envia o sinal apropriado ao processo. Não tenho certeza se você pretendia excluir o suid também.
fonte
O bit suid não funciona com scripts bash. imho, a melhor maneira é escrever um script de wrapper "killservice". Suponha que seu serviço esteja sendo executado como usuário serviceuser
então
então, você só precisa adicionar uma regra em / etc / sudoers para permitir que eles executem / usr / bin / killserviceworker como usuário do serviço de usuário sem solicitar uma senha:
O killserviceworker pode ficar assim:
fonte