我有几个需要用户控制的服务,但我不能将它们用作用户服务(它们的要求是具有 root 访问权限的系统服务),而且还有一个奇怪的 GROUP/216 错误,我无法修复不管我尝试什么。
我已经创建了带有名称的模板服务[电子邮件受保护],因此必须将其启动为systemctl start my-daemon@<parameter>.service
.参数是字母数字字符串,不能有空格、制表符、特殊字符等。
我读过了仅以特定用户身份重新启动 systemd 服务?并尝试了“sudo 方法”,但由于我使用模板服务,它会产生相当大的安全问题。
允许用户 username 停止一项服务的 sudo 行示例:
username ALL= NOPASSWD: /bin/systemctl stop my-daemon@*.service
但是,我完全意识到这一行是安全噩梦,因为它也允许我执行此命令:
sudo systemctl stop my-daemon@xyz firewalld.service
这里有两个示例 polkit 文件,一个具有静态服务名称,第二个是模板。两者都在 /etc/polkit-1/rules.d/ 中:
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && action.lookup("unit") == "my-daemon2.service" && subject.user == "username") { return polkit.Result.YES; } });
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && action.lookup("unit") == "[email protected]" && subject.user == "username") { return polkit.Result.YES; } });
问题:
- 如何修复 sudo 语句,使其只允许我以用户用户名运行选定的服务?我读了这个人的文章,尝试自己修复它,但失败了。
- 我更喜欢使用polkit,我有polkit版本0.112,通过journalctl我可以看到polkit添加了新规则,但我无法获得正确的规则,即使当我尝试静态服务名称时它也不允许我控制它。我究竟做错了什么?
答案1
经过多次测试和研究,我终于可以回答自己了。
1)本身不可能。无法编写类似于 [a-zA-Z0-9_-]* 正则表达式的内容。如果我准确地知道字符串应该有多少个字符,那是可能的,但它会有所不同。
2) 正如我在评论中所说,选项 2 也已退出,我的 systemd 版本不需要 systemd 支持。升级所需的系统包是可能的,但我没有时间。
所以我选择了一个稍有改动的选项。我不允许用户直接控制服务,我允许启动脚本来执行我无法在 sudo 中执行的所有检查。如果一切顺利的话然后该服务被调用。