PAM によるユーザ認証

いかなるものであれ、ユーザにアクセス特権を与えるようなプログラムは、ユーザの認証機能を持つ必要があります。システムにログインする際に、ユーザはユーザ名とパスワードを提示し、ログインプロセスがその情報を使用してログインの認証、すなわちユーザが申請した身元が本人のものであることを検証します。パスワード以外の認証形式も可能であり、異なる方法でパスワードを格納することもできます。

PAM、すなわち Pluggable Authentication Modules の略、は認証プログラムをリコンパイルしなくても、システム管理者が認証ポリシーを設定できるようにする一つの方法です。PAM を使用する場合は、設定ファイルを編集することによってプログラムにモジュールをプラグインする方法を制御してください。

ほとんどの Red Hat Linux ユーザはこの設定ファイルに触れる必要はありません。認証を必要とするプログラムを RPM を使用してインストールする場合、それらのプログラムは通常のパスワード認証を実行するために必要な変更を自動的に行います。ただし、設定をカスタマイズしたい場合もあるでしょう。その場合には設定ファイルを理解しなければなりません。

PAM モジュール

PAM 標準で定義される 4 つのタイプのモジュールがあります。

これらのモジュールをスタックすることによって、複数のモジュールを使用することができます。たとえば、通常 rlogin は少なくとも 2 つの認証手段を利用します。rhosts の認証が成功した場合には、それをもって接続を許可することができます。失敗した場合には、標準のパスワード認証が実行されます。

いつでも新しいモジュールを追加することができます。その場合、PAM を認識するアプリケーションにそれらのモジュールを使用させることができます。たとえば、一時パスワード計算システムを使用しており、かつそのシステムをサポートするようなモジュールを作成することができる場合 (モジュールの作成方法に関するドキュメントは、/usr/doc/pam* に含まれています)、リコンパイルや修正を実行しなくても、PAM を認識するプログラムは、新しいモジュールを使用し、新しい一時パスワード計算システムと連動することができます。

サービス

PAM を使用する各プログラムは、独自の「サービス」名を定義します。login プログラムはサービスタイプ login を定義し、ftpd はサービスタイプ ftp を定義します。等々。一般に、サービスタイプはサービスにアクセスするために使用されるプログラムの名前であり、サービスを提供するために使用されるプログラムの名前ではありません (違いがある場合)。

設定ファイル

ディレクトリ /etc/pam.d はすべての PAM アプリケーションを設定するために使用されます。(以前の PAM のバージョンでは、これは /etc/pam.conf でした。/etc/pam.d/ エントリが見つからない場合には引き続き pam.conf ファイルが読み込まれますが、その使用は重要視されません。)各アプリケーション (実際は、各サービス) は独自のファイルを持っています。ファイルは以下のようになります。

#%PAM-1.0
auth      required  /lib/security/pam_securetty.so
auth      required  /lib/security/pam_pwdb.so shadow nullok
auth      required  /lib/security/pam_nologin.so
account   required  /lib/security/pam_pwdb.so
password  required  /lib/security/pam_cracklib.so
password  required  /lib/security/pam_pwdb.so shadow nullok use_authtok
session   required  /lib/security/pam_pwdb.so
        

