この章では、プラグイン可能認証モジュール (PAM) フレームワークについて説明します。PAM は、認証サービスを Solaris オペレーティングシステム (Solaris OS) に「プラグイン」する方法を提供します。PAM によって、システムへのアクセス時に複数の認証サービスを使用できるようになります。
プラグイン可能認証モジュール (PAM) フレームワークを使用すると、login、ftp、telnet などのシステムに入るためのサービスを変更しなくても、新しい認証サービスを「プラグイン」できるようになります。また、PAM を使用すると、UNIX ログインを Kerberos などほかのセキュリティーメカニズムと統合できます。また、アカウント、資格、セッション、およびパスワードの管理メカニズムも「プラグイン」できます。
PAM フレームワークを使用すると、システムに入るためのサービス (ftp、login、telnet、rsh など) のユーザー認証を構成できます。PAM には次の利点があります。
柔軟な構成ポリシー
アプリケーションごとの認証ポリシー
デフォルトの認証メカニズムを選択する機能
高度なセキュリティーシステムにおいて複数の承認を要求する機能
一般ユーザーにも使いやすい
認証サービスが異なってもパスワードが同じであれば、パスワードを再入力する必要がない
ユーザーが複数のコマンドを入力しなくても、複数の認証方式のパスワードを求めるプロンプトを表示できる
任意のオプションをユーザー認証サービスに渡す機能
システムに入るためのサービスを変更しなくても、サイト固有のセキュリティーポリシーを実装する機能
PAM コンシューマ
PAM ライブラリ
pam.conf(4) 構成ファイル
PAM サービスモジュール。プロバイダとも呼ばれる
このフレームワークは、認証関連アクティビティーの統一的な実施手段を提供します。このアプローチを使えば、アプリケーション開発者は、PAM サービスのポリシーの意味を知らなくてもサービスを使用できるようになります。アルゴリズムは一元的に提供されます。アルゴリズムの変更は、個々のアプリケーションとは無関係に行えます。PAM を使えば、管理者は、アプリケーションを変更しないで、特定システムのニーズに合わせて認証プロセスを調整できるようになります。この調整は、PAM 構成ファイル pam.conf を通じて行われます。
次の図は、PAM のアーキテクチャーを示したものです。アプリケーションは、PAM アプリケーションプログラミングインタフェース (API) 経由で PAM ライブラリと通信します。PAM モジュールは、PAM サービスプロバイダインタフェース (SPI) 経由で PAM ライブラリと通信します。したがって、PAM ライブラリを使えば、アプリケーションとモジュールとの相互通信を実現できます。
Solaris 10 リリースには、プラグイン可能認証モジュール (PAM) フレームワークに対する、次のような変更が含まれています。
pam_authtok_check モジュールが、/etc/default/passwd ファイルの新しい調整可能なパラメータを使用して、厳しいパスワードチェックができるようになりました。新しいパラメータは次を定義します。
パスワードの共通辞書ワードをチェックするために使用する、コンマで区切られた辞書ファイルのリスト
新しいパスワードと古いパスワードの間に必要な最小限の差異
新しいパスワードで使用する必要がある英字または英字以外の最小文字数
新しいパスワードで使用する必要がある大文字または小文字の最小文字数
許容できる連続的に繰り返される文字の数
pam_unix_auth モジュールが、ローカルユーザーに対するアカウントロックを実装しています。アカウントロックは、/etc/security/policy.conf の LOCK_AFTER_RETRIES パラメータおよび /etc/user_attr の lock_after-retries 鍵によって有効になります。詳細は、policy.conf(4) および user_attr(4) のマニュアルページを参照してください。
新しいbinding 制御フラグが定義されました。この制御フラグについては、pam.conf(4) のマニュアルページおよび 「PAM スタックのしくみ」に記載されています。
pam_unix モジュールが削除され、同等またはそれ以上の機能を備えた一連のサービスモジュールで置き換えられました。これらのモジュールの多くは、Solaris 9 リリースで導入されました。置き換え後のモジュールのリストは、次のとおりです。
pam_authtok_check
pam_authtok_get
pam_authtok_store
pam_dhkeys
pam_passwd_auth
pam_unix_account
pam_unix_auth
pam_unix_cred
pam_unix_session
以前の pam_unix_auth モジュールの機能は、2 つのモジュールに分割されました。pam_unix_auth モジュールは、ユーザーのパスワードが正しいかどうかを検証するように変更されました。新しく追加された pam_unix_cred モジュールは、ユーザーの資格情報を確立する機能を提供します。
pam_krb5 モジュールに、PAM フレームワークを使って Kerberos 資格キャッシュを管理する機能が追加されました。
新しい pam_deny モジュールが追加されました。このモジュールは、サービスへのアクセスを拒否するために使用できます。デフォルトでは、pam_deny モジュールは無効になっています。詳細は、pam_deny(5) のマニュアルページを参照してください。
この節では、PAM のフレームワークが特定のセキュリティーポリシーを使用するために必要な作業について説明します。PAM 構成ファイルに関連するセキュリティーのいくつかの問題について注意する必要があります。セキュリティーの問題については、「PAM の実装計画」を参照してください。
作業 |
説明 |
参照先 |
---|---|---|
PAM のインストールを計画します。 |
ソフトウェア構成処理を開始する前に、構成を検討および決定します。 | |
新しい PAM モジュールを追加します。 |
必要に応じて、サイト固有のモジュールを作成およびインストールし、汎用ソフトウェアにない要件に対応します。この手順ではこれらの新しい PAM モジュールのインストール方法について説明します。 | |
~/.rhosts によるアクセスを拒否します。 |
~/.rhosts によるアクセスを拒否して、セキュリティーを強化します。 | |
エラー記録を開始します。 |
syslog を使用して PAM エラーメッセージの記録を開始します。 |
配布時に、pam.conf 構成ファイルは Solaris の標準的なセキュリティーポリシーを実装します。このポリシーは、多くの状況で機能します。別のセキュリティーポリシーを実装する必要がある場合に注意すべき問題は、次のとおりです。
何が必要か、特にどの PAM サービスモジュールを選択するかを決定します。
特別な構成オプションが必要なサービスを確認します。適宜、other を使用します。
モジュールを実行する順番を決定します。
各モジュールに対する制御フラグを選択します。すべての制御フラグの詳細については、「PAM スタックのしくみ」を参照してください。
各モジュールに必要なオプションを選択します。各モジュールのマニュアルページには、特別なオプションが一覧表示されます。
ここで、PAM 構成ファイルを変更する前に次のことを考慮することをお勧めします。
/etc/pam.conf ですべてのアプリケーションを指定しなくてもいいように、モジュールタイプごとに other エントリを使用します。
binding、sufficient、および optional 制御フラグのセキュリティーへの影響を確認します。
モジュールに関連するマニュアルページを参照します。これらのマニュアルページには、各モジュールの機能、使用可能なオプション、スタック内のモジュール間の相互作用などの説明があります。
PAM 構成ファイルの構成を間違えたり壊したりすると、どのユーザーもログインできなくなる可能性があります。この場合、sulogin コマンドは PAM を使用しないので、root パスワードを使用してマシンをシングルユーザーモードでブートして問題を解決する必要があります。
/etc/pam.conf ファイルを変更したあと、システムにアクセスできる間にできる限り調査して問題を解決します。変更によって影響を受ける可能性があるコマンドは、すべてテストしてください。たとえば、新しいモジュールを telnet サービスに追加した場合、telnet コマンドを使用して、行った変更が期待どおりに動作しているかどうかを検証します。
この手順では、新しい PAM モジュールを追加する方法を示します。新しいモジュールは、サイト固有のセキュリティーポリシーを網羅するためや、Sun 以外のアプリケーションをサポートするために作成します。
スーパーユーザーになるか、同等の役割を引き受けます。
役割には、認証と特権コマンドが含まれます。役割の詳細については、「RBAC の構成 (作業マップ)」を参照してください。
使用する制御フラグとオプションを決定します。
制御フラグについては、「PAM スタックのしくみ」を参照してください。
モジュールファイルの所有者が root で、そのアクセス権が 555 になるように設定します。
PAM 構成ファイル /etc/pam.conf を編集して、このモジュールを適切なサービスに追加します。
モジュールが適切に追加されたことを検証します。
構成ファイルが間違って構成されているおそれもあるので、システムをリブートする前にテストを行う必要があります。システムをリブートする前に、ssh などの直接サービスを使用してログインし、su コマンドを実行します。サービスは、システムをブートしたときに 1 度だけ生成されるデーモンである場合があります。その場合には、システムをリブートしてから、モジュールが追加されていることを確認する必要があります。
スーパーユーザーになるか、同等の役割を引き受けます。
役割には、認証と特権コマンドが含まれます。役割の詳細については、「RBAC の構成 (作業マップ)」を参照してください。
rhosts_auth.so.1 を含む行をすべて PAM 構成ファイルから削除します。
この手順によって、rlogin セッション中、~/.rhosts ファイルは読み取られなくなります。これにより、ローカルシステムに認証されていない遠隔システムからのアクセスを防止できます。~/.rhosts ファイルまたは /etc/hosts.equiv ファイルの存在またはその内容にかかわらず、すべての rlogin アクセスにはパスワードが必要になります。
rsh サービスを無効にします。
~/.rhosts ファイルへのその他の非承認アクセスを防ぐには、rsh サービスも無効にする必要があります。
# svcadm disable network/shell |
スーパーユーザーになるか、同等の役割を引き受けます。
役割には、認証と特権コマンドが含まれます。役割の詳細については、「RBAC の構成 (作業マップ)」を参照してください。
必要な記録のレベルに /etc/syslog.conf ファイルを構成します。
記録レベルの詳細については、syslog.conf(4) を参照してください。
syslog デーモンの構成情報を再表示します。
# svcadm refresh system/system-log |
login、rlogin、su、cron などのシステムサービスに対する PAM サービスモジュールを構成するには、PAM 構成ファイル pam.conf(4) を使用します。システム管理者がこのファイルを管理します。pam.conf 内のエントリの順番が間違っていると、予期しない副作用が生じる可能性があります。たとえば、pam.conf の設定が不適切であると、ユーザーがロックアウトされ、修復のためにシングルユーザーモードが必要になる可能性があります。順番の設定方法については、「PAM スタックのしくみ」を参照してください。
service-name module-type control-flag module-path module-options
サービスの名前。たとえば、ftp、login、または passwd などです。アプリケーションは、自身が提供するサービスごとに異なるサービス名を使用できます。たとえば、Solaris Secure Shell デーモンが使用するサービス名は次のとおりです。 sshd-none、sshd-password、sshd-kbdint、sshd-pubkey、sshd-hostbased。サービス名 other は事前に定義された名前であり、ワイルドカードのサービス名として使用されます。構成ファイル内で特定のサービス名が見つからない場合には、other の構成が使用されます。
サービスのタイプ。具体的には auth、account、session、password のいずれかです。
サービスの統合された成功または失敗の値を決定するうえで、そのモジュールの果たす役割を示します。有効な制御フラグは、binding、include、optional、required、requisite、および sufficient です。制御フラグの使用方法については、「PAM スタックのしくみ」を参照してください。
サービスを実装しているライブラリオブジェクトへのパス。パス名が絶対パスでない場合、そのパス名は /usr/lib/security/$ISA/ に対する相対パスとみなされます。libpam による検索が、アプリケーションの特定のアーキテクチャーに対するディレクトリ内で行われるように、アーキテクチャーに依存するマクロ $ISA を使用します。
サービスモジュールに渡されるオプション。各モジュールのマニュアルページには、そのモジュールで使用できるオプションの説明があります。典型的なモジュールオプションとしては、nowarn や debug などがあります。
あるアプリケーションが次の関数を呼び出すと、libpam は構成ファイル /etc/pam.conf を読み取り、そのサービスの操作に関与するモジュールを決定します。
認証管理やアカウント管理など、このサービスのある操作に対するモジュールが /etc/pam.conf に 1 つしか含まれていない場合、そのモジュールの結果によって、その操作の結果が決まります。たとえば、passwd アプリケーションのデフォルトの認証操作には、1 つのモジュール pam_passwd_auth.so.1 が含まれています。
passwd auth required pam_passwd_auth.so.1 |
これに対し、サービスのある操作に対して複数のモジュールが定義されている場合、それらのモジュールは「スタック」を形成しており、そのサービスに対する「PAM スタック」が存在している、と言います。たとえば、pam.conf に次のエントリが含まれる場合を考えます。
login auth requisite pam_authtok_get.so.1 login auth required pam_dhkeys.so.1 login auth required pam_unix_cred.so.1 login auth required pam_unix_auth.so.1 login auth required pam_dial_auth.so.1 |
これらのエントリは、login サービスに対するサンプルの auth スタックを表現したものです。このスタックの結果を決定するには、個々のモジュールの結果コードに対して「統合プロセス」を実行する必要があります。統合プロセスでは、各モジュールが、/etc/pam.conf 内で指定された順番で実行されます。個々の成功コードまたは失敗コードが、モジュールの制御フラグに基づいて総合結果へと統合されます。制御フラグによっては、スタックの早期終了が発生する可能性があります。たとえば、requisite モジュールが失敗したり、sufficient モジュールや binding モジュールが成功したりする可能性があります。スタックの処理が完了すると、個々の結果が組み合わされて単一の総合結果が算出され、それがアプリケーションに渡されます。
制御フラグは、サービスへのアクセスを決定するうえで、ある PAM モジュールが果たす役割を示します。制御フラグとその効果は、次のとおりです。
binding – binding モジュールの要件を満たすことに成功すると、その時点までの required モジュールがどれも失敗しなかった場合には、すぐにアプリケーションに成功が返されます。これらの条件が満たされると、後続のモジュールは実行されません。失敗すると、required 失敗が記録され、モジュールの処理が継続されます。
include – 別の PAM 構成ファイルに含まれる行を追加し、それらの行がその時点で PAM スタック内で使用されるようにします。このフラグは成功または失敗の動作を制御しません。新しいファイルが読み取られると、PAM のインクルードスタックが 1 増やされます。新しいファイル内でのスタックチェックが完了すると、インクルードスタック値が 1 減らされます。ファイルの末尾に到達し、かつ PAM インクルードスタックが 0 であれば、スタック処理は終了します。PAM インクルードスタックの最大数は、32 です。
optional – optional モジュールの要件を満たすことに成功することは、サービスを使用するために必要な条件ではありません。失敗すると、optional 失敗が記録されます。
required – required モジュールの要件を満たすことに成功することは、サービスを使用するために必要な条件です。失敗すると、このサービスの残りのモジュールの実行完了後に、エラーが返されます。サービスの最終的な成功が返されるのは、binding または required モジュールがどれも失敗を報告しなかった場合だけです。
requisite – requisite モジュールの要件を満たすことに成功することは、サービスを使用するために必要な条件です。失敗するとすぐにエラーが返され、後続のモジュールは実行されません。あるサービスのすべての requisite モジュールが成功を返さないと、この機能がアプリケーションに成功を返すことができません。
sufficient – その時点までに required 失敗が一度も発生しなかった場合、sufficient モジュールが成功するとすぐにアプリケーションに成功が返され、後続のモジュールは実行されません。失敗すると、optional 失敗が記録されます。
次の 2 つの図は、統合プロセスでアクセスがどのように決定されるかを示したものです。最初の図は、制御フラグのタイプごとに成功または失敗がどのように記録されるのかを示しています。2 番目の図は、統合された値の決定方法を示しています。
次のような、認証を要求する rlogin サービスの例を考えます。
この例の pam.conf ファイルには、rlogin サービスに対して次のような内容が含まれています。
# Authentication management ... # rlogin service rlogin auth sufficient pam_rhosts_auth.so.1 rlogin auth requisite pam_authtok_get.so.1 rlogin auth required pam_dhkeys.so.1 rlogin auth required pam_unix_auth.so.1 ... |
rlogin サービスが認証を要求すると、libpam はまず、pam_rhosts_auth(5) モジュールを実行します。pam_rhosts_auth モジュールの制御フラグは、sufficient に設定されています。pam_rhosts_auth モジュールがユーザーの認証に成功すると、処理が中止され、アプリケーションに成功が返されます。
pam_rhosts_auth モジュールがユーザーの認証に失敗すると、次の PAM モジュールである pam_authtok_get(5) が実行されます。このモジュールの制御フラグは、requisite に設定されています。pam_authtok_get が失敗すると、認証処理が終了し、失敗が rlogin に返されます。
pam_authtok_get が成功すると、次の 2 つのモジュール pam_dhkeys(5) と pam_unix_auth(5) が実行されます。どちらのモジュールにも、required に設定された制御フラグが関連付けられているため、各モジュールが失敗を返すかどうかにかかわらず、処理が継続されます。pam_unix_auth の実行が終了すると、rlogin 認証用のモジュールはもう残っていません。この時点で、pam_dhkeys、pam_unix_auth のいずれかが失敗を返していた場合、ユーザーは rlogin 経由でのアクセスを拒否されます。