目次
概要
Linux では認証処理に PAM (Pluggable Authentication Modules) を利用し、 ユーザのアプリケーションの間を仲介します。 PAM モジュールは様々なシステム 向けに提供されているため、任意のアプリケーションから要求を送ることが できるようになっています。本章では、モジュール型の PAM がどのように 動作するのかと、それをどのように設定すべきかについて述べています。
システム管理者やプログラマは、システムの特定箇所に対してアクセス制限を 行なったり、アプリケーションの特定機能を制限したりしたいと考えます。 PAM 無しでは、アプリケーションは LDAP や Samba, Kerberos など、新しい 認証方法が現われるたびにそれらに対応しなければなりません。このような 対応作業は時間がかかるばかりか、エラーを引き起こす可能性の高いものです。 このような手間を克服する方法としては、認証を実施するアプリケーションを 独立させ、中央でモジュールを管理することで認証を委任する方法があります。 新しく対応すべき認証方法が現われても、必要な PAM モジュール を作成して設定することで、プログラム側から利用できるようになります。
PAM で使用する用語は下記のとおりです:
PAM モジュール とは共有モジュールの集合体で、 それぞれ特定の認証方法に対応するためのものです。
モジュールスタック とは、 1 つ以上の PAM モジュール のことを指します。
PAM 対応の サービス とは、モジュールスタックや
PAM モジュールを使用して認証を行なうサービスです。通常、サービスは
login や su など、
関連するアプリケーションの名前を使用します。なお、サービス名で
other
(その他) とは、既定のルールを指定するための
予約語です。
モジュールのパラメータ とは、特定の PAM モジュール の実行の際に指定されるパラメータを指します。
結果 とは、特定の PAM モジュールの実行結果を指す ものです。結果が正の値であった場合は、次の PAM モジュールを実行します。 結果が負の値であった場合は、設定内容によって 「特に何もせず続行する」 動作をしたり、 「即時に終了する」 動作をしたりします。
PAM は 2 種類の方法で設定することができます:
/etc/pam.conf
)
各サービスに対する設定を /etc/pam.conf
内に
保管します。この方法はメンテナンスと有用性の理由から、 openSUSE
では使用していません。
/etc/pam.d/
)
PAM の仕組みを使用するそれぞれのサービス (プログラム) に対して、
/etc/pam.d/
ディレクトリ内に別々の設定ファイルを
用意して使用します。たとえば sshd
サービスに対する設定は、 /etc/pam.d/sshd
ファイルで設定します。
/etc/pam.d/
ディレクトリ内にあるファイルは、
認証に使用する PAM モジュールを定義するためのものです。各ファイルは複数の
行から構成され、それらはそれぞれサービスを定義するためのものです。
また、各行は最大で 4 列から構成されます:
種類
制御
モジュールパス
モジュールパラメータ
それぞれは下記のような意味を持ちます:
種類
サービスの種類を定義します。 PAM モジュールはスタック型で処理され、 異なるモジュールの種類はそれぞれ別々の用途で使用します。たとえば、 1 つのモジュールではパスワードのチェックを、もう 1 つのモジュール ではシステムのアクセス元のチェックを、そしてさらにもう 1 つはユーザ 固有の設定を読み込んだりします。 PAM では下記の 4 種類のモジュール が存在しています:
auth
ユーザの正当性を確認するモジュールです。従来はパスワードの 問い合わせなどに使用していたものを指します。ただし、正当性の 確認は小型のチップや生体認証 (たとえば指紋や虹彩による認証) である場合もあります。
account
この種類のモジュールは、要求するサービスに対してユーザに一般的な 許可があるかどうかを確認します。たとえば期限の切れたアカウント では、誰もログインできないようにする仕組みなどがあります。
password
この種類のモジュールは、認証に使用する情報 (一般にはパスワード) を変更するためのものです。
session
この種類のモジュールは、ユーザセッションの管理と設定を行ないます。 ログインのための認証が行なわれると、その最初と最後に起動され、 ユーザ固有の環境 (メールアカウント、ホームディレクトリ、システム 制限など) を設定します。
制御
ここでは PAM モジュールの振る舞いを設定します。それぞれの モジュールに対して、下記のような制御フラグを設定することができます:
required
このフラグが設定されているモジュールは、認証を続けるのに必ず成功
しなければならないものを意味します。 required
フラグの設定されたモジュールが失敗すると、認証失敗を示すメッセージを
ユーザに表示する前に、同一のフラグが設定されている全てのモジュールを
処理します。
requisite
このフラグが設定されているモジュールも、認証を続けるのに必ず成功
しなければならないものを意味します。ここまでは
required
フラグと同じですが、このフラグが設定
されてモジュールが失敗すると、ユーザに対しては即時に応答が表示され、
その他のモジュールは処理されなくなります。成功した場合は、
required
フラグと同じで、その他のモジュールが
処理されます。 requisite
フラグは、認証を正しく
行なうために必要な、特定条件のチェックなどに使用されます。
sufficient
このフラグが設定されているモジュールが成功すると、
それまでに required
フラグの設定されたモジュールが
失敗していない限り、要求元のアプリケーションには即時に成功のメッセージが
返却され、その他のモジュールは処理されなくなります。モジュールが
失敗したときには特に直接的な影響は発生しません。そのまま後続の
モジュールを決められた順序で処理します。
optional
このフラグが設定されているモジュールは、成功した場合も失敗した場合も、 特に直接的な影響は発生しなくなります。このフラグは、単純にメッセージを 表示 (たとえばユーザに対してメールが到着している旨を示すメッセージ を表示するなど) し、特に何もその後の処理に影響を与えないものなどに 使用します。
include
このフラグが設定されているモジュールは、パラメータとして指定された ファイルをこの場所に挿入して実行します。
モジュールパス
PAM モジュールの完全なファイル名を指定します。対象の PAM モジュールが
既定のディレクトリである /lib/security
(openSUSE®
で対応している 64 ビットプラットフォームの場合は
/lib64/security
) ディレクトリ内にある場合は、
ファイル名だけを指定することもできます。
モジュールパラメータ
スペース区切りの一覧形式で、 PAM モジュールに与えるパラメータを指定
します。たとえば debug
(デバッグを有効化する) や
nullok
(パスワードに何も指定しないことを許可する)
などがあります。
これらに加えて、 /etc/security
ディレクトリ以下には
PAM モジュールに対するグローバルな設定ファイルも存在しています。これらは
対象のモジュールに対する正確な動作を指定するものです (たとえば
pam_env.conf
や time.conf
などがあります) 。 PAM モジュールを利用するアプリケーションが実際に PAM
の機能を呼び出す際、これらの設定ファイルを利用してアプリケーションに結果
を返却します。
また、 PAM モジュールの作成とメンテナンスを簡略化するため、それぞれ
auth
, account
,
password
, session
の各モジュールの
種類に対して、既定の設定ファイルが用意されています。これらはそれぞれの
アプリケーションの PAM 設定を経由して読み出すもので、
common-*
内でのグローバルな PAM 設定モジュールへの
更新は、それぞれ個別の PAM 設定ファイルを更新することなく反映させること
ができます。
なお、グローバルな PAM の設定ファイルは、 pam-config と呼ばれるツールを利用してメンテナンスします。このツールは設定に対して 新しいモジュールを追加したり、既存のモジュールの設定を変更したり、 モジュール (またはオプション) を設定から削除したりすることを自動で行なう ことができます。これにより、 PAM の設定に対して手作業で作業を行なうことが 最小限に抑えられるほか、場合によっては全く行なう必要がなくなります。
64 ビットと 32 ビットの混在インストールについて | |
---|---|
64 ビット版のオペレーティングシステムをお使いの場合は、 32 ビットの アプリケーションに対しても PAM の機能を提供することもできます。この 場合は、 PAM モジュールについて両方のバージョンをインストールして ください。 |
sshd に対して、下記のような PAM 設定を利用する場合を考えてみます:
例2.1 sshd 向けの PAM 設定 (/etc/pam.d/sshd
)¶
#%PAM-1.0 auth requisite pam_nologin.so auth include common-auth account requisite pam_nologin.so account include common-account password include common-password session required pam_loginuid.so session include common-session
この設定ファイルが、 PAM 1.0 のバージョン向けのものであることを宣言 しています。これは単純に慣習上のものですが、将来バージョンをチェック する際に利用することができるものです。 | |
まずは | |
それぞれ 4 種類のモジュールに対する設定ファイルを参照します:
| |
認証を行なったプロセスに対して、ログイン UID のプロセス属性を 設定します。 |
それぞれの PAM モジュールに対して個別にモジュールを追加するのではなく、 設定ファイルを取り込む方法で行なっていることにより、管理者が既定値を 変更した場合でも自動的に更新版の PAM 設定を利用できるようになります。 従来は PAM に対して何らかの変更があった場合や、新しいアプリケーション がインストールされた場合、全てのアプリケーションに対する全ての設定 ファイルを調整しなければなりませんでした。現在、 PAM の設定は中央の 設定ファイルで管理され、全ての変更は各サービスの PAM 設定に自動的に 反映されます。
最初の取り込み指定 (common-auth
) では、 2 種類の
auth
モジュールを呼び出しています:
pam_env.so
,
pam_unix2.so
詳しくは 例2.2「auth
セクションの既定の設定
(common-auth
)」 をお読みください。
| |
|
auth
の全ての処理は、 sshd がログインの成功可否に
関する情報を受け取る前に処理されます。また、 required
の制御フラグが設定された全てのモジュールは、 sshd が成功メッセージを
受け取る前に処理が成功しなければなりません。いずれかのモジュールで
成功しなかった場合でも各モジュールはそれぞれ処理され、最終的に
sshd に対して失敗が通知されます。
auth
の全ての処理が成功すると、その他の include
ステートメントが処理されます。この場合は 例2.3「account
セクションの既定の設定 (common-account
)」
に続くことになります。 common-account
には 1 つの
モジュール pam_unix2
だけが書かれています。
pam_unix2
がユーザが存在する旨の結果を返却すると、
sshd に成功を通知して次のモジュール (password
;
例2.4「password
セクションの既定の設定 (common-password
)」) に移動します。
例2.4 password
セクションの既定の設定 (common-password
)¶
password requisite pam_pwcheck.so nullok cracklib password required pam_unix2.so nullok use_authtok
sshd の PAM 設定でも同様に、既定の設定では password
モジュールの設定に対して、 common-password
を取り込む
ように宣言しています。 制御フラグが requisite
と
required
に設定されているモジュールは、アプリケーションが
認証情報を変更する際に必ず成功しなければなりません。
なお、パスワードなどの認証情報を変更する際には、セキュリティチェックを
受ける必要があります。このようなチェック機能は pam_pwcheck
モジュールが提供しています。 pam_unix2
モジュールは
pam_pwcheck
による古いパスワードから新しいパスワード
への移行作業が完了した後に使用されているため、ユーザ側ではパスワードを
変更した後に認証をやり直すことがないようになっています。このような処理
により、 pam_pwcheck
が実施するチェックを妨げる
ことがないようにしています。また、 account
や
auth
で期限切れのパスワードを警告するよう設定して
いる場合も、 password
のモジュールが使用されます。
例2.5 session
セクションの既定の設定 (common-session
)¶
session required pam_limits.so session required pam_unix2.so session optional pam_umask.so
最後のステップとして、 session
の種類のモジュール群
(common-session
ファイル内に書かれているもの) が
呼び出され、該当するユーザに対するセッション設定を行ないます。まず
pam_limits
モジュールは
/etc/security/limits.conf
ファイルを読み込んで、
特定のシステム資源の使用を制限します。また、ここでも
pam_unix2
モジュールを利用しています。さらに
pam_umask
モジュールは、ファイル作成時のパーミッション
のマスクを設定することができます。このモジュールには
optional
フラグが設定されているため、このモジュールの
実行が失敗してもセッションは中断されず、そのまま続行されます。
なお、 session
モジュールは、ユーザがログアウトする
際にもう一度呼び出されます。
PAM モジュールの中には設定可能なものがあります。設定ファイルは
/etc/security
内に存在しています。この章では、
sshd の例で使用している pam_env.conf
と
limits.conf
について、設定ファイルを説明しています。
pam_env.conf
はユーザに対して標準化した環境を提供する
ために利用するもので、 pam_env
モジュールが呼び
出された際に読み込まれます。このファイルでは、環境変数は下記の書式で
記述します:
変数
[DEFAULT=値
] [OVERRIDE=値
]
変数
設定する環境変数の名前を指定します。
[DEFAULT=<値>]
管理者が設定したい既定の 値
を指定します。
[OVERRIDE=<値>]
既に設定されている値を上書きするための設定で、
pam_env
が問い合わせて設定を行ないます。
pam_env
をどのように使用することができるのかの
例として、 DISPLAY
変数の設定を説明します。この変数は
リモートログインを行なった際に変更しなければならないもので、
例2.6「pam_env.conf」 で説明しています。
例2.6 pam_env.conf¶
REMOTEHOST DEFAULT=localhost OVERRIDE=@{PAM_RHOST} DISPLAY DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
最初の行では REMOTEHOST
という変数の値を設定しています。
この値は pam_env
がその他の値を設定できない場合に、
既定値として localhost
が設定されるようになっています。
DISPLAY
変数では REMOTEHOST
の値を利用して
設定するようになっています。詳しくは
/etc/security/pam_env.conf
内のコメント (英語) を
お読みください。
pam_mount
は、中央のファイルサーバで全ユーザの
ホームディレクトリを提供しているような環境で利用するもので、ログイン処理
中に対象のユーザのホームディレクトリをマウントし、ログアウト処理中にマウント
を解除します。このような方法をとることで、全ユーザに対するホームディレクトリ
を提供するのに、 /home
ディレクトリ全体をマウント
しなくて済むようになります。その代わり、ログインしているユーザのホーム
ディレクトリだけがマウントされます。
pam_mount
をインストールすると、
/etc/security
ディレクトリ内に
pam_mount.conf.xml
という雛型ファイルが配置されます。
それぞれの要素に対する説明は、 man 5 pam_mount.conf
で表示されるマニュアルページをお読みください。
この機能に対する基本的な設定は、 YaST で行なうことができます。 ファイルサーバを追加するには、 YaST から
+ + を選択してください。詳しくは 項 「クライアントの設定」 (第19章 Samba, ↑リファレンス) をお読みください。
limits.conf
はユーザやグループに対してシステム制限を
設定するためのファイルで、 pam_limits
モジュールが
読み込みを行ないます。このファイルでは、ハードリミットと呼ばれる超えることの
できない値と、ソフトリミットと呼ばれる一時的な超過を許す値をそれぞれ設定
します。文法とオプションについて、詳しくは
/etc/security/limits.conf
内のコメント (英語) をお読み
ください。
pam-config ツールは、 PAM のグローバル設定ファイル
(/etc/pam.d/common-*-pc
) の設定を支援するほか、
いくつかの選択したアプリケーション設定を操作することのできるツールです。
対応しているモジュールの一覧については、
pam-config --list-modules コマンドを実行すると表示
することができます。 PAM の設定ファイルを管理する際には、
pam-config コマンドを利用して、 PAM の設定に新しい
モジュールを追加したり、修正や削除を行なったりしてください。 PAM の
グローバル設定ファイルを変更しておくことで、個別のアプリケーションに
対する設定を手作業で修正する必要が無くなります。
pam-config のシンプルな用途としては、下記のような ものがあります:
Unix スタイルの設定を新規に自動生成する.
pam-config を利用することで、後から設定することのできるシンプルな
設定ファイルを作成することができます。具体的には pam-config --create
コマンドを利用して、シンプルな UNIX 認証の設定を作成することができます。
既に設定ファイルが存在していて、 pam-config で管理されていないもので
あった場合は、バックアップファイルが *.pam-config-backup
として保存されたあと、設定が上書きされます。
新しい認証方法を追加する.
新しい認証方法 (たとえば LDAP) を PAM モジュールに追加したい場合は、
pam-config --add --ldap のようにして実行します。
LDAP は全ての common-*-pc
PAM 設定ファイルに
対して追加されます。
テスト用にデバッグを有効にする.
新しい認証方法が想定通りに動作していることを確認するには、 PAM 関連の
操作に対してデバッグ機能を有効にする方法があります。
pam-config --add --ldap-debug と実行すると、 LDAP
関連の PAM 操作に対してデバッグ機能が有効に設定されます。デバッグ出力
は、 /var/log/messages
に出力されます。
設定を確認する.
新しい PAM の設定を最終的に反映させる前に、追加する必要のあるオプション
が全て含まれていることを確認することができます。
pam-config --query --モジュール
のように実行すると、指定した PAM モジュールに対する種類とオプションの
一覧が表示されます。
デバッグ機能を無効にする. 全ての設定が完了したあとは、十分な性能を確保するため、最終的に設定から デバッグオプションを取り除きます。 pam-config --delete --ldap-debug のように実行すると、 LDAP 認証に対するデバッグ 機能を無効にすることができます。 LDAP 以外のモジュールでデバッグ機能 を有効にしていた場合も、似たようなコマンドで無効にすることができます。
pam-config コマンドについて詳しい情報と、利用可能な オプションについては、 pam-config(8) で表示される マニュアルページをお読みください。
PAM の設定ファイルを手作業で作成したり管理したりしたい場合は、これらの ファイルに対して pam-config を無効化していることを 確認する必要があります。
pam-config --create コマンドを利用して、何もない状態
から PAM の設定ファイルを作成すると、 common-*
から
common-*-pc
に対するシンボリックリンクが作成されます。
pam-config は common-*-pc
の設定ファイルのみを修正
する仕組みであるため、これらのシンボリックリンクを削除すると、 pam-config
は common-*-pc
ファイルのみを操作する仕組みであり、
これらのファイルはシンボリックリンク無しでは効果の無いものであるため、
pam-config を簡単に無効化することができます。
pam-doc
パッケージをインストールすることで、
/usr/share/doc/packages/pam
ディレクトリ内に
下記のような様々な文書が配置されます (いずれも英語です):
上記のディレクトリの直下には、それぞれの PAM モジュール向けの
modules
サブディレクトリが存在していて、
その中には README ファイルが用意されています。
この文書には、システム管理者が PAM について知っておくべき全ての項目が 含まれています。たとえば PAM の設定ファイルの文法から、セキュリティ まわりの考慮事項など、幅の広い範囲が含まれます。
この文書には、管理者の視点からのトピックが含まれていて、たとえば標準に 準拠した PAM モジュールの書き方などが記されています。
この文書には、 PAM ライブラリを使用するアプリケーションの開発者に 対する全ての内容が含まれています。
一般的な PAM の情報や、全てのコンポーネントの機能概要を提供する マニュアルページなどが含まれています。