Cómo deshabilitar el comando 'kill' en Linux

Cómo deshabilitar el comando 'kill' en Linux

Quiero deshabilitar todos los comandos de eliminación (incluido el usuario root). Intenté cambiar los permisos, pero aún se puede ejecutar. ¿Hay una manera de hacer eso?

Respuesta1

"Deshabilitar" kill, rootincluso si fuera posible, probablemente tendría efectos secundarios no deseados, como el mal funcionamiento de los scripts del sistema y, en el peor (pero probable) escenario, impediría que su computadora se inicie correctamente (o inclusoApagandoadecuadamente).

También causaría problemas a un usuario. Tengo, por ejemplo, scripts que ejecuto como usuario sin privilegios, que verifican si ciertos procesos se están ejecutando usando kill -0 $pid. Esos guiones dejarían de funcionar.

Para usted, podría ejecutar aliasel killcomando para otra cosa, como echo "kill":

$ alias kill='echo "kill"'

Eso evitaría killal menos hacer algo útil en la línea de comando:

$ kill -s HUP $$
kill -s HUP 11985

Respuesta2

Utilice este módulo del kernel para deshabilitar la killllamada del sistema en amd64.
Úselo bajo su propio riesgo. Se esperan efectos secundarios 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;
}

Compílelo como lo haría con cualquier otro módulo. Luego úsalo insmod.

Respuesta3

no debedeshabilítelo en todo el sistema, porque se usa en scripts del sistema (por ejemplo, en /etc/init.d/functionsel initscriptspaquete).

Puedes desactivarlopara el shell de inicio de sesión(y sus subcapas) poraliasDirigiéndolo a, digamos, true/ false(o algo como kill_disabledsi desea obtener un error en lugar de una no operación).

Tenga en cuenta que esta forma no es infalible: sólo afectará a los comandos ejecutados directamente (no a los que están dentro de los scripts). Y el usuario podrá eliminar el alias con unalias.


Para hacer esto, ejecute el siguiente comando

alias kill=kill_disabled

o agregarlo a un apropiadobasharchivo de iniciopara ejecutarlo en cada inicio de sesión.

Ahora, ejecutar killde forma interactiva producirá:

$ kill 9999
-bash: kill_disabled: command not found

Como dije, la forma anterior se subvierte fácilmente. Si necesita una forma infalible, la única solución es ejecutar toda la sesión del shell de inicio de sesión en unchrootambiente. Todavía solo desactivará elcomando de acciones,No es una llamada al sistema directa, aunque se haga. Este último no se puede desactivar porque es esencial para el funcionamiento normal (por ejemplo, cada envío Ctrl+ , las canalizaciones requieren y los procesos en segundo plano se controlan con más de cinco señales diferentes). Configurar un entorno chroot es una tarea avanzada y generalmente resulta inconveniente si el usuario necesita acceder a todo el sistema de archivos.CSIGINTSIGPIPE

Respuesta4

Si desea que los usuarios puedan utilizar killnormalmente, excepto cuando intentan cerrar su programa específico, puede definir una killfunción en el .bashrcperfil de usuario y dentro de esta función, verificar si el usuario está intentando cerrar su programa. De lo contrario, puede llamar a la killutilidad desde su propia función.

Como ejemplo, escribí una pequeña función de eliminación que no eliminará la sleeputilidad pero funcionará como una utilidad de eliminación normal para cualquier otro parámetro que se le proporcione.

function kill() {
    process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
    if [[ $process == "sleep"]]
    then
        echo "Killing $process is not allowed"
    else
        /bin/kill $@
    fi
}

información relacionada