我有用户 A 和用户 B 启动进程:
userA@server:~$ ./some_command.sh &
[1] 30889
然后我有一个以用户 C 身份运行的 Web 应用程序来管理这些进程(暂停、恢复、终止和终止)。
我如何授权用户 C 执行此操作?出于安全考虑,我希望避免授予用户 C root 权限。
我完全控制用户 C。一种可能性是将用户 ID 更改为与用户 A 相同,但那么用户 B 怎么办?
更新:进程管理是由第三方模块执行的,因此如果不进行重大重写就无法应用 sudo。
答案1
让用户共享一个 uid 是一种非常不受欢迎的做法。
建议:
- 查看
sudo
命令。这是“如何以其他用户身份运行命令”的解决方案:在文件中指定条目,/etc/sudoers
指示哪些用户(或组等)可以以不同用户身份运行命令,以及在什么情况下可以运行。其配置也可以放入 LDAP 目录中。 - 如果这是生产环境(或你计划最终放置在生产环境中的东西),那么以下做法是最佳做法:用户A/用户B成为“应用程序用户”。这是一个帐户,其名称很容易传达其预期用途(神谕,网络应用程序等),而不是任何用户认为的“他们的”个人帐户。理想情况下,没有人能够以该用户身份登录(即禁用密码),如果您希望用户获得该用户的 shell 访问权限,则应通过
sudo
抽象来实现。(即允许用户执行sudo su - oracle
以获取神谕shell) 这会强制用户在成为应用程序用户之前以自己的身份登录,并留下更好的审计跟踪。 - 如果这两种解决方案都不可行,您可能需要遵循 @Hex 的建议,使用终端多路复用器(如
screen
或 )tmux
,尽管仍然建议在登录和共享应用程序帐户之间进行一些抽象。除非这些进程有某种形式的终端交互。
答案2
将用户 A/B 运行的可执行文件的 UID 设置为用户 C。
?
利润
答案3
答案4
最好使用用户 A/用户 B 下的代理进程读取每个 PID 的控制文件。
some_command.sh
:
thecommand &
CTL=/var/run/%1.ctl
echo %1 > $CTL
while read -n 1 cmd; do
case $cmd in
k)
kill %1
exit $?
;;
s)
kill -TSTP %1
;;
...
done < $CTL
您可以让工作进程读取控制文件......但它们将无法继续,对吗?