目指せLinuxマスター(壱) ~CUI/GUIからの強制終了/再起動権限~

  • 1
    いいね
  • 0
    コメント

 ここでは,CUIおよびGUIからの強制終了と再起動(halt, reboot, poweroff)の権限を特定のグループに限定する方法を記します.一般ユーザーが誤ってシステムを落とすと困る,といった場合には,この設定が必須となります.

環境

  • Cent OS 6.8
  • GNOME 2.28.2
  • PAM(/libpam.so) 0.82.2
  • Polkit(pkaction) 0.96

 より細かい環境については,ブログを参考にしてください.

 また,今回の内容はブログの第9,10,11回により詳しく掲載しておりますので参考にしてください.

【第9回】目指せLinuxマスター(1) ~sudoersの管理~

【第10回】目指せLinuxマスター(2) ~権限の制限~

【第11回】目指せLinuxマスター(3) ~polkitの設定~

グループの定義

 まず,ユーザーとグループを設定していきます.「users」というグループにシャットダウンや再起動を行える権限を与え,物理コンソールからのログインではユーザー権限で,それ以外でもsudoでroot権限を与えて実行できるようにします.また,GUIでもシャットダウン/再起動はusersのみに認め,それ以外はボタンの表示をなくします.

 用意するユーザー,グループは以下の通りです.

番号 名前 フルネーム 所属グループ
1 enryu Lost Enryu enryu, wheel, users
2 bob Bob Beck bob, users
3 alice Alice Atanasoff alice, guest-users

 CUIで設定していきます.下の操作でわからないことがあればこちらも参考にしてください.

Qiita:Linuxコマンド入門(3) ~ユーザー・グループの管理~

$ su -
# useradd bob -c "Bob Watson"
# useradd alice -c "Alice Walker"
# passwd bob
# passwd alice
# groupadd guest-users
# usermod enryu -aG wheel,users
# usermod bob -aG users
# usermod alice -aG guest-users
# groups enryu bob alice

CUIでの権限 ー visudoの編集

usersメンバーにシャットダウン関連コマンドを許可

 sudoに関する設定は,/etc/sudoersというファイルに記述されます.編集するときはvisudoコマンドを使います.shutdownを行えるユーザやホストに制限を設けましょう.viが起動したら/shutdownとして「shutdown」を検索します.

 viの操作が分からないときはこちらを参考にしてください.

Qiita:覚えておきたいviコマンド

/etc/sudoers
(省略)

## Allows members of the users group to shutdown this system
# %users        localhost=/sbin/shutdown -h now
    ↑この行を編集します↓
%users        localhost=SHUTDOWN
(省略)

シャットダウン関連コマンドの定義

 SHUTDOWNというコマンドエイリアスを作りました.上の行に戻ってエイリアスの設定をしましょう.コマンドモードで?Cmnd_Aliasと打って次の位置まで戻ります.

/etc/sudoers
(省略)

## Drivers
# Cmnd_Alias    DRIVERS    /sbin/modprobe

# Defaults specification

(省略)

 Driversの下にShutdownを追加します.

/etc/sudoers
(省略)

## Drivers
# Cmnd_Alias    DRIVERS    /sbin/modprobe

## Shutdown
Cmnd_Alias    SHUTDOWN   /sbin/shutdown, /sbin/init, /sbin/halt, /sbin/reboot, /sbin/poweroff

# Defaults specification

(省略)

 sudoersの設定は以上です.コマンドモードに戻り,:wqを入力しましょう.エラーメッセージなしで終了できればOKです.visudoのエラーが出たら,eで編集に戻ってどこか間違えていないか確かめましょう.

再起動して設定のチェック

 sudoersの設定が終わったら,再起動して設定を反映させましょう.suコマンドでログインしなおしても反映できます.bobでログインし,次のコマンドを打ってみてください.

$ sudo -l
(省略)
User bob may run the following commands on this host:
    (root) /sbin/shutdown, /sbin/init, /sbin/halt, /sbin/reboot, /sbin/poweroff

 末尾に表示されたのがこのアカウントのsudo権限で動かせるコマンドになります.無事bobはsudoコマンドでシャットダウン関連のコマンドをroot権限で実行できるようになりました.

CUI(物理コンソール)での権限 ー consolehelperの実行権限

一般ユーザに権限を与えるconsolehelper

 一般ユーザでもシステム管理コマンドであるhalt, reboot, poweroffを使うことができます.その仕組みは,

  • /usr/binにコマンドを実行するバイナリファイルがある
  • シンボリックリンクによりconsolehelperを呼び出している.
  • consolehelperが呼び出すPAM認証の中でpam_console.soの認証が行われる.
  • /etc/security/console.appsにコマンド名のファイルがある.

