3. PAM (Pluggable Authentication Modules)

PAM (Pluggable Authentication Modules) は現在的な ディストリビューションにおけるユーザ認証の核となるものです。

3.1. なぜ PAM なのか

古き良き時代の Linux であれば、supasswdlogin あるいは xlock と いったプログラムは、ユーザ認証の必要が生じた時に、/etc/passwd から必要なユーザ情報を読み込めばいいだけでした。 ユーザパスワードの変更が必要なら、/etc/passwd ファイルを 編集するだけでした。 しかし、この単純ですが稚拙な方法のために、システム管理者やアプリケーション 開発者は数々の問題に直面することになったのです。MD5 とシャドーパスワードの利用 がだんだんと広がるにつれて、ユーザ認証を必要とするプログラムは、何種類もの異 なる認証方法を扱う際にその認証方法に適した情報を得る手段を個別に知っていなけ ればならなくなったからです。また、認証方式を変更したい場合は、そうしたすべて のプログラムをコンパイルし直さなければなりませんでした。PAM は、ユーザ情報が 保存される方法とは無関係な透過的ユーザ認証方式をプログラムに提供することで、 この煩雑な手続きを一掃したのです。

3.2. PAM とは何か

Linux-PAM System Administrator's Guide から引用すると、「Linux-PAM プロジェクトの目的は、ユーザに何らかの権限を付与するソフトウェアの開発を、 安全かつ適切な認証方式自体の開発から分離することです。この目標は、関数のライ ブラリを提供し、アプリケーション側でそれを使ってユーザ認証をリクエストする 仕組みを作ることで達成されました。」 つまり、PAM があれば、パスワードが /etc/passwd にあるか、 香港のサーバ上にあるかといったことは問題ではなくなります。プログラムがユーザ 認証を必要としたときは、PAM が適切な認証方式のための関数を含むライブラリを提供 してくれます。このライブラリは動的にロードされるので、認証方式の変更は設定 ファイルの編集だけで実現可能になるのです。

柔軟性は PAM が最強である理由のひとつです。PAM の設定によって、あるプログラム のユーザ認証権の行使を禁止したり、特定のユーザだけの認証を可能にしたり、あ るいは、プログラムがユーザ認証をしようとすると警告を発したり、さらに全ての ユーザをログインできなくしてしまったりできるようになります。PAM のモジュール 設計は、ユーザ認証方法の完全な管理を可能にします。

3.3. PAM の設定

一般的な話はこれくらいにして、問題を掘り下げましょう。

3.3.1. PAM の設定ファイル

PAM の設定ファイルは、/etc/pam.d に保存されています。 (もし /etc/pam.d というディレクトリが ないとしても心配いりません。次章で取り上げます。) そのディレクトリに行って、 中を覗いてみましょう。

  ~$ cd /etc/pam.d
  /etc/pam.d/$ ls
  chfn	chsh	login	other	passwd	su	xlock
  /etc/pam.d/$ 
  

システムに何をインストールしているかによって、このディレクトリにあるファイルは 多少増減するかもしれません。詳細はどうであれ、システム上でユーザの認証に関わ るプログラムごとにひとつのファイルが存在することが分かると思います。既に気付 いたかもしれませんが、どのファイルも PAM による認証の設定ファイルなのですが、 それぞれ該当するプログラムと同一の名前が付いています。 ( other だけが例外です が、これはすこし後で話します。) それではパスワードに関連した PAM の設定ファイ ルを見てみましょう。(次のファイルは分かり易くするために単純化してあります。)

  /etc/pam.d/$ cat login
  # PAM 設定ファイル( login プログラム用 )
  auth       requisite  pam_securetty.so
  auth       required   pam_nologin.so
  auth       required   pam_env.so
  auth       required   pam_unix.so nulok
  account    required   pam_unix.so
  session    required   pam_unix.so
  session    optional   pam_lastlog.so
  password   required   pam_unix.so nullok obscure min=4 max=8
  

このファイルを掘り下げる前に、少し説明すべきことがあります。

3.3.3. 設定ファイルの構文

PAM の設定ファイルは以下のような構文になっています。

  type  control  module-path  module-arguments
  

login プログラム(先ほどの記述を見てください)の設定 ファイルを参考にして、PAM 設定ファイルの構文を見てみましょう。

PAM の設定字句

type

type という字句では、その行のモジュールでどういう認証の型が使用 されるべきかを PAM に知らせます。 認証の際に複数の要求をユーザに課す場合は、同じ型のモジュールを 重複して使用することもできます。PAM は次の 4 つの型を認識します。

上記 login の設定ファイルでは、type の各々の型 が最低でもひとつのエントリーを形成しているのが分かると思います。 login プログラムは、その名前の通りユーザの「ログイン」そのも のを許可するプログラムなので、認証の過程ですべての異なった型にアクセスす る必要があることは納得できると思います。

control

control 字句が果たす役割は、認証が失敗したときに何をすべきかを PAM に伝えることです。PAM が理解するのは次の 4 つの control 型 です。

login プログラムの設定ファイルでは、異なる control 型のほぼ全てを見ることができます。required 型のモジュール の大部分は pam_unix.so (メインの認証モジュール)です。 そして、ひとつの requisite 型のモジュールが pam_securetty.so (ユーザが安全なコンソールでログインしているか 確かめるもの)であり、ひとつの optional 型のモジュールが pam_lastlog.so (前回ログインしたときのユーザの情報を取ってくる モジュール)となっています。

(訳注: control については、新しい構文も開発されています。 詳細は、The Linux-PAM System Administrators' Guide をご覧ください)

module-path

module-path の役割は、どのモジュールを使用するか、(オプションとし て)それがどこにあるかを PAM に伝えることです。login の設定 ファイルに見られるように、大部分の設定ファイルではモジュール名だけが含まれてい ます。この場合、PAM は、PAM 用のデフォルトディレクトリ、通常は /usr/lib/security/ を探します。しかし、 もし使っているディストリビューションが Linux ファイルシステムの標準規格に従って いるなら、PAM モジュールは /lib/security ディレクトリにあるでしょう。

module-arguments

module-arguments は、モジュールに渡す引数を指定するものです。 それぞれのモジュールが自分自身の引数を持っています。例えば、login の設定ファイルであれば、"nullok" ("null ok" を意味します)という引数は、pam_unix.so モジュールに渡されますが、その意味は、パスワードとして何も入力しな くても(null)認証されるということです。

3.4. もっと多くの情報を入手する方法

PAM の設定や PAM の全モジュールのリファレンスなど、より詳細な情報が必要なとき は、Linux-PAM System Administrator's Guide を参考にしてください。 このガイドは、PAM の設定に関するあらゆることを説明するもので、最新のリファレ ンスでもあります。