我们如何允许非 root 用户控制 systemd 服务?

我们如何允许非 root 用户控制 systemd 服务?

对于sysvinitsudoers这样的条目就足够了:

%webteam cms051=/sbin/service httpd *

这将允许使用以下命令:

  • sudo service httpd status
  • sudo service httpd restart

现在,对于systemd,服务名称是最后一个参数。即,服务重启将通过以下方式完成:

systemctl restart httpd.service

当然,我认为将命令定义为systemctl * httpd.service可以工作,但这会导致类似的结果systemctl restart puppet.service httpd.service达不到预期的效果。

考虑到这一点,那么允许非 root 用户控制systemd服务的最佳方式是什么?这不需要是sudoers;也许更改文件权限就足够了?

答案1

只需将所有需要的命令sudoers分别添加到:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 

答案2

@jofel 的答案正是我获得工作设置所需要的。将此发布给其他遇到此问题的人。我需要一种方法capistrano在从本地计算机部署后重新启动 Ruby 应用程序。这意味着我需要无密码访问来重新启动systemd服务。这就是我所拥有的,效果非常好!

笔记:我的用户和组称为deployer
将代码放入自定义文件中:/etc/sudoers.d/deployer
代码:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app

答案3

使用您希望他们有权访问的命令创建命令别名。然后将该组分配给该命令别名:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

将任何编辑内容放在 /etc/sudoers.d/filename 中而不是直接编辑 sudoers 文件也是一种很好的做法。确保在 sudoers 中指向您的 .d/文件名,无论如何,大多数新发行版都会这样做。将这两行放入您的 sudoers 中应该可以解决问题:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

注意:includedir 前面的 # 不是注释。它必须保留。

答案4

在 RHEL8 中:

httpd.service另一种选择是在 webteam 主目录下 有一个文件~/.config/systemd/user,他们可以自己启动/停止/启用等:

systemctl --user enable httpd.service
systemctl --user start httpd.service

验证只要用户有权启动该服务,上述操作就有效。这在开发系统上似乎很有用,允许开发人员使用 devops/ops 手中可用的所有配置有效地执行计时器和管道。

似乎也有利于将其转移到生产环境,并使用构建的 httpd 操作在实际服务器环境中测试整个启动序列,并且开发人员不会说“但它在我的笔记本电脑上工作,当我推送到开发人员时崩溃了” 。但我只是在这里思考和写作。

最好的在线参考,因为 systemd 用户文档并不丰富:

https://wiki.archlinux.org/title/systemd/User

相关内容