Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

 ここでは,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からシャットダウンしようとしてみてください.いかがでしょうか.うまく設定できたでしょうか.

---- 以上

参考資料

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

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

LostEnryu
情報システム,プログラミング,情報セキュリティなど,情報分野のありとあらゆることを勉強している学生です.研究は生物系です(←???).自分の投稿にはそれなりの責任を感じてはいますが,私の記事を参考に実行したことで生じたどんな損害・不利益に対しても責任は取りかねます.ただの迷子ですから.
http://lost-in-forest.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away