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

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

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

默认情况下,在 Debian/Ubuntu 的 Gnome 中,您无需以 root 身份即可关机或重启。但这意味着任何用户都可以选择“重启”或“关机”并踢出其他三个用户。

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

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

答案1

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


所有这些操作均由 PolicyKit 管理。如果您想要调整策略,可以按照 polkit(8) 中的说明进行操作 – /etc/polkit-1/rules.d/20-disallow-shutdown.rules

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

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

[禁止关机]
身份=unix 组:用户
操作=org.freedesktop.consolekit.system.stop;org.freedesktop.consolekit.system.restart
ResultAny=否
结果无效=否
结果活动=管理员权限

Action在 ConsoleKit 中列出政策文件或者运行pkaction

答案2

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

可用操作

pkaction
# or /usr/share/polkit-1/actions/

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

添加规则

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

journalctl -f

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

在此文件中,我们添加逻辑来检查操作并允许组users内操作power或要求su授权:

const power_actions = [
  'org.freedesktop.login1.reboot',
  'org.freedesktop.login1.reboot-multiple-sessions',
  'org.freedesktop.login1.power-off',
  'org.freedesktop.login1.power-off-multiple-sessions'
];

polkit.addRule(function ({ id }, subject) {
  if (power_actions.includes(id)) {
    return subject.isInGroup('power') ? polkit.Result.YES : polkit.Result.AUTH_ADMIN;
  }
});

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

  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

答案3

这是一个更加精致和现代的 ES6 版本。

/etc/polkit-1/rules.d/20-disable-unprivileged-power-controls.rules

/* jshint esnext:true */                                                                                                                                                                                                                      

/**
 * @see https://superuser.com/questions/354678/what-is-the-correct-way-to-prevent-non-root-users-from-issuing-shutdowns-or-rebo
 * @since 2019.05.26
 */
polkit.addRule( function(action, subject) {
 
    const power_actions = [
        'org.freedesktop.login1.reboot',
        'org.freedesktop.login1.reboot-multiple-sessions',
        'org.freedesktop.login1.power-off',
        'org.freedesktop.login1.power-off-multiple-sessions',
    ]; 

    if ( power_actions.includes( action.id ) ) {

        let result = polkit.Result.AUTH_ADMIN;

        if ( subject.isInGroup( 'wheel' ) ) {
            result = polkit.Result.YES;
        }

        return result;

    }  

} );

相关内容