先頭行はコメントです。(# 文字で始まる行は、すべてコメントです。)2 行目から 4 行目ではログイン認証で使用するモジュールを列挙しています。2 行目は、ユーザが root としてのログインを試行したならば、かつ /etc/securetty ファイルが存在するならば、ログイン試行時に使用された tty がこのファイルにリストされていることを確認します。3 行目によって、ユーザはパスワードを要求され、そのパスワードがチェックされます。4 行目は /etc/nologin ファイルが存在するか否かをチェックし、存在する場合にはそのファイルの内容を表示し、ユーザが root でない場合には、そのユーザをログインさせません。

最初のモジュールが失敗した場合であっても 3 つのモジュールのすべてがチェックされることに注意してください。これはセキュリティの決定です - 認証が拒否された理由をユーザに悟られないように設計されています。なぜならば、拒否された理由を知ることによって認証を突破することが容易になる可能性があるからです。この動きを変更するには、requiredrequisite に変更します。requisite モジュールから失敗という結果が返された場合、その他のモジュールをコールすることなく、PAM 認証は即座に失敗します。

5 行目によって必要なアカウント処理が実行されます。たとえば、シャドウパスワードが有効な場合、pam_pwdb.so モジュールは、アカウントの期限が切れていないか、またはユーザがパスワードを変更していないか、およびパスワード変更に関する猶予期間が切れていないか、をチェックします。

6 行目は新規に変更されたパスワードに対して一連のテストを実行することにより、そのパスワードがパスワードに対する辞書型攻撃プログラムによって簡単に判明するものでないこと、などを確認します。

7 行目 (複数行になることもあります) によって、login プログラムがユーザのパスワードを変更する際には、pam_pwdb.so モジュールを使用させることを指定しています。(そのようなことが行われるのは、シャドウパスワードの期限が切れた場合などに、auth モジュールがパスワードを変更する必要があると判断した場合に限られます。)

最後の 8 行目は、pam_pwdb.so モジュールを使用してセッションを管理することを指定しています。現在のところ、このモジュールは何も行いません。したがって、必要なモジュールと置き換える (またはスタックすることで補足する) ことができます。

各ファイル内の行の順序が重要であることに注意してください。実際には required モジュールのコール順序はさして重要ではない一方で、その他の制御フラグを利用することができます。optional が使用されることはめったになく、Red Hat Linux システムでデフォルトで使用されることはまったくありません。sufficient および requisite では順序が重要になります。

rlogin 用の auth 設定を見てみましょう。

auth  required    /lib/security/pam_securetty.so
auth  sufficient  /lib/security/pam_rhosts_auth.so
auth  required    /lib/security/pam_pwdb.so shadow nullok
auth  required    /lib/security/pam_nologin.so
        

これはほとんど login のエントリと同じですが、特別のモジュールを指定するための特別な行があり、かつモジュールの指定順序が異なっています。

まず pam_securetty.so は、安全ではないターミナルから root のログインが行われないようにします。これにより、root による rlogin 試行のすべてが効果的に拒否されます。許可したい場合 (その場合には、インターネットに接続しないか、または優れたファイアウォールを設置することをお奨めします) には、この行を削除するだけで済みます。

第二に、pam_rhosts_auth.so によるユーザ認証が成功した場合、PAM はパスワードチェックを実行せずに、ただちに rlogin に対して成功という結果を返します。pam_rhosts_auth.so によるユーザ認証が失敗した場合、その失敗した認証は無視されます。

第三に、pam_rhosts_auth.so によるユーザの認証が失敗した場合には、pam_pwdb.so モジュールによる通常のパスワード認証が実行されます。

最後に、上記で指定したようにして pam_nologin.so/etc/nologin をチェックします。

securetty チェックが失敗した場合にパスワードの入力を要求したくない場合には、pam_securetty.so モジュールを required から requisite に変更すれば良いことに注意してください。

シャドウパスワード

pam_pwdb.so モジュールはシャドウパスワードが使用されていることを自動的に検出し、必要な調整処理をすべて実行します。詳細については、 シャドウユーティリティ を参照してください。

Rexec と PAM

セキュリティ上の理由から、rexec は Red Hat Linux 6.2J では有効化されていません。有効化したい場合には、/etc/pam.d/rexec ファイルに含まれる一行をコメントアウトする必要があります。以下にそのファイルの例を示します (実際のファイルと多少異なることがあることに注意)。

#%PAM-1.0
auth       required     /lib/security/pam_pwdb.so shadow nullok
auth       required     /lib/security/pam_nologin.so
account    required     /lib/security/pam_pwdb.so
        

rexec を有効化するには、pam_nologin.so モジュールを参照する行をコメントアウトしなければなりません。

#%PAM-1.0
auth       required     /lib/security/pam_pwdb.so shadow nullok
#auth      required     /lib/security/pam_nologin.so
account    required     /lib/security/pam_pwdb.so
        

このファイルを修正した後で、rexec が有効になります。

注意注意
 

/etc/pam.d/rexec ファイルに pam_securetty.so モジュールを参照する行が含まれている場合には、root として rexec を実行することができなくなります。実行したい場合には、pam_securetty.so モジュールを参照した行をもコメントアウトしなければなりません。

詳細情報

これは PAM の紹介にすぎません。詳細情報は /usr/doc/pam* ディレクトリに含まれています。その情報には、「System Administrators' Guide」「Module Writers' Manual」「Application Developers' Manual」、および「PAM standard、DCE-RFC 86.0」が含まれています。