web-dev-qa-db-ja.com

ルート以外のユーザーがシャットダウンまたは再起動を発行しないようにする正しい方法は何ですか

学校や図書館で使用するマルチシートシステムをセットアップし、GDMが複数のXセッションを起動して、さまざまなユーザー/キーボード/モニターと同時に実行できるようにしたとします。

デフォルトでは、GnomeのDebian/Ubuntuでは、シャットダウンまたは再起動するためにrootである必要はありません。ただし、これは、すべてのユーザーが「再起動」または「シャットダウン」を選択して、他の3人のユーザーをキックオフできることを意味します。

サーバーへの物理アクセスをブロックしたため、サーバーは単に電源ボタンまたはリセットボタンを押すことができません。

GDM/Gnome /使用しているウィンドウマネージャーを介して通常のユーザーに公開される「シャットダウン」および「再起動」機能を無効にする正しい方法は何ですか?

9
thomasrutter

まず、ConsoleKitのシャットダウン機能は「シングルユーザー」と「マルチユーザー」を考慮することに注意してください 2つの異なる状況として –システムをシャットダウンするには、他のユーザーがログインしている場合は常に管理者認証が必要です。


このようなアクションはすべてPolicyKitによって管理されます。ポリシーを調整する場合は、polkit(8)– /etc/polkit-1/rules.d/20-disallow-shutdown.rulesで説明されているように調整できます。

 polkit.addRule(function(action、subject){
 if((action.id == "org.freedesktop.consolekit.system.stop" || 
 action.id == "org.freedesktop.consolekit.system.restart")&& 
 subject.isInGroup( "users")){
 return 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:に記載されています。

 [シャットダウンを許可しない] 
 ID =unix-group:users
 Action = org.freedesktop.consolekit.system.stop; org.freedesktop.consolekit.system.restart 
 ResultAny = no 
 ResultInactive = no 
 ResultActive =auth_admin

ザ・ ActionsはConsoleKit ポリシーファイル にリストされるか、pkactionを実行します。

3
user1686
  • 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認証を要求するロジックを追加します。

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.reboot" ||
        action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
        action.id == "org.freedesktop.login1.power-off" ||
        action.id == "org.freedesktop.login1.power-off-multiple-sessions") {
        if (subject.isInGroup("power")) {
            return polkit.Result.YES;
        } else {
            return 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
7
rofrol

@jakegouldの答えのより洗練された最新の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;

    }  

} );
0
lkraav