我正在创建一个运行 Azure SDK 的基于 Ubuntu 的服务器。我们客户所需的主要功能之一是服务器的 IP 地址配置。我以前曾使用 Cockpit 来完成此类任务,但我总是将它与我自己的特权(阅读:在 sudo 组中)用户结合使用。像这样运行驾驶舱允许所有我不想要的管理任务。
我现在想设置这个服务器的方式是不同的。我希望有一个普通的全访问用户四个我们的团队进行维护,但我也希望有一个只能更改服务器网络配置的“customeradmin”用户。
我已经阅读了很多关于 PolKit 和对权限的细粒度控制的文章,但我就是无法理解它。这是我到目前为止所尝试的:
- 将“customeradmin”用户添加到 sudo 组:当然可以,但用户也可以访问 cockpit 的其他部分,这是不行的
- 在 /usr/share/polkit-1/rules 中添加我自己的 .rules 文件:
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.NetworkManager.settings.modify.system" ||
action.id == "org.freedesktop.NetworkManager.network-control") &&
(subject.isInGroup ("sudo") || subject.isInGroup ("customeradmin"))) {
return polkit.Result.YES;
}
});
当我从终端运行 nmcli 命令时,这基本上没有改变,甚至权限都没有改变:
customeradmin@osboxes:/usr/share/polkit-1$ nmcli g permissions
PERMISSION VALUE
org.freedesktop.NetworkManager.enable-disable-network yes
org.freedesktop.NetworkManager.enable-disable-wifi yes
org.freedesktop.NetworkManager.enable-disable-wwan yes
org.freedesktop.NetworkManager.enable-disable-wimax yes
org.freedesktop.NetworkManager.sleep-wake no
org.freedesktop.NetworkManager.network-control yes
org.freedesktop.NetworkManager.wifi.share.protected yes
org.freedesktop.NetworkManager.wifi.share.open yes
org.freedesktop.NetworkManager.settings.modify.system auth
org.freedesktop.NetworkManager.settings.modify.own yes
org.freedesktop.NetworkManager.settings.modify.hostname auth
org.freedesktop.NetworkManager.settings.modify.global-dns auth
org.freedesktop.NetworkManager.reload auth
org.freedesktop.NetworkManager.checkpoint-rollback auth
org.freedesktop.NetworkManager.enable-disable-statistics yes
org.freedesktop.NetworkManager.enable-disable-connectivity-check yes
org.freedesktop.NetworkManager.wifi.scan unknown
运行pkexec nmcli g permissions
要求输入 admin 或 sudo 组中用户的密码(如中配置/etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf
)
- 的输出
journalctl -b
给了我一个关于无法以特权用户身份启动 cockpit-bridge 的错误:
Apr 29 11:08:43 osboxes pkexec[161495]: customeradmin: Error executing command as another user: Not authorized [USER=root] [TTY=unknown] [CWD=/run/user/1002] [COMMAND=/usr/bin/cockpit-bridge --privileged]
然后我添加了一个允许访问 customeradmin 组的 .rules 文件:
polkit.addRule(function(action, subject) {
if ((action.id == "org.cockpit-project.cockpit.root-bridge") &&
(subject.isInGroup ("sudo") || subject.isInGroup ("customeradmin"))) {
return polkit.Result.YES;
}
});
也无济于事。非常感谢所有帮助!