我们如何允许非root用户控制system.d服务?


60

使用sysvinit,这样的sudoers条目就足够了:

%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用户控制system.d服务的最佳方法是什么?这不必是sudoers; 也许更改文件许可权可能就足够了?


我有sudo一段时间没有修改配置了,但是您不能做类似的事情cms051=systemctl * httpd.service吗?
约翰·史密斯

1
这样,您就可以重新启动任何服务。我应该在问题中包括那个花絮。抱歉。
Belmin Fernandez'3

Answers:


43

只需将所有需要的命令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 
%webteam cms051=/usr/bin/systemctl status httpd.service

我希望捕获所有单元命令,但是如果我必须逐项列出它们,那么我想这就是我要做的。
Belmin Fernandez

9
状态没有用,因为任何用户都可以这样做
Dereckson

5
什么cms051
凯文

1
那么,如果我调用systemctl restart http.service mariadb.service ;-)会发生什么?也许MariaDB的也将被重新启动
马立克Wajdzik

1
如果没有明确允许使用@marekWajdzik *或类似模式,则sudo不允许使用其他参数。
jofel

31

@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

deployer在这种情况下,我需要添加用户身份登录后,应该systemctl使用sudo 运行命令。
Muyiwa Olu

8

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

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 /文件名,大多数新发行版仍会这样做。将这2行放在您的sudoers中应该可以解决问题:

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

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


在没有输入密码的情况下如何增加执行停止/启动/重启的机会?
尼古拉·巴拉南科

最佳答案IMO。每个人都应该添加命令别名并使用它。
DASKAjA

6

jofel的建议逐项列出是最安全的。

如果我想允许某人使用命令功能的有限子集,我将不信任sudoers行中的通配符来执行此操作。即使该语言比Shell Glob更具表达能力,也有太多需要跟踪的极端情况。

service httpd *”行相对安全,因为(验证此:)service仅具有一个有用的标志(--status-all),它不会做特别敏感的事情,并且(也验证此::)/etc/init.d/httpd仅接受您要允许的命令行。

如果组合太多,将它们列出会很尴尬,您可能应该质疑自己在做什么。但是您可以让他们访问精心编写的帮助程序脚本,该脚本会为他们运行命令(非常像/etc/init.d/http)。即使在这种情况下,您也应该尽可能精确明确地列出允许使用的命令和选项,并且不要将任何用户输入直接传递给目标命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.