はじめに
Linuxでは (もちろん設定によりますが) su 等の特権を得るコマンドを、特定のグループ ( 通常は wheel ) に限定するという文化があります。
これは、現在ではPAM(Pluggable Authentication Module)のpam_wheelというモジュールで実現されていて、wheelに限らず任意のグループをその「特権を得られる」グループとして指定できますが、複数のグループを指定することはできません。
では、複数グループを指定したくなったらどうするか? というのが今回のお話です。
おさらい
では先に、pam_wheelの使い方についておさらいです。
以下は、CentOSでの ( pam_wheelを有効にした場合の ) 典型的な /etc/pam.d/su ファイルの内容です。
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
auth include system-auth
…
この場合のsuに関する設定意図としては、
- rootユーザに対しては無条件に許可する ( pam_rootok が sufficient )
- wheelグループ以外を拒否する ( pam_wheel が required )
- その後、system-auth ( CentOSでの共通設定 ) に応じた認証 ( 例えばパスワード等 ) もチェックする
ということになります ( PAMの設定は上から順に評価されていきます )。つまり、2行目の記述が典型的なpam_wheelの設定です。
もしwheel以外のグループを指定したいなら、pam_wheel.so use_uid group=MYGROUP
のように、group=オプションを使用します。
複数のグループ指定
ここで、pam_wheelのgroup=オプションには、複数のグループを指定する機能はありません。group=g1,g2 のようにすることはできないのです。
では、複数指定したい場合はどうするかというと、PAM自身の条件分岐の構文を利用します。以下は g1,g2,g3 のグループを指定する例です。
…
auth [success=2,ignore=2,default=ignore] pam_wheel.so use_uid group=g1
auth [success=1,ignore=1,default=ignore] pam_wheel.so use_uid group=g2
auth required pam_wheel.so use_uid group=g3
auth include system-auth
…
さて。PAMの設定では基本 requisite, required, sufficient, optional という制御指定を一般に使用しますが、これは良く使う挙動のプリセットに過ぎず、やろうと思えば「モジュールの戻り値=実行するアクション」という形で記述することで、細かく挙動を制御することができます。
その解説については、例えばnull-i.net - Linux/pamが詳しいですが、今回はスキップの機能を使います。スキップについては、例えばPAMで特定のユーザだけ別の認証をしたい場合に解説があります。
上の設定では、pam_wheelの結果 successとignoreに対し、数字によりスキップを指定しています。多分 success に指定する意味はないのですが、これは気分です。このようにすることで、
- 指定のグループにマッチした場合、pam_wheel の結果が ignore になることで数字で指定した分スキップが発動し、system-authの評価まで飛ぶ
- 指定のグループにマッチしなかった場合、default条件の指定によりそこの評価は無視され、次の行の評価に移る
- 最後 ( g3グループ ) の評価にもマッチしなかった場合、required の指定により認証失敗 ( ただし後続の評価は続ける ) となる
という挙動になります。結果として、g1,g2,g3以外のグループは拒否 ( g1,g2,g3は後続のsystem-authの結果次第 ) という設定を実現することができます。
おわりに
PAMについては、なかなかまとまった資料がなく、挙動を理解するのが難しい印象がありますが、一度理解してしまえば、ちょっとしたことが設定の調整で色々できるようになり便利です。何かの機会に設定を色々考えてみるのも良いのではないでしょうか。