我希望群组中的用户foogroup
能够:
systemctl start foo.service
,systemctl stop foo.service
,systemctl status foo.service
, 和journalctl -u foo.service
不使用提升的权限。那可能吗?
我有一个 systemd 服务,如下所示:
[Unit]
Description=foo service
[Service]
Type=simple
ExecStart=/bin/sleep infinity
User=foobot
Group=foogroup
foobot
系统用户在哪里。
我知道我们可以安装单元文件以~/.config/systemd/user/
允许非特权用户使用 systemd,但这对团体并没有真正的帮助。
注意:我计划使用SD总线API来自libsystem-dev
和座舱所以添加systemctl
到/etc/sudoers
不会有帮助。
我不太关心systemctl enable
,如果我需要更高的权限也没关系。
答案1
这是我最终想出的解决方案。我创建:
/etc/polkit-1/localauthority/50-local.d/service-auth.pkla
---
[Allow foogroup to start/stop/restart services]
Identity=unix-group:foogroup
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes
请注意,这特别适用于 Debian/Ubuntu 中使用的 polkit <106。其他发行版使用更新版本的 polkit ,它会执行如下操作:
/etc/polkit-1/rules.d/foogroup.rules
---
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
subject.isInGroup("foogroup")) {
return polkit.Result.YES;
} });
如果您想将其限制为单个服务并且仅启动/停止/重新启动,请使用如下内容:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
subject.isInGroup("foogroup")) {
if (action.lookup("unit") == "foo.service") {
var verb = action.lookup("verb");
if (verb == "start" || verb == "stop" || verb == "restart") {
return polkit.Result.YES;
}
}
}
});
答案2
我一直在寻找解决方案,但找不到真正令我满意的解决方案。一个令人满意的解决方案是在 中提供组支持systemd
。但我找到了这个解决方法。假设您要授予访问权限的用户是ann
、ben
和chris
。他们都应属于一个组awesomeproject
。
- 创建一个新用户
awesomeproject
并将用户添加到 组中awesomeproject
。
sudo adduser awesomeproject
sudo usermod -a -G awesomeproject ann
sudo usermod -a -G awesomeproject ben
sudo usermod -a -G awesomeproject chris
systemctl
将组中的所有用户添加到该新用户的sudoers 中。
sudo visudo
这些条目必须如下所示:
ann ALL=(awesomeproject) NOPASSWD: /bin/systemctl
ben ALL=(awesomeproject) NOPASSWD: /bin/systemctl
chris ALL=(awesomeproject) NOPASSWD: /bin/systemctl
与其将它们放入/etc/sudoers
,根据发行版的不同,最好将它们放入/etc/sudoers.d/awesomeproject
而不是使用sudo visudo -f /etc/sudoers.d/awesomeproject
。
相应地管理文件和目录的权限,以便组成员
awesomeproject
可以访问~awesomeproject
.以下命令现在应该适用于
ann
、ben
和chris
:
sudo awesomeproject systemctl ...