如何在 Linux 上禁用“kill”命令

如何在 Linux 上禁用“kill”命令

我想禁用所有 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/functionsinitscripts)。

您可以禁用它用于登录 shell(及其子壳层)alias'将其设置为,比如说,true/ false(或者类似于kill_disabled如果您希望获得错误而不是无操作)。

请注意,这种方法并非万无一失:它只会影响直接执行的命令(而不是脚本内的命令)。并且用户可以使用 删除别名unalias


为此,请运行以下命令

alias kill=kill_disabled

或将其添加到适当的bash启动文件每次登录时运行它。

现在,kill交互运行将产生:

$ kill 9999
-bash: kill_disabled: command not found

正如我所说,上述方法很容易被破坏。如果你需要一个万无一失的方法,唯一的解决方案是在chroot环境。它仍然只会禁用库存命令,不是直接系统调用,但已完成。后者无法禁用,因为它对于正常操作至关重要(例如,每个Ctrl+C发送SIGINT、管道需要SIGPIPE,并且后台进程由五个以上的不同信号控制)。设置 chroot 环境是一项高级任务,如果用户需要访问整个文件系统,通常会很不方便。

答案4

如果您希望用户能够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
}

相关内容