第2章 PAM を利用した認証

目次

2.1. PAM とは
2.2. PAM の設定ファイルの構成
2.3. sshd の PAM 設定
2.4. PAM モジュールの設定
2.5. pam-config を利用した PAM の設定
2.6. 手作業での PAM 設定
2.7. さらなる情報

概要

Linux では認証処理に PAM (Pluggable Authentication Modules) を利用し、 ユーザのアプリケーションの間を仲介します。 PAM モジュールは様々なシステム 向けに提供されているため、任意のアプリケーションから要求を送ることが できるようになっています。本章では、モジュール型の PAM がどのように 動作するのかと、それをどのように設定すべきかについて述べています。

2.1. PAM とは

システム管理者やプログラマは、システムの特定箇所に対してアクセス制限を 行なったり、アプリケーションの特定機能を制限したりしたいと考えます。 PAM 無しでは、アプリケーションは LDAP や Samba, Kerberos など、新しい 認証方法が現われるたびにそれらに対応しなければなりません。このような 対応作業は時間がかかるばかりか、エラーを引き起こす可能性の高いものです。 このような手間を克服する方法としては、認証を実施するアプリケーションを 独立させ、中央でモジュールを管理することで認証を委任する方法があります。 新しく対応すべき認証方法が現われても、必要な PAM モジュール を作成して設定することで、プログラム側から利用できるようになります。

PAM で使用する用語は下記のとおりです:

  • PAM モジュール とは共有モジュールの集合体で、 それぞれ特定の認証方法に対応するためのものです。

  • モジュールスタック とは、 1 つ以上の PAM モジュール のことを指します。

  • PAM 対応の サービス とは、モジュールスタックや PAM モジュールを使用して認証を行なうサービスです。通常、サービスは loginsu など、 関連するアプリケーションの名前を使用します。なお、サービス名で other (その他) とは、既定のルールを指定するための 予約語です。

  • モジュールのパラメータ とは、特定の PAM モジュール の実行の際に指定されるパラメータを指します。

  • 結果 とは、特定の PAM モジュールの実行結果を指す ものです。結果が正の値であった場合は、次の PAM モジュールを実行します。 結果が負の値であった場合は、設定内容によって 特に何もせず続行する 動作をしたり、 即時に終了する 動作をしたりします。

2.2. 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.conftime.conf などがあります) 。 PAM モジュールを利用するアプリケーションが実際に PAM の機能を呼び出す際、これらの設定ファイルを利用してアプリケーションに結果 を返却します。

また、 PAM モジュールの作成とメンテナンスを簡略化するため、それぞれ auth, account, password, session の各モジュールの 種類に対して、既定の設定ファイルが用意されています。これらはそれぞれの アプリケーションの PAM 設定を経由して読み出すもので、 common-* 内でのグローバルな PAM 設定モジュールへの 更新は、それぞれ個別の PAM 設定ファイルを更新することなく反映させること ができます。

なお、グローバルな PAM の設定ファイルは、 pam-config と呼ばれるツールを利用してメンテナンスします。このツールは設定に対して 新しいモジュールを追加したり、既存のモジュールの設定を変更したり、 モジュール (またはオプション) を設定から削除したりすることを自動で行なう ことができます。これにより、 PAM の設定に対して手作業で作業を行なうことが 最小限に抑えられるほか、場合によっては全く行なう必要がなくなります。

[Note]64 ビットと 32 ビットの混在インストールについて

64 ビット版のオペレーティングシステムをお使いの場合は、 32 ビットの アプリケーションに対しても PAM の機能を提供することもできます。この 場合は、 PAM モジュールについて両方のバージョンをインストールして ください。

2.3. sshd の PAM 設定

sshd に対して、下記のような PAM 設定を利用する場合を考えてみます:

例2.1 sshd 向けの PAM 設定 (/etc/pam.d/sshd)

#%PAM-1.0                               1
auth     requisite      pam_nologin.so 2
auth     include        common-auth 3
account  requisite      pam_nologin.so 2
account  include        common-account 3
password include        common-password 3
session  required       pam_loginuid.so 4
session  include        common-session 3

1

この設定ファイルが、 PAM 1.0 のバージョン向けのものであることを宣言 しています。これは単純に慣習上のものですが、将来バージョンをチェック する際に利用することができるものです。

2

まずは /etc/nologin ファイルが存在しているか どうかをチェックします。存在した場合は、 root 以外のユーザはログイン できなくなります。

