防止非 root 用户发出关机或重启的正确方法是什么

tho*_*ter 10 linux privileges reboot gdm multiseat

假设您已经设置了一个用于学校或图书馆的多座位系统,允许 GDM 启动多个 X 会话以与不同的用户/键盘/显示器同时运行。

默认情况下,在 Gnome 的 Debian/Ubuntu 中,您不必以 root 身份关闭或重新启动。但这意味着任何用户都可以选择“重新启动”或“关闭”并启动其他三个用户。

您已阻止对服务器的物理访问,因此他们无法简单地按下电源或重置按钮。

禁用通过 GDM/Gnome/您使用的任何窗口管理器向普通用户公开的“关闭”和“重新启动”功能的正确方法是什么?

rof*_*rol 9

  • pklocalauthority 已弃用
  • 您需要带有 logind 和 polkit 的 systemd。

可用操作

pkaction
# or /usr/share/polkit-1/actions/
Run Code Online (Sandbox Code Playgroud)

你应该看看 /usr/share/polkit-1/actions/org.freedesktop.login1.policy

添加规则

首先开始监控系统消息,这样我们就可以看看我们的新规则是否有效:

journalctl -f
Run Code Online (Sandbox Code Playgroud)

然后创建文件/etc/polkit-1/rules.d/60-noreboot_norestart.rules(在javascript中)。

在这个文件中,我们添加逻辑检查行动,并允许userspower组或需要su授权:

pkaction
# or /usr/share/polkit-1/actions/
Run Code Online (Sandbox Code Playgroud)

应该加载规则并且它应该可以工作。参考如下。

  1. https://lists.fedoraproject.org/pipermail/users/2013-September/440457.html
  2. https://wiki.archlinux.org/index.php/Polkit#Authorization_rules
  3. http://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html
  4. https://bbs.archlinux.org/viewtopic.php?pid=1335204#p1335204

  • 您确定需要返回 `polkit.Result.NO` 吗?我原以为允许“power”组中的用户使用 `polkit.Result.YES` (2认同)

use*_*686 3

首先请注意,ConsoleKit 的关闭功能将“单用户”和“多用户”视为两种不同的情况- 如果其他用户登录,则关闭系统始终需要管理员身份验证。


所有此类操作均由 PolicyKit 管理。如果你想调整策略,你可以按照 polkit(8) 中的描述进行操作 – /etc/polkit-1/rules.d/20-disallow-shutdown.rules

polkit.addRule(函数(动作,主题){
    if ((action.id == "org.freedesktop.consolekit.system.stop" ||
         action.id == "org.freedesktop.consolekit.system.restart") &&
        subject.isInGroup("用户") ) {
            返回主题.活动?polkit.Result.AUTH_ADMIN : polkit.Result.NO;
    }
});

PolicyKit 0.105 及更早版本在pklocalauthority(8)中记录了这一点– /etc/polkit-1/localauthority/50-local.d/20-disallow-shutdown.pkla

[禁止关机]
身份= unix-group:用户
操作=org.freedesktop.consolekit.system.stop;org.freedesktop.consolekit.system.restart
结果任意=否
结果无效=否
结果活动= auth_admin

这些Action在 ConsoleKit策略文件中或通过运行pkaction.