Как отключить команду kill в Linux
Я хочу отключить все команды уничтожения (включая пользователя root). Я пытался изменить разрешения, но он все еще может быть выполнен. Есть способ сделать это?
4 ответа
"Отключение" kill
за root
даже если бы это было возможно, это, скорее всего, привело бы к нежелательным побочным эффектам, таким как сбои в работе системных скриптов, и в худшем (но вероятном) сценарии это помешало бы запуску вашего компьютера должным образом (или даже выключению должным образом).
Для пользователя это тоже может вызвать проблемы. У меня есть, например, сценарии, которые я запускаю как непривилегированный пользователь, который проверяет, запущены ли определенные процессы с использованием kill -0 $pid
, Эти сценарии перестали бы работать.
Для себя вы могли бы alias
kill
командовать чем-то другим, например echo "kill"
:
$ alias kill='echo "kill"'
Это помешает kill
делать что-нибудь полезное из командной строки по крайней мере:
$ kill -s HUP $$
kill -s HUP 11985
Используйте этот модуль ядра, чтобы отключить kill
системный вызов на amd64
,
Используйте на свой риск. Ожидаются разрушительные побочные эффекты.
#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;
}
Скомпилируйте его, как любой другой модуль. Тогда используйте insmod
в теме.
Вы не должны отключать его для всей системы, потому что он используется в системных скриптах (например, в /etc/init.d/functions
в initscripts
пакет).
Вы можете отключить его для оболочки входа в систему (и ее подоболочек) alias
скажем, true
/ false
(или что-то вроде kill_disabled
если вы хотите получить ошибку, а не запрет).
Обратите внимание, что этот способ не защищен от ошибок: он влияет только на команды, выполняемые напрямую (а не на те, которые находятся внутри скриптов) И пользователь сможет удалить псевдоним с unalias
,
Для этого выполните следующую команду
alias kill=kill_disabled
или добавить его в соответствующий bash
файл запуска для запуска при каждом входе в систему.
Сейчас работает kill
в интерактивном режиме будет производить:
$ kill 9999
-bash: kill_disabled: command not found
Как я уже сказал, вышеприведенный способ легко подрывается. Если вам нужен надежный способ, единственное решение - запустить весь сеанс оболочки входа в систему в chroot
среда. Он по-прежнему будет только отключать команду stock, но не прямой системный вызов, как бы то ни было. Последнее не может быть отключено, потому что это важно для нормальной работы (например, каждый Ctrl + C отправляет SIGINT
, трубы требуют SIGPIPE
и фоновые процессы контролируются более чем пятью различными сигналами). Настройка среды chroot является сложной задачей и, как правило, неудобна, если пользователю требуется доступ ко всей файловой системе.
Если вы хотите, чтобы пользователи могли использовать kill
обычно, за исключением случаев, когда они пытаются убить вашу конкретную программу, вы можете определить kill
функция в .bashrc
профиля пользователя и в этой функции, проверьте, пытается ли пользователь убить вашу программу. Если нет, вы можете позвонить kill
утилита из самой вашей функции.
В качестве примера я написал небольшую функцию kill, которая не будет уничтожать sleep
утилита, но будет функционировать как обычная утилита уничтожения для любого другого параметра, предоставленного ей.
function kill() {
process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
if [[ $process == "sleep"]]
then
echo "Killing $process is not allowed"
else
/bin/kill $@
fi
}