3

それぞれ 4 種類のモジュールに対する設定ファイルを参照します: common-auth, common-account, common-password, common-session 。 それぞれのファイルには、その種類に対する既定の設定が含まれています。

4

認証を行なったプロセスに対して、ログイン UID のプロセス属性を 設定します。


それぞれの PAM モジュールに対して個別にモジュールを追加するのではなく、 設定ファイルを取り込む方法で行なっていることにより、管理者が既定値を 変更した場合でも自動的に更新版の PAM 設定を利用できるようになります。 従来は PAM に対して何らかの変更があった場合や、新しいアプリケーション がインストールされた場合、全てのアプリケーションに対する全ての設定 ファイルを調整しなければなりませんでした。現在、 PAM の設定は中央の 設定ファイルで管理され、全ての変更は各サービスの PAM 設定に自動的に 反映されます。

最初の取り込み指定 (common-auth) では、 2 種類の auth モジュールを呼び出しています: pam_env.so, pam_unix2.so 詳しくは 例2.2「auth セクションの既定の設定 (common-auth)」 をお読みください。

例2.2 auth セクションの既定の設定 (common-auth)

auth    required        pam_env.so           1
auth    required        pam_unix2.so         2

1

pam_env.so/etc/security/pam_env.conf ファイルを読み込み、 このファイルに指定された環境変数を設定します。これは、 pam_env ではログインの 実行元を認識していることから、 DISPLAY 変数を 正しい値にするために使用しています。

2

pam_unix2 はユーザのログイン 情報とパスワードを、 /etc/passwd/etc/shadow ファイルで確認します。

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.3 account セクションの既定の設定 (common-account)

account required        pam_unix2.so

例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 を取り込む ように宣言しています。 制御フラグが requisiterequired に設定されているモジュールは、アプリケーションが 認証情報を変更する際に必ず成功しなければなりません。

なお、パスワードなどの認証情報を変更する際には、セキュリティチェックを 受ける必要があります。このようなチェック機能は pam_pwcheck モジュールが提供しています。 pam_unix2 モジュールは pam_pwcheck による古いパスワードから新しいパスワード への移行作業が完了した後に使用されているため、ユーザ側ではパスワードを 変更した後に認証をやり直すことがないようになっています。このような処理 により、 pam_pwcheck が実施するチェックを妨げる ことがないようにしています。また、 accountauth で期限切れのパスワードを警告するよう設定して いる場合も、 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 モジュールは、ユーザがログアウトする 際にもう一度呼び出されます。

2.4. PAM モジュールの設定

PAM モジュールの中には設定可能なものがあります。設定ファイルは /etc/security 内に存在しています。この章では、 sshd の例で使用している pam_env.conflimits.conf について、設定ファイルを説明しています。

2.4.1. pam_env.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 内のコメント (英語) を お読みください。

2.4.2. pam_mount.conf

pam_mount は、中央のファイルサーバで全ユーザの ホームディレクトリを提供しているような環境で利用するもので、ログイン処理 中に対象のユーザのホームディレクトリをマウントし、ログアウト処理中にマウント を解除します。このような方法をとることで、全ユーザに対するホームディレクトリ を提供するのに、 /home ディレクトリ全体をマウント しなくて済むようになります。その代わり、ログインしているユーザのホーム ディレクトリだけがマウントされます。

pam_mount をインストールすると、 /etc/security ディレクトリ内に pam_mount.conf.xml という雛型ファイルが配置されます。 それぞれの要素に対する説明は、 man 5 pam_mount.conf で表示されるマニュアルページをお読みください。

この機能に対する基本的な設定は、 YaST で行なうことができます。 ファイルサーバを追加するには、 YaST から ネットワークサービス+Windows ドメインメンバーシップ+熟練者向け設定 を選択してください。詳しくは 項 「クライアントの設定」 (第19章 Samba, ↑リファレンス) をお読みください。

2.4.3. limits.conf

limits.conf はユーザやグループに対してシステム制限を 設定するためのファイルで、 pam_limits モジュールが 読み込みを行ないます。このファイルでは、ハードリミットと呼ばれる超えることの できない値と、ソフトリミットと呼ばれる一時的な超過を許す値をそれぞれ設定 します。文法とオプションについて、詳しくは /etc/security/limits.conf 内のコメント (英語) をお読み ください。

2.5. pam-config を利用した PAM の設定

