ここでは,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コマンド
(省略)
## Allows members of the users group to shutdown this system
# %users localhost=/sbin/shutdown -h now
↑この行を編集します↓
%users localhost=SHUTDOWN
(省略)
シャットダウン関連コマンドの定義
SHUTDOWNというコマンドエイリアスを作りました.上の行に戻ってエイリアスの設定をしましょう.コマンドモードで?Cmnd_Alias
と打って次の位置まで戻ります.
(省略)
## Drivers
# Cmnd_Alias DRIVERS /sbin/modprobe
# Defaults specification
(省略)
Driversの下にShutdownを追加します.
(省略)
## 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だけに許可を与えてみましょう.
[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
シャットダウン関係のポリシーはorg.freedesktop.consolekit.policy
になります.root権限でlessコマンドで見てみましょう.
$ su
# less org.freedesktop.consolekit.policy
上の方は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からシャットダウンしようとしてみてください.いかがでしょうか.うまく設定できたでしょうか.
---- 以上
参考資料
-
Red Hat Enterprise Linux 4: リファレンスガイド 章 16章. PAM(Pluggable Authentication Modules)
-
Red Hat Enterprise Linux 4: リファレンスガイド 16.4. PAM設定ファイルのサンプル
-
いますぐ実践! Linuxシステム管理|PAM をカスタマイズする
-
いますぐ実践! Linuxシステム管理|システム管理ツールを気軽に使う
-
openSUSE 13.1: 第9章 PolKit を利用した権限認可
-
gnomeメニューからシャットダウンを消去
-
Polkit - ArchWiki
-
polkit: disable all users except those in group wheel?