読者です 読者をやめる 読者になる 読者になる

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

 皆さん,こんにちは. 迷子のエンリュです.

 記念すべき第10回?いえいえ,私の中ではまだ第0x0a回に過ぎません.

 今回は「目指せLinuxマスター第2回」ということで,権限の制御について考えていきたいと思います.具体的には,コマンドについて調べたり,コマンドの実行ファイルの権限を変えたりしていきます.よろしくお願いいたします.

 前回はsudoersを設定して,sudoコマンドの挙動を制御しました.しかし,実はまだ一般ユーザ(非usersメンバ)がシャットダウン系のコマンドを使うことができる状態です.GUIでも実行できますが今回はそれはおいておいて,CUIからのhalt,rebootなどの実行を,usersメンバーに限定します.

 それでは早速始めていきましょう.

環境

なぜ一般ユーザがシャットダウンできるのか

 先ほどから一般ユーザがシャットダウンできると言っておりますが,より細かくシャットダウンできる条件を調べてみましょう.

which ― コマンドのフルパスの表示

 whichコマンドは,Linuxコマンドが呼び出す実行ファイルのフルパスを調べるコマンドです.ほとんどのコマンドはバイナリファイルと呼ばれる機械語で書かれた実行ファイルを呼び出すことで,命令を実行しています.これを用いて,haltコマンドとshutdownコマンドを調べてみましょう.

$ which halt shutdown

f:id:LostEnryu:20161026132211p:plain

 shutdownコマンドは,/sbinに入っているからroot権限が必要なのです.ところで,sudoersの設定の時に/sbin/haltというファイルをSHUTDOWNに含めましたね.haltも/sbinに入っています.ではなぜhaltコマンドは/usr/bin/haltを参照するのでしょうか.今度は実行ファイルをls-lで詳しく見てみましょう.

$ ls -l /usr/bin/halt

f:id:LostEnryu:20161026132238p:plain

 パーミッションの前の「l」は,リンクを表します./usr/bin/haltはconsolehelperへのシンボリックリンクになっているのです.シンボリックリンクについてはここでは詳しく触れませんが,haltコマンドは/usr/bin/haltを呼び出し,これがさらに/usr/bin/consolehelperを呼び出しているのです.

man ― マニュアルの表示

 consolehelperって何でしょうか.調べてみましょう.今日はとにかく「調べる」方法特集ですね.今度はmanコマンドを使います.これは"manual"という意味で,マニュアルを表示します.Linuxでわかんないことがあったら,大体manで調べれば解決します.

$ man consolehelper

f:id:LostEnryu:20161026132335p:plain

 consolehelperはコンソールユーザーがシステムプログラムを使いたいときに使うもののようですね.ここでどうやらPAMというものが使われるようです.これについて少し見てみましょう.もちろんman pamで詳しい情報を知ることができます.

PAMによる認証

 PAMとは「Pluggable Authentication Modules」の略で,認証方式をまとめて管理し,変更しやすくするためのモジュールです.ログイン時やパスワード変更時,そして一般ユーザがシャットダウンを行おうとするときも,このPAMが認証を行います.

 rebootコマンドを行ったときのPAM認証の流れを少し見てみましょう.まずはPAMの設定ファイルがあるディレクトリに移動します.

# cd /etc/pam.d
# ls

f:id:LostEnryu:20161026132403p:plain

 シャットダウンや再起動に関わる,

の設定ファイルが入っています.

 これらのファイルをviエディタで開いてみましょう.

$ sudo vi reboot halt poweroff

f:id:LostEnryu:20161026132441p:plain

 何やらよくわからない分が羅列されていますね.各行の最初に書いてあるauth, accountというのが認証の種類,次のsufficient, requiredなどがアクション,そして最後が実際に認証を行うライブラリを表します.PAMの認証はauth, account, password, sessionの4つの段階すべてで成功する必要があります.何も書かれていない認証段階もありますが,それはデフォルトでOKということです.

 rebootでは,auth認証とaccount認証のクリアが条件ということです.各行の意味をざっくり説明しましょう.

内容 意味
1 #%PAM-1.0 おまじない
2 auth sufficient pam_rootok.so (auth認証)ルートであれば十分条件でクリア.そうでなければ次へ.
3 auth required pam_console.so (auth認証)物理コンソールからのログインで条件を満たしていればクリア.そうでなければ認証失敗.結果に関わらず次へ.
4 #auth include system-auth コメントアウトされているが,システムの認証方式を使って認証する.
5 account required pam_permit.so (アカウント認証)すべてクリア.

 つまり,ポイントは3行目のpam_console.soです.pam_console.soが認証を行うものは主に二つあります.デバイスの所有権とアプリケーションアクセスです.manコマンドでpam_consoleを調べると詳しいことが書いてありますが,/etc/security/console.appsにファイルのあるコマンドは,物理コンソールから実行することができるということです.

参考:Red Hat Enterprise Linux 4: リファレンスガイド 章 16章. PAM(Pluggable Authentication Modules)

consolehelperの使用をusersメンバーに限定

 これまでの調査で,一般ユーザがシステム管理コマンドであるhalt, rebootを使えた理由が分かってきました.まとめるとこんな感じです.

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

 consolehelperは実際非常に便利な機能です.usersメンバーに限定して,この機能は継続して使っていきたいですね.そこで,consolehelperの実行権限をusersに限定してみましょう.

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

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

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

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

 o-xというのは,「others」の「x」権限をなくす,という意味です.oの代わりに[u(ユーザ),g(グループ),a(全員)」を指定できます.また,権限を付与するときは「-」の代わりに「+」を指定します.

 これで,一般ユーザには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        # ここではsudoは使わない.bobのパスワードを入力する.
$ which halt reboot
/usr/bin/halt
/usr/bin/reboot

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

 今度は実際にhaltをbobで実行してみましょう.

$ halt
halt: Need to be root

 suでのログインでは物理コンソールでのログインとは見なされませんので,bobがhaltを実行してもPAMに弾かれてしまいます.

 exitして,enryuでhaltしてみましょう.

$ exit
$ halt

 今度は正常に終了できたでしょうか.このように,usersメンバーが物理コンソールでログインしたときに限り,sudoなしでhaltによるシャットダウンができました.同様に,rebootやpoweroffコマンドも実行することができます.

次回

 今回は権限の制御ということで,コマンドの実行ファイルを調べたり,PAMによる認証を覗いたり,実行ファイルの権限を変更したりしました.

 まだGUIからのシャットダウンができてしまう点が解決されていませんね.次回は,usersのメンバー以外のGUIのメニューから,シャットダウン,再起動のボタンを消してしまいます.usersじゃない人はログアウトしてね,ということですね.これはPolkitの設定を変えることで実現できます.

 それでは次回もよろしくお願いします.

PAM, consolehelperの使い方がこちらで紹介されています

Red Hat Enterprise Linux 4: リファレンスガイド 16.4. PAM設定ファイルのサンプル
いますぐ実践! Linuxシステム管理|PAM をカスタマイズする
いますぐ実践! Linuxシステム管理|システム管理ツールを気軽に使う
Previous | Top | Next

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

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

Index
Journey