如何以非 root 或 sudoer 用户身份终止以其他用户启动的进程?

如何以非 root 或 sudoer 用户身份终止以其他用户启动的进程?

在 Linux 环境中,如果我是用户 1,并且不是 sudoers 或使用 root,我需要终止由用户 2 启动的进程。您知道在启动进程时是否有办法设置吗?例如允许终止进程的用户列表?

事实上,同一进程的并发实例可以由不同的用户启动,这就是为什么我不方便将组 ID 设置为进程的原因。不属于该组的其他用户将无法启动第二个并行进程。

我有一个允许启动进程的用户列表,该列表在数据库中定义,在启动进程之前,我会检查当前用户是否在列表中,如果是,我会以当前用户的身份启动进程。如果第二个允许这样做的用户想要终止进程,我希望允许他这样做,但我不希望他是 sudoers。

因此,我考虑创建一个以 root 身份运行的进程,该进程接收来自用户的终止进程的请求,检查用户是否被允许启动/停止该进程并终止该进程。

您认为这可能是最好的解决方案吗?

答案1

抱歉,但这根本不可能(这是设计使然)。但是,如果是同一组的成员,则 user1 可以写入 user2 的进程检查的文件,指示该进程应该终止。

或者,用户 2 可以在后台运行某些程序来检查文件,然后发送适当的信号。然后用户 1 只需写入该文件即可。这可能更简单,因为它不需要对用户 2 的程序进行任何修改。

按照惯例,不可以,用户 1 不能向用户 2 的进程发送 POSIX 信号。

答案2

除非 ACL 或 SELinux 或其他东西有更好的方法来实现这一点,否则我见过的实现方法是设置UID脚本。你可以想象,它们因存在安全风险而臭名昭著。

关于您的情况,假设 procOwner 是进程所有者的用户名,而 userA (uid 1000)、userB (uid 1201) 和 userC (uid 1450) 是被允许终止该进程的人。

killmyproc.bash:

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.

然后使用以下命令设置所有者和权限:

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash

并将用户A,用户B和用户C放入组中procGroup

答案3

不符合常规——任何用户来并终止其他人的进程都是最终的拒绝服务漏洞。

如果目标进程配合,就可以做到这一点。一种方法是让它监视外部事件(例如在 /var/tmp 中创建的文件或套接字上的消息),指示它终止自身。如果您无法编写它来执行此操作,您可以为它编写一个包装器来启动它,然后进行监视,如果事件发生,则终止子进程。

答案4

当然,您可以以这样的方式编写程序,使其在从某个(列表)用户接收到某个信号(该术语大致表示“预先确定的事件”,而不是 POSIX 信号)时正常终止。

相关内容