Como matar um processo iniciado com um usuário diferente sem ser root ou sudoer?

18

em um ambiente Linux, eu preciso matar um processo que tenha sido iniciado pelo user2 se eu for user1 sem ser sudoers ou usando root. Você sabe se há uma maneira de definir isso ao iniciar o processo? Tal como uma lista de usuários autorizados a matar o processo?

O fato é que instâncias simultâneas do mesmo processo podem ser iniciadas a partir de usuários diferentes, por isso não é conveniente para mim 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 eu tenho é uma lista de usuários autorizados a iniciar o processo, definido no banco de dados, antes de iniciar o processo eu verifiquei o usuário atual na lista e, se sim, iniciei o processo com o usuário atual. Se um segundo usuário permitido fazer isso quer matar o processo, eu gostaria que fosse permitido fazer isso, mas eu não quero que ele seja sudoers.

Portanto, eu estava pensando em criar um processo rodando como root que recebe o pedido para matar processos de um usuário, verifica se o usuário tem permissão para iniciar / parar o processo e mata o processo.

Você acha que poderia ser a melhor solução?

    
por slhck 03.05.2010 / 14:12

7 respostas

12

Sinto muito, mas isso simplesmente não é possível (isso é por design). No entanto, se forem membros de um grupo comum, o usuário1 poderá gravar em um arquivo que o processo do usuário2 verifica, indicando o processo que deve ser encerrado.

Ou, o usuário2 pode executar algo em segundo plano que verifica um arquivo e envia os sinais apropriados. User1 então simplesmente tem que escrever naquele arquivo. Isso pode ser mais fácil, pois não exigiria nenhuma modificação dos programas do usuário2.

Convencionalmente, não, user1 não pode enviar sinais POSIX para o processo do usuário2.

    
por 03.05.2010 / 14:21
9

A menos que as ACLs ou o SELinux ou qualquer outra coisa tenha uma maneira melhor de fazer isso, a maneira como vi isso é feita com um SetUID script. Como você pode imaginar, eles são famosos por serem riscos de segurança.

Em relação ao seu caso, diga que procOwner é o nome de usuário para o proprietário do processo e userA (uid 1000), userB (uid 1201) e userC (uid 1450) são as pessoas autorizadas a eliminar o processo.

killmyproc.bash:

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.

Em seguida, defina o proprietário e as permissões com:

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash

E também coloque userA, userB e userC no grupo procGroup .

    
por 03.05.2010 / 14:30
2

Não convencionalmente - ter um usuário vindo e matar os processos de outra pessoa é a maior vulnerabilidade 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 pode escrevê-lo para fazer isso, você pode escrever um wrapper para ele que o inicia e então faz o monitoramento, matando o processo filho se o evento ocorrer.

    
por 03.05.2010 / 14:24
1

Não, você não pode.

Se você quiser compartilhar processos com outros usuários, inicie o processo com um ID de usuário comum.

    
por 03.05.2010 / 14:19
1

Naturalmente, você pode escrever o programa de forma que termine graciosamente quando receber um certo sinal (termo usado vagamente para significar "um evento pré-determinado", não um sinal POSIX) de um certo (lista de ) usuários.

    
por 03.05.2010 / 14:22
1

Você pode escrever um programa suid que somente usuários em um determinado grupo possam executar e que envie o sinal apropriado para o processo. Não tenho certeza se você quis excluir suid também.

    
por 03.05.2010 / 14:29
0

bit suid não funciona com scripts bash. imho, a melhor maneira é escrever algum script "killservice". Suponha que o seu serviço esteja sendo executado como usuário serviceuser

#!/bin/bash
sudo -u serviceuser /usr/bin/killserviceworker

então

# addgroup servicekiller
# chown root:servicekiller /usr/bin/killservice
# chmod 750 /usr/bin/killservice
# adduser bob servicekiller

então, você só precisa adicionar regra em / etc / sudoers para permitir que eles executem / usr / bin / killserviceworker como useruseruser sem pedir uma senha:

servicekiller        ALL = (serviceuser:serviceuser) NOPASSWD: /usr/bin/killserviceworker

killserviceworker pode ser assim:

#!/bin/bash
kill ${cat /run/service.pid}
    
por 03.09.2013 / 08:06

Tags