Как отключить команду 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
}
Другие вопросы по тегам