假设您已经设置了一个供学校或图书馆使用的多座位系统,允许 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;
}
});
规则应该已加载并且应该可以工作。参考如下。
答案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;
}
} );