我有用户 A 和用户 B 启动进程:
userA@server:~$ ./some_command.sh &
[1] 30889
然后我希望 userC 能够管理这些进程(暂停、恢复、终止和终止):
userC@server:~$ kill 30889
bash: kill: (30889) - Operation not permitted
userC@server:~$ sudo kill 30889
userC@server:~$
我如何才能在不依赖 sudo 访问权限的情况下授予用户 C 执行此操作的权限?作为最后的手段,我将授予用户 C root 权限来执行此操作。
我完全控制用户 C。一种可能性是将用户 ID 更改为与用户 A 相同,但那么用户 B 怎么办?
更新:
该上下文针对的是现有的 Web 应用程序。
答案1
除非您授予用户 C 访问用户 A 和用户 B 帐户的权限,否则除非使用授予特殊权限的 sudo 之类的工具,否则无法做到这一点。Linux 内核中没有基于组或访问控制列表授予进程访问权限的功能。
但您不必担心使用 sudo。您可以将其配置为仅允许特定命令,并且仅允许以特定用户身份运行这些命令。例如,您可以只允许用户 C 终止用户 A 和用户 B 的进程,但不允许用户 C 终止其他进程。
答案2
例如,您可以制作第二个可以终止进程的应用程序process-proxy
,您可以仅以 root 身份运行该应用程序一次(可能让它在启动时自动启动),并让它监听 Dbus 消息或其他通信方式。最后是一个客户端应用程序,例如用于send-message
发送消息,可以由用户 C 随意运行。
userC@server $ ./send-message -kill -pid 30889
userC@server $ ./send-message -nice 2 -pid 30889
换句话说,制作一个代理应用程序。你只需要确保它只监听来自用户 C 的消息,并且只让它终止特定用户的特定进程可能是一个好主意。
PD Dbus 可能不是最好的主意(我不太熟悉它),但有很多方法可以了解process-proxy
消息。例如,监视某个文件夹(出于安全考虑,只有 userC 和 root 可以访问)上的文件,该文件可能包含pid
我们需要它终止的进程。
答案3
这与 Martin 的答案类似,但(可以说)更简单一些。编写一个新版本的命令kill
,如下所示:
如果(当前 UID(即调用者的 UID)!= userC)
退出(带有适当的错误消息)
解析参数
调用kill()
系统函数
如果您不想重写kill
命令,请使用传递给它的参数编写程序以执行/bin/kill
。编译、测试,然后制作两个副本:一个是 setUID 给用户 A,另一个是 setUID 给用户 B。为了更加安全,请将它们放在只有用户 C 可以访问的目录中。
如果让用户 C 的生活更轻松是首要考虑,请编写一个前端程序来确定用户 C 试图“终止”谁的进程并调用第一个程序的相应副本。或者它可以运行两个副本。
这实际上是在编写您自己的精简版sudo
,所以我不知道您是否可以接受。您说您想“在不依赖 sudo 访问权限的情况下执行此操作”,严格来说,有了这个答案,您就不会依赖任何东西——您将完全控制解决方案的配置。