となっています.

 console.appsからファイルを削除する,PAMの設定ファイルにroot権限を要する一文を加える,などでも一般ユーザの権限を制限できますが,
 consolehelperは物理コンソールでのログインに限りroot権限が必要なコマンドをユーザ権限で実行できるようにするものであり,非常に便利な機能です.usersメンバーに限定してこの機能を継続して使っていけるように,ここではusersのみconsolehelperを使えるようにします.

consolehelperの実行ファイルの権限の変更

 ファイルの実行権限については以前お話ししました.ls -lで調べることができるパーミッション,ファイルの所有者,所有グループによって,そのファイルへのアクセス権限が決まっており,実行権限はその「x」が表しています.(第6回)

 では,consolehelperの実行権限を変えてみましょう.chmodコマンドを使います.

$ sudo chmod -v o-x /usr/bin/consolehelper

 これで,一般ユーザにはconsolehelperが使えなくなりました.

ファイルの所有者・所有グループの変更

 次は,ファイルの所有グループを変えます.chownコマンドかchgrpコマンドを使います.ここではchownを使いましょう.chown USERNAME:GROUPNAME FILENAMEという書式で使います.

$ sudo chown -v :users /usr/bin/consolehelper

 これで,usersグループはconsolehelperを使うことができます.

 試しに,suコマンドでusersグループではないaliceにログインしてhalt, rebootのフルパスを表示してみましょう.

$ su alice
$ which halt reboot
/sbin/halt
/sbin/reboot

 次に,usersグループのbobにログインして,同様に調べてみましょう.

$ exit
$ su bob        # ここでroot権限でsuを使わない.bobのパスワードを入力する.
$ which halt reboot
/usr/bin/halt
/usr/bin/reboot

 実行ファイルへのアクセスが,思い通りに制限されましたね.ちなみに,root権限でsuしてしまうと,/sbinの方が表示されるようになってしまいます.

 これでCUIからの強制終了/再起動の権限はusersメンバーに限定されました.

GUIでの権限 ー Polkitの設定

localauthorityへの追加

 最後にPolkitの設定ファイルを追加していきましょう./etc/polkit-1/localauthority以下に設定ファイルを追加します.侵入権限がないらしいので,途中まで入ったらsudoで設定ファイルを作りましょう.なお,cdはコマンドではないため,sudo cdとすることはできません.

$ cd /etc/polkit-1
$ sudo vi localauthority/50-local.d/myConsoleKitSystem.pkla

 ここではusersだけに許可を与えてみましょう.

myConsoleKitSystem.pkla
[ConsoleKit]
Identity=unix-group:users
Action=org.freedesktop.consolekit.system.*
ResultAny=no
ResultInactive=no
ResultActive=auth_self_keep

 念のために各自のパスワードを入力させるようにしました.

ポリシーのデフォルトの変更

 aliceをはじめとした非usersの規制をするには,先ほどのmyConsoleKitSystem.pklaの最初に,全ユーザー向けの設定を記述すればいい気がしますが,どうもそれだとうまく機能してくれません(似たようなことをしようといている投稿も見られましたが(polkit: disable all users except those in group wheel?),users以外の全ユーザーを書く方法しかうまくいかなさそうなので,ここではデフォルトの設定を変えてしまいます.これはあまり推奨されない方法です.アップデートの際に書き換えられてしまうので...
 Polkitの更新の際は注意しましょう.

 デフォルト設定は/usr/share/polkit-1/action以下で定義されています.pkactionで見られるような設定が書かれています.

$ cd /usr/share/polkit-1/action
$ ls

polkit_default_1.PNG

 シャットダウン関係のポリシーはorg.freedesktop.consolekit.policyになります.root権限でlessコマンドで見てみましょう.

$ su
# less org.freedesktop.consolekit.policy

polkit_default_2.PNG

 上の方はxmlファイルのおまじないです.<policyconfig>以下のタグがActionの設定です.これを見ると,allow_inactive,allow_activeなどのタグがありますね.これがResultActiveなどで設定した値のデフォルト値です.これを変えていくわけですね.

 vを押すことで編集モードに移ります.

 /allow_activeとして検索を行い,そのタグに囲まれた「yes」や「auth_admin_keep」などの値をすべて「no」に書き換えてしまいましょう.このファイル中には全部で4か所あります.

 できたら:wqでviを終え,lessに戻り,qでlessも終わりましょう.これで設定完了です.

 aliceやbobなど,ユーザーを切り替えてGUIからシャットダウンしようとしてみてください.いかがでしょうか.うまく設定できたでしょうか.

---- 以上

参考資料

こちらもよろしくお願いいたします.

エンリュの迷い森|トップページ