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

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

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

　より細かい環境については，[ブログ][blogtop]を参考にしてください．
 
　また，今回の内容はブログの第9,10,11回により詳しく掲載しておりますので参考にしてください．
 
#### [【第9回】目指せLinuxマスター(1) ~sudoersの管理~][a009]
#### [【第10回】目指せLinuxマスター(2) ~権限の制限~][a00a]
#### [【第11回】目指せLinuxマスター(3) ~polkitの設定~][a00b]
 
# グループの定義
　まず，ユーザーとグループを設定していきます．「**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) ~ユーザー・グループの管理~][qiita]
 
```shell-session
$ 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コマンド][qiita2]

```vim:/etc/sudoers
(省略)

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

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

　SHUTDOWNという**コマンドエイリアス**を作りました．上の行に戻ってエイリアスの設定をしましょう．コマンドモードで`?Cmnd_Alias`と打って次の位置まで戻ります．
 
```vim:/etc/sudoers
(省略)

## Drivers
# Cmnd_Alias    DRIVERS    /sbin/modprobe

# Defaults specification

(省略)
```

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

```vim:/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でログインし，次のコマンドを打ってみてください．

```shell-session
$ 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回][a006]) 
 
　では，consolehelperの実行権限を変えてみましょう．**chmod**コマンドを使います．
 
```shell-session
$ sudo chmod -v o-x /usr/bin/consolehelper
```

　これで，一般ユーザにはconsolehelperが使えなくなりました．
 
## ファイルの所有者・所有グループの変更

　次は，ファイルの所有グループを変えます．**chown**コマンドか**chgrp**コマンドを使います．ここではchownを使いましょう．`chown USERNAME:GROUPNAME FILENAME`という書式で使います．
 
```shell-session
$ sudo chown -v :users /usr/bin/consolehelper
```

　これで，usersグループはconsolehelperを使うことができます．
 
　試しに，suコマンドでusersグループではないaliceにログインしてhalt, rebootのフルパスを表示してみましょう．
 
```shell-session
$ su alice
$ which halt reboot
/sbin/halt
/sbin/reboot
```

　次に，usersグループのbobにログインして，同様に調べてみましょう．
 
```shell-session
$ 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`とすることはできません．
 
```shell-session
$ cd /etc/polkit-1
$ sudo vi localauthority/50-local.d/myConsoleKitSystem.pkla
```

　ここではusersだけに許可を与えてみましょう．
 
 ```vim: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?][b-1])，users以外の全ユーザーを書く方法しかうまくいかなさそうなので，ここではデフォルトの設定を変えてしまいます．これはあまり推奨されない方法です．アップデートの際に書き換えられてしまうので...
　Polkitの更新の際は注意しましょう．
 
　デフォルト設定は`/usr/share/polkit-1/action`以下で定義されています．pkactionで見られるような設定が書かれています．
 
```shell-session
$ cd /usr/share/polkit-1/action
$ ls
```

![polkit_default_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/df72fc62-4b1e-cfbd-8445-d003d1bc8901.png)

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

![polkit_default_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/07434ea2-69a0-ee52-625d-c1835003cb36.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からシャットダウンしようとしてみてください．いかがでしょうか．うまく設定できたでしょうか．

---- 以上

# 参考資料

* ##### [Red Hat Enterprise Linux 4: リファレンスガイド 章 16章. PAM（Pluggable Authentication Modules）][a-1]  
* ##### [Red Hat Enterprise Linux 4: リファレンスガイド 16.4. PAM設定ファイルのサンプル][a-2]
* ##### [いますぐ実践! Linuxシステム管理｜PAM をカスタマイズする][a-3]
* ##### [いますぐ実践! Linuxシステム管理｜システム管理ツールを気軽に使う][a-4]
* ##### [openSUSE 13.1: 第9章 PolKit を利用した権限認可][b-2]
* ##### [gnomeメニューからシャットダウンを消去][b-3]
* ##### [Polkit - ArchWiki][b-4]
* ##### [polkit: disable all users except those in group wheel?][b-1]


# こちらもよろしくお願いいたします．
### [エンリュの迷い森｜トップページ][blogtop]

[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage
[a006]: http://lost-in-forest.hatenablog.com/entry/a006
[a009]: http://lost-in-forest.hatenablog.com/entry/a009
[a00a]: http://lost-in-forest.hatenablog.com/entry/a00a
[a00b]: http://lost-in-forest.hatenablog.com/entry/a00b

[qiita]: http://qiita.com/LostEnryu/items/c21ac157908dd5f09c83
[qiita2]: http://qiita.com/LostEnryu/items/faa0905ffecdeb794af5


[a-1]: http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-pam-console.html
[a-2]: http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-pam-sample-simple.html
[a-3]: http://www.usupi.org/sysad/106.html
[a-4]: http://www.usupi.org/sysad/064.html

[b-1]: http://askubuntu.com/questions/184085/polkit-disable-all-users-except-those-in-group-wheel
[b-2]: https://www.google.co.jp/webhp?sourceid=chrome-instant&rlz=1C1ZKTG_jaJP687JP697&ion=1&espv=2&ie=UTF-8#q=Polkit++%E8%A8%AD%E5%AE%9A
[b-3]: http://www.maibun.org/~nt/technicalnote/debian7/noshutdown.html
[b-4]: https://wiki.archlinuxjp.org/index.php/Polkit