【再掲】Linux-PAM 0.99 upgrade guide日本語超意訳版


 旧 tech::dameningen で Linux-PAM 0.99 upgrade guide の超意訳文を公開していたが、不幸な RAID のトラブルにより消えていた。面倒なのでそのままにしていたが、最近、IBM developperWorks の記事からリンクされていることに気づいたのでサルベージしたものを再掲しておく。なお、内容は最初に翻訳した2007年11月28日時点のものなので、現在では変更されている可能性があることに気をつけて欲しい。

はじめに

 このガイドは、旧バージョンのLinux-PAMをバージョン0.99ベースのものにアップグレードするためのものです。Gentoo Linuxが採用しているバージョン0.99では、RedHat/Fedoraが作成したパッチは適用されなくなりました。そのため、これまでサポートされていたいくつかの機能が使用できなくなっています。ちなみに、RedHat版でもそのうちいくつかはサポートされていません。

 このため、旧バージョンからのアップグレードは簡単ではありませんし、アップグレード中にシステムまたはサービス類のアップグレードが同時に行われなかった場合、認証系の設定をする必要がある場合があります。また、sys-libs/pamパッケージから削除されたり分割されたモジュールがありますので、必要に応じてそれぞれマージする必要があります。

注意: このガイドを読んでビックリする必要はありません。もし2005年9月以降にGentoo Linuxをインストールしたのでしたら、アップグレードは難しくありませんし、このガイドは何かと興味深いものになるでしょう。もしそれ以前にインストールしたとしても、ガイドブック通りにアップグレードしてPAM関連のファイルを自分で設定していなければ問題はないでしょう。ほとんどの設定ファイルは既にアップグレードされているはずです。もしPAM関連の設定をカスタマイズしているのでしたら、おそらく再設定の必要がありますが、やり方は既に知っているはずです。

 このアップデートで何か機能が失われることはありません。RedHatパッチのほとんどは、多少異なった方法ですでにLinux_PAMに実装されています。分割されたモジュールはebuildシステムで別のパッケージとして管理されており、依存関係に応じてインストールされます。

 最新のLinux-PAMを追いかけることは重要です。というのは、Linux-PAMはGentoo Linuxの重要なパーツであり、デフォルトの認証システムとして使われているからです。このため、Linux-PAM 0.99へのアップグレードは、システムを安全かつセキュアに保つために大いに推奨されています。

重要: どんなバージョンであれ、PAMをアップグレードしたあとは、PAMに依存するバイナリ間の互換性を保つためにPAMに依存するサービス、たとえばsshdやvixie-cronおよび恐らくその他のcronデーモン、メールサーバ、そしてその他のユーザがログインする全てのサービスをリスタートする必要があります。

 ユーザが変更した設定は、PAM設定ファイルがある/etc/pam.d/以下のファイルに反映させなければなりません。sys-libs/pamのアップデートの前に、バックアップファイル(*~)を削除してください。削除しないと安全にemergeできません。

 安全なものにするために、sys-libs/pamをemergeする際に、/etc/pam.dに現在は非推奨なモジュールが存在しないかチェックし、もし今も使われている場合は、あなたが自分自身のシステムにログインできなくなることを防ぐためにemergeを中断します。設定ファイルの特性上、すでに削除したパッケージの設定ファイルが含まれている場合があります。そのため、まずは、すでに削除されたパッケージの設定ファイルが存在しないか確認してください。たとえば、app-portage/portage-utilsqfileコマンドなどを使ってください。

# qfile -o /etc/pam.d/*
/etc/pam.d/sshd
/etc/pam.d/system-auth~
/etc/pam.d/vmware-authd

/etc/pam.dディレクトリに存在するこれらのファイルのほとんどは、ファイル名が~で終わるエディタで作成されたバックアップファイルです。これらのファイルは、あなたが自分自身で意識して作ってはいなくても、恐らくは過去のセットアップで残されたものでしょうから、削除するか移動したほうがいいでしょう。ただし例外として、vmware-config.plが生成したVMwareサーバ用の/etc/pam.d/vmware-authdが上げられます。ただし、もしあなたが変更していないとしても削除して問題はないでしょうし、再度vmware-config.plを実行するだけです。

主な変更点は?

 前述の通り、バージョン0.78から0.99への変更点は、RedHatパッチが適用されなくなったことですが、実際に何が変わったかはまだ説明していません。簡単に言えば、以下のモジュールが削除されました。pam_stack, pam_pwdb, pam_radius (旧pwdbフラグ), pam_timestamp

 pam_chrootフラグはもう存在しませんし、RedHatパッチ由来のモジュールはsys-libs/pamにはありせん。現在はsys-auth/pam_chrootにあります。

 また、pam_userdbモジュールをビルドするためのberkdbフラグは削除され、手動で同じ名前のsys-auth/pam_userdbパッケージをemergeする必要があります。また、pam_consoleフラグも削除されており、今は利用不能です。これについては後述しますので、参照してください。

 この他のpam_stackを含めた全ての削除済みモジュールがどうなったか、パッケージとして分割されたのかは、Bugzillaに問い合わせてください。

