レベル: 初級 Vishal Srivistava, Assocaite Software Engineer, IBM
2009年 03月 10日 PAM (Pluggable Authentication Module) API は、アプリケーションのプログラミングに使用するセキュリティー関連の一連の関数 (ユーザー認証、データの暗号化、LDAP など) を公開しています。この記事では Linux での PAM モデルの基本と PAM の構成方法を紹介し、また PAM を使ったサンプル・ログイン・アプリケーションを簡単な 10 段階のステップで設計する方法を学びます。
Linux ユーザーにとって、ファイルの共有をセキュアに行えるようにするのは非常に厄介なことです。例えば、苦労していくつものパスワードを覚えておかなければならなかったり、システムにアクセスするアプリケーション (login、su、password、ftp など) の再設計に時間がかかったりします。さらに大変なのは、システムが認証プロセスによってユーザーを識別し、そのユーザーに応じたアクセス制御を行えるように、認証プロセスを用意しなければならないことです。
PAM を利用するに至る来歴と PAM の概要
PAM は、あるサービスに対するユーザー認証を行うための API です。PAM が登場する以前には、login、rlogin、telnet、rsh などのアプリケーション は、ユーザーが入力したユーザー名に対し、/etc/passwd の中にあるユーザー名を検索して比較することで認証を行う必要がありました。すべてのアプリケーションがこうした共有サービスを使用しますが、実装の詳細や、そうした詳細を構成するための権限は共有されませんでした。
次の段階として、アプリケーション開発者達は独自のプロセスをコーディングしようとしました。それに伴い、アプリケーションとセキュリティー・モジュールとを分離する必要が出てきました (共通のセキュリティー・モジュールはアプリケーション間で共有することができ、また必要に応じて構成することができます)。
PAM のメカニズムでは、下位レベルにあるさまざまな認証スキームを上位レベルの 1 つの API に統合しているため、認証を必要とするプログラムを作成する場合、ベースにある認証スキームを意識する必要がありません。PAM の大きな特徴は、/etc/pam.d ファイルまたは /etc/pam.conf ファイルによって認証を動的に構成できることです。
PAM を構成することによって、特定のプログラムによるユーザー認証権限を拒否したり、特定のプログラムが認証を行おうとすると警告したりすることができます。PAM プログラムは PAM モジュール (認証モジュール) を使用します。つまり PAM モジュールが機能するためには、アプリケーションの実行時には PAM モジュールがアプリケーションに組み込まれている必要があります。
図 1 は PAM モデルの基本的なフローを示しています。
図 1. PAM ライブラリーが構成ファイルを解析し、構成ファイルにモジュールをロードする
PAM をサポートするオペレーティング・システム
PAM は当初 1995年に Sun Microsystems によって開発され、現在は以下のバージョン (あるいはそれ以上) のオペレーティング・システムでサポートされています。
- RedHat 5.0
- SUSE 6.2
- Debian 2.2
- Mandrake 5.2
- Caldera 1.3
- TurboLinux 3.6
また PAM は Solaris™、AIX®、HP-UX、Mac OS® X の最新バージョンでもサポートされています。PAM はその後、(XSSO (X/Open single sign-on service) アーキテクチャーの) X/Open UNIX® 標準化プロセスの一環として標準化されました。
PAM の種類
厳密に PAM を分類することはできませんが、PAM には大まかに以下の 3 種類があります。
- Linux-PAM: Linux-PAM は、この記事で説明する PAM の機能をすべて備えています。どの Linux プラットフォームで使用する場合であれ、PAM のメイン・アーキテクチャーは Linux-PAM に似ています。
- OpenPAM: OpenPAM は NAI 研究所の Dag-Erling Smorgrav が DARPA-CHATS 研究プログラムの一環として開発した、もう 1 つの PAM の実装です。OpenPAM はオープンソースであるため、主に FreeBSD や NetBSD、アプリケーション (そして Mac OS) などで使われています。
- Java™ PAM または JPam: PAM は基本的に、Linux と UNIXをサポートする標準的な認証モジュールです。JPam は Java 部分と通常の PAM との間のブリッジとして動作します。JPam を利用することで、Java ベースのアプリケーションで PAM のモジュールや機能 (auth、account、passwd、session など) を使用できるようになります。JPam は JAAS とダイレクト API の機能を持ち、大部分の UNIX OS とアーキテクチャーに対応しています。
これらの PAM はそれぞれ異なりますが、基本的な機能は同じです。
PAM モジュールとはどのようなものか
PAM のインストールは、ステップバイステップのプロセスです。インストール方法については「参考文献」を参照してください。
PAM モジュールはモジュールのタイプによって分類することができます。すべてのモジュールは以下の 4 つのモジュール・タイプの機能のうち、少なくとも 1 つを実装する必要があります。
- 認証 (auth) モジュールは、ユーザーの認証や、クレデンシャルの設定と破棄に使われます。
- アカウント管理 (account) モジュールは、アクセスや、アカウントとクレデンシャルの有効期限切れ、パスワードの制限やルールなどに関連するアクションを実行します。
- セッション管理 (session) モジュールは、セッションの初期化と終了のために使われます。
- パスワード管理 (password) モジュールは、パスワードの変更と更新に関連するアクションを実行します。
PAM には、シングル・サインオン認証、アクセス制御など、さまざまな機能があります。それぞれの機能は別々のモジュールによって実行されます。主なモジュールには以下のようなものがあります。
pam_access は /etc/security/access.conf の中に事前定義されたルールに基づいて、ログイン名とドメイン名を使ってログ・デーモン・スタイルのログイン・アクセス制御を行います。
pam_cracklib はパスワード・ルールに基づいてパスワードのチェックを行います。
pam_env は /etc/security/pam_env_conf の環境変数の設定 (set) と設定解除 (unset) を行います。
pam_debug は PAM をデバッグします。
pam_deny は PAM モジュールをロックアウトします。
pam_echo はメッセージを出力します。
pam_exec は外部コマンドを実行します。
pam_ftp は匿名アクセスのためのモジュールです。
pam_localuser を利用するためにはユーザーが /etc/passwd のリストに載っている必要があります。
pam_unix は /etc/passwd による従来のパスワード認証を行います。
その他にも、pam_userdb、pam_warn、pam_xauth など多くのモジュールがあります。これらのモジュールには戻り値一式があります。(これらのモジュールの詳細については「参考文献」に挙げた PAM の管理ガイドを参照してください)。
PAM を構成する
PAM の構成は通常、/etc/pam.d または /etc/pam.conf (古いバージョンの場合) の中にある構成ファイルの中で行われます。
構成ファイルの構造
上記ディレクトリー内には、PAM を使用する各サービスに対応するファイルがあります。そのファイルには、そのサービスに対する認証情報とアカウント情報の取得方法に関するルールや手順が含まれています。通常は 1 行に 1 つのルールがあります。
PAM の構成ファイルのフィールドには以下のものが含まれています。
Service_name はサービスやアプリケーションの名前を指定します (デフォルトは OTHER です)。
Module_type は、Service_name フィールドの中の対応するサービスのモジュール・タイプ (auth/account/session/passwd) を指定します。
Control_flag はモジュールのスタック動作を指定します。取り得る値は requisite、required、sufficient、optional です。
Module_path は、そのモジュールを実装するライブラリー・オブジェクトへのパス名を指定します。Module_path はデフォルトで /lib/security に設定されます。
Module_options/module_args (オプション・フィールド) はサービス・モジュールに渡されるオプションつまり引数を指定します。
モジュールの呼び出しは構成ファイルの中に記載された順に、各エントリーに対して許可されている Control_flag に応じて行われます。Control_flag は以下の値を取ります。
- required: スタックの中にあるすべての required モジュールで成功しなければなりません。もし 1 つでも required モジュールが失敗すると、スタックの中にあるすべての required モジュールは実行されますが、最初に発生したエラーが返されます。
- sufficient: sufficient というフラグが立てられたモジュールが成功し、それまでに required モジュールまたは sufficient モジュールが失敗していない場合には、スタックの中にある残りのモジュールはすべて無視され、success が返されます。
- optional: スタックの中に required モジュールがなく、それまでに成功した sufficient モジュールがない場合には、(サービスまたはアプリケーションの) 少なくとも 1 つの optional モジュールで成功しなければなりません。
PAM の構成ファイルの例
表 1 は、さまざまなオペレーティング・システムでの PAM の構成ファイルの例を示しています。
表 1. さまざまなオペレーティング・システムでの PAM の構成ファイルの例
| システム | 構成ファイルのある場所 | タイプ | Control_flag の値 | モジュール |
|---|
| Red Hat | /etc/pam.d | auth | required | /lib/security/pam_unix.so | | Red Hat | /etc/pam.d | account | sufficient | /lib/security/pam_unix.so | | Red Hat | /etc/pam.d | session | required | /lib/security/pam_limit.so | | AIX | /etc/pam.conf | auth | required | /usr/lib/security/pam_aix | | AIX | /etc/pam.conf | account | required | /usr/lib/security/pam_aix | | AIX | /etc/pam.conf | password | required | /usr/lib/security/pam_aix | | zSUSE 64-bit | 32-bit | /etc/pam.conf | auth | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so | | zSUSE 64-bit | 32-bit | /etc/pam.conf | account | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so | | zSUSE 64-bit | 32-bit | /etc/pam.conf | session | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so | | Solaris | /etc/pam.conf | auth | required | /usr/lib/security/pam_unix.so.1 | | Solaris | /etc/pam.conf | account | required | /usr/lib/security/pam_unix.so.1 | | Solaris | /etc/pam.conf | password | required | /usr/lib/security/pam_unix.so.1 | | HP-UX | /etc/pam.conf | auth | required | libpam_unix.so.1 | | HP-UX | /etc/pam.conf | account | required | libpam_unix.so.1 | | HP-UX | /etc/pam.conf | password | required | libpam_unix.so.1 |
PAM の「その他の」ファイル
PAM のデフォルトの構成ファイル /etc/pam.d は、明示的には構成されていない他のすべてのサービスで使われ、PAM の動作の元となるデフォルトのファイルの中でおそらく最も単純で堅牢な構成のファイルです。このファイルの内部は以下のようになっています。
/etc/pam.d/other File
auth required pam_warn.so
auth required pam_deny.so
account required pam_warn.so
account required pam_deny.so
password required pam_warn.so
password required pam_deny.so
session required pam_warn.so
session required pam_deny.so
|
このファイルは非常に単純です。どのモジュール・タイプの場合も Control_flag は同じ required です。このファイルの中では次の 2 つのモジュールが呼び出されています。
- まず
pam_warn.so が呼び出され、進行中の動作に関する情報がログに記録されます。
- 次に
pam_deny.so が呼び出され、単純に失敗が返されるとともに、すべての接続や認証が禁止されます。
従って PAM を使用するすべてのサービスについて、明示的に構成を行って認証を許可する必要があり、そうしないと認証を行おうとしても失敗します。
PAM を使った単純なログイン・アプリケーションを作成するための 10 ステップ
独自の PAM アプリケーションを実装する上で、また PAM のセッションの動作を理解する上で、以下の 10 ステップが役立つはずです。
- PAM を実装するためのヘッダー・ファイルを含めます (例えば pam_appl.h やpam_misc.h など)。
main 関数の中で、一意のハンドルを使って PAM ライブラリー libpam.so を初期化します (libpam.so は、アプリケーション用の構成ファイルの中で指定されているモジュールをロードします)。
- すべてのモジュールに対して認証を行い、失敗のシナリオを処理します。
- ユーザーのクレデンシャルとアカウントの詳細をチェックします。
- 新しい PAM セッションを開きます。
- そのユーザーに対する環境を、クレデンシャルを使って設定します。
- ユーザーが作業を終了したら、そのユーザーの環境の設定を解除します。
- PAM セッションを閉じます。
- ハンドルの値を使って libpam.so ライブラリーを終了します。
- 終了します。
まとめ
PAM を活用して、下位レベルの認証のための諸々の作業を扱いやすいひとつの処理にまとめることは、セキュリティー・メカニズムを単純化する上で妥当なことと言えます。この記事では以下の内容について学びました。
- PAM の基本的なアーキテクチャー
- PAM モジュールを構成する方法
- PAM の動作を理解するためのガイドとしての、PAM によるログイン・アプリケーションの概要
これで皆さんは、PAM モジュールを使った、より高度なトピックに進むことができます。そうしたトピックとしては、以下の「参考文献」に記載したものから始めることができます。
参考文献 学ぶために
製品や技術を入手するために
- developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を利用して皆さんの次期 Linux 開発プロジェクトを構築してください。
議論するために
著者について  | |  | Vishal Srivistava は、さまざまな種類の UNIX や Linux をコア・レベルで扱ってきています。彼は 2007年6月から IBM India Software Labs で働いており、現在は IBM IIS のコア・エンジンの開発チームのメンバーです。彼は現在の仕事のおかげで、さまざまな UNIX プラットフォーム上で PAM を使用してチーム・アプリケーションを構成する方法に関して豊富な経験を積んでいます。 |
記事の評価
|