
Eu gostaria de dar a um usuário não root ( nicollet
) a capacidade de detectar e enviar um sinal para processos iniciados pelo Apache2 (esses processos são scripts FastCGI e o sinal diz para eles esvaziarem o cache). Os processos são de propriedade do usuário web ( www-data
) e estou rodando no Debian instável.
Não consigo encontrar nenhuma maneira de o nicollet
usuário ver esses processos.
Os processos estão em execução e podem ser vistos por root
e www-data
:
root@linux-01:~# ps -Af | grep baryton
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:12 baryton --bot
root 18701 18700 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~#
No entanto, executar o mesmo comando com meu nicollet
usuário não retorna nada:
nicollet@linux-01:~$ ps -Af | grep baryton
nicollet 18704 18703 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
Tentei criar um executável que execute a consulta acima usando system()
. Pertence e www-data
tem o bit setuid definido:
root@linux-01:~# which setuid-update
/usr/local/bin/setuid-update
root@linux-01:~# ls -l /usr/local/bin/setuid-update
-rwsr-xr-x 1 www-data www-data 11046 Nov 2 10:27 /usr/local/bin/setuid-update
root@linux-01:~#
Porém, observo a mesma situação: os processos são visíveis por root
e www-data
mas não nicollet
:
root@linux-01:~# setuid-update
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:13 baryton --bot
www-data 18712 18711 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18714 18712 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~# su nicollet
nicollet@linux-01:~$ setuid-update
www-data 18716 18715 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18717 18716 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
O mais surpreendente é que o grep
processo é realmente executado www-data
(porque foi iniciado a partir de um executável setuid) e é visível, mas o baryton
processo não é.
O que está acontecendo aqui? Por que ps
run by www-data
mostra esses processos, mas ps
executado por um executável setuid rodando como www-data
não pode, quando é iniciado por nicollet
?
Responder1
Durante anos foi possível restringir no nível do kernel as contas de usuários regulares para ver apenas seus próprios processos. Esta restrição tem sido possível com grsecurity, SELinux e outras estruturas de segurança, mas não é comumente usada por padrão pelas distribuições.
Faz um tempo que não experimento o branch instável do Debian (estou executando o Lenny), mas talvez eles tenham ativado recentemente essa opção na configuração do kernel. Causaria exatamente o mesmo efeito que você está observando - mesmo com o executável setuid, o uid original (nicollet) ainda é conhecido e apenas o EUID (uid efetivo) é alterado.