pam_consoleについて

 pam_consoleモジュールは、RedHatが、例えばXにGUIからログインするのかコンソールからログインするのかといったログイン経路によってデバイスに異なるパーミッションをセットするためにデザインしたものです。このアプローチは、以前デバイスを動作させられないといった複数の問題があったことからデフォルトではoffになっており、必要に応じてpam_consoleフラグでリンクするようになっていました。

バージョン0.99では、すべてのRedHatパッチが削除されています。pam_consoleはもうパッケージには含まれていません。必要に応じてしばらくはsys-auth/pam_consoleパッケージとしてemergeできますが、セキュリティ上の問題からマスクされており、Linux-PAMからは削除されています。

 pam_consoleは、ConsoleKitに置き換わることによって徐々に必要ではなくなっています。このようなpam_consoleに似た動作をするコードはアップデートするよう推奨されているおり、代替としてConsoleKitを使ったり、pam_groupモジュールをインストールしてplugdevグループに属するようにする方法があります。

分割されたモジュール

 berkdbフラグにより、シンプルなバークレイDBによる認証を実装したpam_userdbモジュールを利用できました。このモジュールはモジュールのソースコードと一緒に配布されるバークレイDBを静的リンクさせる必要があったため、問題が発生したときのリスク軽減とPAMのメンテナンスを簡単にするために別パッケージに切り出されました。新しいパッケージはsys-auth/pam_userdbです。

 重要なポイントは、モジュールのコードを最新のものにアップデートしたとしてもコードに含まれるバークレイDBはバージョン4.3だということで、例えセキュリティ上の問題があったとしても、後方互換性の問題からバークレイDBそのもののアップデートは予定に入っていないことです。そのため、ユーザを管理するデータベースを操作する際には、バージョン4.3のツールを使う必要があります。sys-auth/pam_userdbパッケージは通常は使われず、必要なユーザのみが使用するものです。

 pam_chrootモジュールについても同様で、新しくsys-auth/pam_chrootパッケージとしてインストール可能ですので、新しいパッケージを使ってください。

pam_stackとincludeディレクティブ

 PAMはいろいろなソフトウェアやサービスに対していろいろな認証方式を提供するようにデザインされています。例えば、通常のUNIX認証系でローカルユーザをログインさせるのと同時に、メールユーザに対してはデータベースでの認証を提供したりすることが挙げられます。HTTPサーバのようなシステムユーザ以外の接続は想定しないようなデスクトップユーザやサーバにおいては、ほとんどの場合、システムのパスワードデータベースを通じた認証を使いたいのではないでしょうか。

 このことから、同じようなPAM設定ファイルのコピーを管理することを避けるために、単一またはより共通化されたシステム認証系の設定を書けるような拡張の実装を始め、こういった共通の認証系を使うように啓蒙しはじめたLinuxディストリビューションが多くなってきました。

バージョン0.77までは、Linux-PAM自体にはこのような拡張はありませんでしたが、Gentoo LinuxのPAMはPAM内部でフックしていろいろなサービス設定を上書きするRedHatのpam_stackモジュールを採用しました。この手法は標準的なものでもありませんし、ポータブルでもありませんでした。さらに内部のライブラリ構造を大幅に手直しする必要がありました。

 代替案としてALTlinuxがOpenPAM向けにデザインしたものが、includeディレクティブの使用でした。これは、PAMの実装自体で内部的に処理され、サービスごとに設定が効率的に読み出されて相当するクラスのモジュールに引き渡されます。これはLinux-PAM .078以降で実装されたものと同じ拡張で、現在ではGentoo Linuxのみがサポートしています。また、サポート対象のディストリビューションでも同様に動作します。

 pam_stackを使うこれまでの設定からincludeディレクティブを使う新しい設定に書き換えるには、以下のように変更してください。

(旧バージョン)
auth    required     pam_stack.so    service=system-auth

(上を以下の通り書き換え)
auth    include      system-auth

重要: PAM設定には、auth, account, password, sessionの4つの認証形式があります。 必要に応じてauthから変更してください。

 この変更により、認証順を入れ替える必要がある場合があります。pam_nologinといったモジュールはpam_stackの後に記述されていましたが、今後はincludeディレクティブの前に記述する必要があります。

(旧バージョン)
auth    required     pam_stack.so    service=system-auth
auth    required     pam_nologin.so

(新バージョン)
auth    required     pam_nologin.so
auth    include      system-auth

 この変更で何か動かなくなることはないでしょうし、安全でしょう。pam_stackは必要なディレクティブ以外では動作しません。Portageツリー上のebuildでインストールされるであろうPAMの設定は、最近のものはすべて新しい記述法で書かれています。