Quero desabilitar todos os comandos kill (incluindo o usuário root). Tentei alterar as permissões, mas ainda pode ser executado. Existe uma maneira de fazer isso?
Responder1
"Desativar" kill
o root
, mesmo que fosse possível, provavelmente teria efeitos colaterais indesejados, como mau funcionamento de scripts do sistema e, no pior (mas provável), cenário, impediria o computador de inicializar corretamente (ou até mesmodesligandoapropriadamente).
Também para um usuário isso causaria problemas. Tenho, por exemplo, scripts que executo como usuário sem privilégios, que verificam se determinados processos estão sendo executados usando kill -0 $pid
. Esses scripts parariam de funcionar.
Para você, você poderia alias
comandar kill
outra coisa, como echo "kill"
:
$ alias kill='echo "kill"'
Isso impediria kill
pelo menos fazer algo útil na linha de comando:
$ kill -s HUP $$
kill -s HUP 11985
Responder2
Use este módulo do kernel para desabilitar a kill
chamada do sistema no amd64
.
Use por sua conta e risco. São esperados efeitos colaterais devastadores.
#include <linux/module.h>
MODULE_LICENSE("GPL");
int __init init(void) __attribute__((noreturn))
{
unsigned long long cr0 = read_cr0();
write_cr0(cr0 & ~(1 << 16)); /* Clear Write Protection (WP) bit */
*(unsigned char *)sys_kill = 0xc3; /* opcode for "ret" */
write_cr0(cr0);
/* This makes sure that delete_module below won't complain */
__this_module.refcnt = 1;
__this_module.state = MODULE_STATE_LIVE;
asm volatile
(
"mov %0, %%rsp\n\t" /* It seems GCC refuses to mess with the stack pointer */
"jmp sys_delete_module\n\t" /* call delete_module(name, flags) */
:: "r"(current->stack + THREAD_SIZE - sizeof(struct pt_regs) - 8), "D"(__this_module.name), "S"(0) :
);
}
void __exit exit(void)
{
return;
}
Compile-o como faria com qualquer outro módulo. Então use insmod
nele.
Responder3
Vocênão deveriadesative-o em todo o sistema, porque ele é usado em scripts do sistema (por exemplo, no /etc/init.d/functions
pacote initscripts
).
Você pode desativá-lopara o shell de login(e suas subcamadas) poralias
'fazendo isso, digamos, true
/ false
(ou algo como kill_disabled
se você deseja obter um erro em vez de um modo autônomo).
Observe que esta forma não é infalível: afetará apenas comandos executados diretamente (não aqueles dentro de scripts). E o usuário poderá remover o alias com unalias
.
Para fazer isso, execute o seguinte comando
alias kill=kill_disabled
ou adicione-o a um apropriadobash
arquivo de inicializaçãopara executá-lo a cada login.
Agora, a execução kill
interativa produzirá:
$ kill 9999
-bash: kill_disabled: command not found
Como eu disse, o caminho acima é facilmente subvertido. Se você precisar de uma maneira infalível, a única solução é executar toda a sessão do shell de login em umchroot
ambiente. Ele ainda desativará apenas ocomando de estoque,não é um syscall direto, porém feito. Este último não pode ser desabilitado porque é essencial para a operação normal (por exemplo, every Ctrl+ Csends SIGINT
, pipes require SIGPIPE
e processos em segundo plano são controlados com mais de cinco sinais diferentes). Configurar um ambiente chroot é uma tarefa avançada e geralmente inconveniente se o usuário precisar acessar todo o sistema de arquivos.
Responder4
Se você deseja que os usuários possam usar kill
normalmente, exceto quando tentarem matar seu programa específico, você pode definir uma kill
função no .bashrc
perfil do usuário e dentro desta função, verificar se o usuário está tentando matar seu programa. Caso contrário, você pode chamar o kill
utilitário de dentro da sua própria função.
Como exemplo, escrevi uma pequena função kill que não matará o sleep
utilitário, mas funcionará como um utilitário kill normal para qualquer outro parâmetro fornecido a ele.
function kill() {
process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
if [[ $process == "sleep"]]
then
echo "Killing $process is not allowed"
else
/bin/kill $@
fi
}