我曾使用主管来管理运行 Django 站点的 Gunicorn 进程,尽管这个问题可能与主管管理的任何内容有关。以前,我是唯一管理和使用我们服务器的人,主管只是以 root 身份运行,我会supervisorctl restart myapp
在需要时使用 sudo 来运行。
现在我们的服务器必须支持在不同站点工作的多个用户,并且每个项目都需要能够重新启动自己的 gunicorn 进程,而不能重新启动其他用户的进程。
我关注了这篇博文:
http://drumcoder.co.uk/blog/2010/nov/24/running-supervisorctl-non-root/
并能够允许非 root 用户使用 Supervisorctl,但现在任何人都可以重新启动其他人的进程。从表面上看,supervisor 没有办法对每个用户进行访问控制。
有人知道如何允许用户在没有 root 权限的情况下仅重启自己的进程吗?
编辑:我们考虑过的一些事情包括编写一个由 root 拥有的脚本,该脚本设置了 suid 位,只包含 ,并将supervisorctl restart myapp
其放在拥有 的用户的目录中myapp
。互联网似乎在说,如果操作不当,这样的脚本是不安全的。我们还考虑编写一个自定义守护进程,该守护进程监听特定用户的命令,并在用户有权限的情况下重新启动主管进程。如果有更简单的解决方案可行,这个想法似乎过于复杂。
答案1
您可以使用sudo
代替自定义脚本来完成相同的操作。也就是说,给定默认supervisord
配置(其中只有 root 可以运行)supervisorctl
,您可以将这样的条目放入/etc/sudoers
:
alice ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app1
bob ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app2
这将允许以 root 身份alice
运行sudo /usr/bin/supervisorctl restart app1
而无需提供密码,并且允许bob
重新启动app2
。