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
, root
incluso 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 alias
el kill
comando para otra cosa, como echo "kill"
:
$ alias kill='echo "kill"'
Eso evitaría kill
al 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 kill
llamada 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
Túno debedeshabilítelo en todo el sistema, porque se usa en scripts del sistema (por ejemplo, en /etc/init.d/functions
el initscripts
paquete).
Puedes desactivarlopara el shell de inicio de sesión(y sus subcapas) poralias
Dirigiéndolo a, digamos, true
/ false
(o algo como kill_disabled
si 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 apropiadobash
archivo de iniciopara ejecutarlo en cada inicio de sesión.
Ahora, ejecutar kill
de 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 unchroot
ambiente. 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.CSIGINT
SIGPIPE
Respuesta4
Si desea que los usuarios puedan utilizar kill
normalmente, excepto cuando intentan cerrar su programa específico, puede definir una kill
función en el .bashrc
perfil de usuario y dentro de esta función, verificar si el usuario está intentando cerrar su programa. De lo contrario, puede llamar a la kill
utilidad desde su propia función.
Como ejemplo, escribí una pequeña función de eliminación que no eliminará la sleep
utilidad 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
}