PAMの仕組みを知りたい

 Red Hatディストリビューションでは,ユーザー認証のためにPAM(Pluggable Authentication Modules)と呼ばれるモジュールが用意されている。

 通常,サーバに接続する際には認証プログラムが動作して各サービスへ接続される。この認証部分のみを独立させることで各サービス(ftpdなど)ごとに基本的な認証設定をしなくて済むよう配慮されているのだ。各サーバソフトをリコンパイルする必要なく,PAMサポートという形で共通のユーザー認証が実現できる。

 認証に関わる設定ファイルは,/etc/pam.d/下に用意されている。プログラムに認証モジュールをプラグインする形で制御を行っているのだ。下のファイル構成例は,Red Hat Linux 6.2のものである。

$ ls -l /etc/pam.d/
total 19
-rw-r--r-- 1 root root  336 Sep91999 chfn
-rw-r--r-- 1 root root  336 Sep91999 chsh
-rw-r--r-- 1 root root  116 Jun 101999 imap
-rw-r--r-- 1 root root  157 Sep91999 kbdrate
-rw-r--r-- 1 root root  116 Dec 151999 linuxconf
-rw-r--r-- 1 root root  545 Dec 151999 linuxconf-pair
-rw-r--r-- 1 root root  437 Mar 282000 login
-rw-r--r-- 1 root root  210 Sep 251999 other
-rw-r--r-- 1 root root  250 Mar 282000 passwd
-rw-r--r-- 1 root root  116 Jun 101999 pop
-rw-r--r-- 1 root root  116 Oct 172000 pop3
-rw-r--r-- 1 root root  155 Sep 201999 ppp
-rw-r--r-- 1 root root  216 Jul 311999 rexec
-rw-r--r-- 1 root root  443 Mar 282000 rlogin
-rw-r--r-- 1 root root  204 Jul 311999 rsh
-rw-r--r-- 1 root root 97 Sep 261999 samba
-rw------- 1 root root  410 Jul 162000 sshd
-rw-r----- 1 root root  330 Jul 262000 su
-rw-r--r-- 1 root root 70 Feb92000 vlock

 この中で例えば,Sambaの認証ファイルを見てみよう。ここでのポイントは,2つの種類の認証がされていることである。さらに「auth」,「account」,「required」の文字列の意味を理解できればSambaでのPAM認証プロセスが分かるだろう。

$ cat /etc/pam.d/samba
auth   required   /lib/security/pam_pwdb.so nullok shadow
account required   /lib/security/pam_pwdb.so

 PAMには次の4つのモジュールタイプがある。このタイプ別に定義することで,特定のサービスへのアクセスを制御するのだ。

■PAM認証モジュール
記 号 設 定 内 容
auth 大元となる認証チェック(パスワードの要求および真偽のチェック)を行い,グループ属性による制限,またはKerberos「チケット」などの「証明書」も設定を行う
account 認証が許可されることをチェックする(アカウントの期限切れ,ユーザーがログインする時間帯に制限がないかなどを確認するのだ)
password パスワード設定に使用される
session ユーザーが認証された後で使用される指定。sessionモジュールによってユーザーが自分のアカウントを使用できるようになるのだ(たとえば、ユーザーのホームディレクトリをマウントしたり、メールボックスを利用できるようになります)

■PAM制御フラグ
記 号 設 定 内 容
required 許可される認証順序で完全にチェックされなければならない。このモジュールでのチェックが失敗すると,同じタイプのほかのモジュールがチェックされるまではユーザーへ通知がされない状態になる
requisite 許可される認証順序で完全にチェックされなければならない。ただし, このモジュールのチェックが失敗した場合では,requiredまたはrequisitが最初に失敗したことを知らせるメッセージが通知される
sufficient このチェックが失敗した場合には,認証そのものが破棄される。ただし,このフラグチェックが成功してrequiredフラグも認証された場合には,このタイプのほかのモジュールはチェックされず成功したものと判断される
session このタイプのフラグは真偽が重要ではない。このタイプのモジュール以外すべてが成功,または失敗した際に意味を成すフラグである。この際には,成功または失敗したフラグによってモジュールタイプ全体のPAM認証が決定されるのだ