防止特定用户关闭网络连接

有一个定制的Ubuntu 22.04系统,有4个用户:user_a,user_b,user_c,user_d。

我想防止2个用户(user_c,user_d)更改Ubuntu设置。我已经使用rbash锁定了这些用户的终端。

使用setfacl,已禁用了user_c,user_d的GNOME控制中心。这是通过在具有sudo特权的systemd服务中运行以下代码来完成的:

sudo setfacl -m g:user_c:- -R /usr/bin/gnome-control-center
sudo setfacl -m g:user_d:- -R /usr/bin/gnome-control-center

这有效地限制了用户C和用户D的访问权限,以至于他们甚至无法查看系统设置。用户C和用户D无法更改网络连接设置。例如,在用户C/用户D中,单击任何连接的“有线设置”都没有任何反应。这是可以接受的。请参见图像Ubuntu网络连接列表
现在的问题是:我们如何防止这些用户(用户C、用户D)打开/关闭网络连接?(即,我们如何隐藏连接下拉菜单中的“关闭”按钮)。
其他用户(用户A、用户B)仍然可以打开/关闭网络连接并更改设置。
1个回答

gnome-control-center通过D-Bus与NetworkManager进行网络配置交互。
即使用户无法运行gnome-control-center应用程序,他们仍然可以直接通过D-Bus与NetworkManager进行通信。例如,通过nmcli、nm-connection-editor或者纯粹的dbus-send。限制用户可以运行的程序是不起作用的,除非您只关心阻止那些不了解更多信息的用户。
限制对NetworkManager的访问权限是通过PolicyKit实现的。请参见nmcli general permissions以获取操作和用户权限的详细信息。配置PolicyKit以将其限制为特定用户。如何确切地做到这一点是一个较长的故事。
然而,大多数NetworkManager中的只读操作不会受到PolicyKit的检查。任何能够与D-Bus通信的用户都可以看到它们。要防止用户甚至看到它们,需要配置dbus-daemon(它也有可以防止用户看到NetworkManager API的策略)。这又是一个较长的故事。

最后,D-Bus通过使用Unix套接字(例如/var/run/dbus/system_bus_socket)工作。您还可以剥夺该用户对Unix权限的访问,以防止其访问D-Bus。然而,这可能会导致很多问题,因为D-Bus只是一种进程间通信机制,如果禁用了该机制,可能会限制用户的功能(取决于他们需要做什么)。

我们如何阻止这些用户(user_c,user_d)打开/关闭网络连接?

nmcli general permissions命令列出了org.freedesktop.NetworkManager.enable-disable-network PolicyKit权限。禁止该用户具备此权限。

编辑:可以通过在以下位置找到的PolicyKit文件来编辑org.freedesktop.NetworkManager.policy PolicyKit文件中的权限:

/usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy

对于以下操作,默认设置为“yes”的权限应更改为“auth_admin”。
org.freedesktop.NetworkManager.settings.modify.own
org.freedesktop.NetworkManager.network-control
org.freedesktop.NetworkManager.enable-disable-network 

是指允许任何用户执行该动作。 'auth_admin' 指需要管理员用户进行身份验证。
最初,我尝试仅修改 "org.freedesktop.NetworkManager.enable-disable-network" 动作的权限。 然而,我注意到非管理员仍然可以打开/关闭网络连接。所以我也包括了其他这些动作(如上所列)。 这可能有点过头了,但效果很好。
现在按预期工作:对于非管理员用户,禁用了配置网络连接的选项。管理员用户在输入密码后可以打开/关闭网络连接。
这些不同的动作和权限在 freedesktop.org/software/polkit/docs/latest/polkit.8.html 中有详细文档记录。