Conceder permissão para gerenciar outros processos de usuários

7

Eu tenho userA e userB que iniciam processos:

userA@server:~$ ./some_command.sh &
[1] 30889

Eu quero que o userC consiga gerenciar esses processos (suspendendo, retomando, finalizando e eliminando):

userC@server:~$ kill 30889
bash: kill: (30889) - Operation not permitted
userC@server:~$ sudo kill 30889
userC@server:~$ 

Como posso dar permissão ao userC para fazer isso sem depender do acesso do sudo? Como último recurso, eu concederia privilégios de root do userC para fazer isso.

Eu tenho controle total sobre o userC. Uma possibilidade é alterar o ID do usuário para o mesmo que userA, mas e o userB?

ATUALIZAÇÃO:

O contexto é para um aplicativo da web existente.

    
por hoju 15.01.2013 / 05:18

3 respostas

1

A menos que você conceda ao usuário o acesso às contas userA e userB, não há como fazê-lo sem usar algo como o sudo, que concede permissão especial. Não há nenhuma facilidade no kernel do Linux para conceder acesso a processos baseados em grupos ou listas de controle de acesso.

Mas você não deve ter medo de usar o sudo. Você pode configurá-lo para permitir apenas comandos específicos e permitir que os comandos sejam executados apenas como usuários específicos. Ou seja você pode permitir que apenas o processo userA e userB seja eliminado pelo userC, mas não permita que o userC mate outros processos.

    
por 15.01.2013 / 05:32
1

Você poderia fazer uma segunda aplicação que pode matar processos, por exemplo, process-proxy , você pode rodar isso como root apenas uma vez (talvez faça automaticamente no boot) e deixar ele escutando por uma mensagem Dbus, ou alguma outra média de comunicação. Finalmente, um aplicativo cliente, por exemplo, send-message para enviar as mensagens e pode ser executado à vontade pelo userC.

userC@server $ ./send-message -kill -pid 30889
userC@server $ ./send-message -nice 2 -pid 30889

Em outras palavras, faça um aplicativo proxy. Você só precisa ter certeza de que ele apenas ouve mensagens do userC, e também pode ser uma boa ideia deixar apenas que ele mate processos específicos para usuários específicos.

P.D. O Dbus pode não ser a melhor Idéia (não estou totalmente familiarizado com isso), mas há muitas maneiras de tornar process-proxy ciente de uma mensagem. Por exemplo, monitore um arquivo em determinada pasta (para a qual somente o usuárioC e o root têm acesso para segurança) que pode conter pid do processo que precisamos para matar.

    
por 21.01.2013 / 06:07
1

Isso é semelhante à resposta de Martin, mas (possivelmente) é um pouco mais simples. Escreva uma nova versão do comando kill que se pareça com isto:

If (current UID (i.e., invoker’s UID) != userC)
        exit (with an appropriate error message)
parse args
call kill() system function

Se preferir não reescrever o comando kill , escreva seu programa para exec /bin/kill com os argumentos que foram passados para ele. Compile, teste e faça duas cópias: um que é setUID para userA e um que é setUID para userB. Para maior segurança, coloque-os em um diretório que somente o usuário tenha acesso.

Se tornar a vida mais fácil para o usuárioC é uma preocupação primordial, escreva um programa front-end que determine o (s) processo (s) do userC que está tentando "matar" e invoque a cópia apropriada do primeiro programa. Ou pode executar ambas as cópias.

Essencialmente, isso é escrever sua própria versão simplificada de sudo , por isso não sei se será aceitável para você. Você disse que quer "fazer isso sem depender do acesso ao sudo" e, a rigor, com essa resposta, não estaria confiando em nada - você teria controle total sobre a configuração da solução.

    
por 21.01.2013 / 20:02