Как отключить команду «kill» в Linux

Как отключить команду «kill» в Linux

Я хочу отключить все команды kill (включая root-пользователя). Я пробовал менять разрешения, но они все еще могут быть выполнены. Есть ли способ сделать это?

решение1

«Отключение» killдля root, даже если бы это было возможно, скорее всего, имело бы нежелательные побочные эффекты, такие как сбой в работе системных скриптов, а в худшем (но вероятном) сценарии это помешало бы вашему компьютеру нормально загрузиться (или дажеВыключениеправильно).

Для пользователя это тоже вызовет проблемы. Например, у меня есть скрипты, которые я запускаю как непривилегированный пользователь, который проверяет, запущены ли определенные процессы с использованием kill -0 $pid. Эти скрипты перестанут работать.

Для себя вы могли бы дать aliasкоманду killна что-то другое, например echo "kill":

$ alias kill='echo "kill"'

По крайней мере , это помешало бы killсделать что-либо полезное в командной строке:

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

решение2

Используйте этот модуль ядра для отключения 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его.

решение3

Тыне должнаотключите его во всей системе, так как он используется в системных скриптах (например, в /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среда. Это все равно только отключиткоманда акций,не прямой системный вызов, однако он выполнен. Последний нельзя отключить, поскольку он необходим для нормальной работы (например, каждый Ctrl+ Csends SIGINT, pipe require SIGPIPE, а фоновые процессы контролируются более чем пятью различными сигналами). Настройка среды chroot — сложная задача, и она, как правило, неудобна, если пользователю требуется доступ ко всей файловой системе.

решение4

Если вы хотите, чтобы пользователи могли нормально использовать, killза исключением случаев, когда они пытаются завершить вашу конкретную программу, вы можете определить killфункцию в .bashrcпрофиле пользователя и в этой функции проверить, пытается ли пользователь завершить вашу программу. Если нет, вы можете вызвать утилиту killиз самой вашей функции.

В качестве примера я написал небольшую функцию kill, которая не будет завершать sleepработу утилиты, но будет функционировать как обычная утилита kill для любого другого переданного ей параметра.

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

Связанный контент