pam-config ツールは、 PAM のグローバル設定ファイル (/etc/pam.d/common-*-pc) の設定を支援するほか、 いくつかの選択したアプリケーション設定を操作することのできるツールです。 対応しているモジュールの一覧については、 pam-config --list-modules コマンドを実行すると表示 することができます。 PAM の設定ファイルを管理する際には、 pam-config コマンドを利用して、 PAM の設定に新しい モジュールを追加したり、修正や削除を行なったりしてください。 PAM の グローバル設定ファイルを変更しておくことで、個別のアプリケーションに 対する設定を手作業で修正する必要が無くなります。

pam-config のシンプルな用途としては、下記のような ものがあります:

  1. Unix スタイルの設定を新規に自動生成する.  pam-config を利用することで、後から設定することのできるシンプルな 設定ファイルを作成することができます。具体的には pam-config --create コマンドを利用して、シンプルな UNIX 認証の設定を作成することができます。 既に設定ファイルが存在していて、 pam-config で管理されていないもので あった場合は、バックアップファイルが *.pam-config-backup として保存されたあと、設定が上書きされます。

  2. 新しい認証方法を追加する.  新しい認証方法 (たとえば LDAP) を PAM モジュールに追加したい場合は、 pam-config --add --ldap のようにして実行します。 LDAP は全ての common-*-pc PAM 設定ファイルに 対して追加されます。

  3. テスト用にデバッグを有効にする.  新しい認証方法が想定通りに動作していることを確認するには、 PAM 関連の 操作に対してデバッグ機能を有効にする方法があります。 pam-config --add --ldap-debug と実行すると、 LDAP 関連の PAM 操作に対してデバッグ機能が有効に設定されます。デバッグ出力 は、 /var/log/messages に出力されます。

  4. 設定を確認する.  新しい PAM の設定を最終的に反映させる前に、追加する必要のあるオプション が全て含まれていることを確認することができます。 pam-config --query --モジュール のように実行すると、指定した PAM モジュールに対する種類とオプションの 一覧が表示されます。

  5. デバッグ機能を無効にする.  全ての設定が完了したあとは、十分な性能を確保するため、最終的に設定から デバッグオプションを取り除きます。 pam-config --delete --ldap-debug のように実行すると、 LDAP 認証に対するデバッグ 機能を無効にすることができます。 LDAP 以外のモジュールでデバッグ機能 を有効にしていた場合も、似たようなコマンドで無効にすることができます。

pam-config コマンドについて詳しい情報と、利用可能な オプションについては、 pam-config(8) で表示される マニュアルページをお読みください。

2.6. 手作業での PAM 設定

PAM の設定ファイルを手作業で作成したり管理したりしたい場合は、これらの ファイルに対して pam-config を無効化していることを 確認する必要があります。

pam-config --create コマンドを利用して、何もない状態 から PAM の設定ファイルを作成すると、 common-* から common-*-pc に対するシンボリックリンクが作成されます。 pam-config は common-*-pc の設定ファイルのみを修正 する仕組みであるため、これらのシンボリックリンクを削除すると、 pam-config は common-*-pc ファイルのみを操作する仕組みであり、 これらのファイルはシンボリックリンク無しでは効果の無いものであるため、 pam-config を簡単に無効化することができます。

2.7. さらなる情報

pam-doc パッケージをインストールすることで、 /usr/share/doc/packages/pam ディレクトリ内に 下記のような様々な文書が配置されます (いずれも英語です):

README

上記のディレクトリの直下には、それぞれの PAM モジュール向けの modules サブディレクトリが存在していて、 その中には README ファイルが用意されています。

The Linux-PAM System Administrators' Guide

この文書には、システム管理者が PAM について知っておくべき全ての項目が 含まれています。たとえば PAM の設定ファイルの文法から、セキュリティ まわりの考慮事項など、幅の広い範囲が含まれます。

The Linux-PAM Module Writers' Manual

この文書には、管理者の視点からのトピックが含まれていて、たとえば標準に 準拠した PAM モジュールの書き方などが記されています。

The Linux-PAM Application Developers' Guide

この文書には、 PAM ライブラリを使用するアプリケーションの開発者に 対する全ての内容が含まれています。

The PAM Manual Pages

一般的な PAM の情報や、全てのコンポーネントの機能概要を提供する マニュアルページなどが含まれています。


openSUSE セキュリティガイド 13.1