我想禁用所有 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
)。
您可以禁用它用于登录 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
}