Linux では認証処理に際して PAM (Pluggable Authentication Modules; プラグインを使用することのできる認証モジュール) を利用し、ユーザとアプリケーションとの間の仲介を行っています。 PAM のモジュールはシステム全体に対して提供されているため、様々なアプリケーションから利用できるようになっています。本章では、このようなモジュール型の認証機構の動作と、設定方法について説明しています。
システム管理者やプログラマは、システムの特定の箇所や、アプリケーション内の特定の機能に対してアクセスを制限したいと考えることがあります。 PAM の無い状態では、それぞれのアプリケーションは LDAP や Samba, Kerberos など、様々な認証機構に対応しなければならなくなります。このような開発には時間を要するばかりか、開発によってエラーを引き起こす可能性すらあります。このような欠点を防ぐ唯一の方法は、認証の仕組みとアプリケーションを分離するという方法で、集中管理されたモジュール内で、認証の仕組みを代行させるやり方です。このような仕組みであれば、新しい認証方式が開発された場合でも、対応する PAM モジュール を作成すれば、アプリケーション側ですぐに利用できるようになります。
PAM は下記のような考え方から成り立っています:
PAM モジュール: 特定の認証機構に対応する共有ライブラリです。
モジュールスタック: 複数の PAM モジュールから構成されるものです。
PAM 対応の サービス: モジュールスタック、もしくは PAM モジュールを利用して、認証の仕組みを利用するものです。通常、サービスは login
や su
のように、対応するアプリケーションに対する分かりやすい名前を指定します。サービス名 other
は、既定のルールで使用される予約語です。
モジュールのパラメータ: 特定の PAM モジュールに対して、その処理に影響を与えるためのものです。
結果: それぞれの PAM モジュールの実行結果を意味します。正の値が返された場合、次の PAM モジュールを実行します。負の値は設定によって異なる動作となり、 「何も影響を与えず、そのまま次のモジュールに進む」 から 「即時に終了する」 まで、様々な処理を行うことができます。
PAM は下記の 2 種類の方式で設定することができます:
/etc/pam.conf
)それぞれのサービスに対する設定を /etc/pam.conf
に書き込む方式です。この方式は、メンテナンス性と利便性が損なわれることから、 openSUSE Leap では使用していません。
/etc/pam.d/
)PAM の仕組みを利用する各サービス (もしくはプログラム) に対する設定を、 /etc/pam.d/
ディレクトリ内のそれぞれの設定ファイルに保存する方式です。たとえば sshd
サービスに対する設定は、 /etc/pam.d/sshd
ファイル内に書き込むことになります。
/etc/pam.d/
ディレクトリ内のファイルでは、認証に使用する PAM モジュールを設定します。ファイル内の各行には最大で 4 つの値を指定します:
種類 制御 モジュールパス モジュールパラメータ
それぞれの意味は下記のとおりです:
PAM モジュールの種類を指定します。 PAM モジュールはスタックとして処理されます。それぞれの種類はそれぞれ別々の目的で使用します。たとえば一方のモジュールではパスワードをチェックし、他方のモジュールではシステムにアクセスする際のアクセス元をチェックし、さらに別のモジュールではユーザ固有の設定を読み込む、などです。 PAM では、下記 4 つのモジュールの種類に対応しています:
auth
従来であればパスワードの問い合わせなど、ユーザの正当性を確認するための種類です。現在では IC カードによる認証や生体認証 (指紋認証、虹彩認証など) も使用することができます。
account
そのサービスを使用できる権限があるかどうかを確認するための種類です。たとえば有効期限の切れたユーザ名でログインできないようにする、などの目的で使用します。
password
認証トークン (通常はパスワード) の変更を有効化するための種類です。
session
ユーザセッションを管理したり設定したりするための種類です。ログインに際しては認証前と認証後の両方で開始され、ユーザ固有の環境 (メールアカウント、ホームディレクトリ、システム制限など) を設定するために使用します。
PAM モジュールの動作を表す箇所です。それぞれのモジュールには、下記のような制御フラグを設定することができます:
required
このフラグを設定したモジュールは、認証を成功させるにあたって必ず成功しなければならないものであることを表します。 required
フラグを設定したモジュールが失敗すると、同じフラグを設定した他のモジュールは、ユーザが認証失敗メッセージを受け取る前に処理が行われます。
requisite
このフラグを設定したモジュールは、 required
フラグと同様に処理が成功しなければならないものであることを表します。ただし、このフラグを設定したモジュールが失敗すると、ユーザに対して即時にフィードバックが送られ、その他のモジュールは処理されなくなります。成功した場合は、 required
フラグを設定した場合と同様に、その他のモジュールは引き続き処理されます。 requisite
フラグは、認証を成功させるために必要な条件をチェックするための基本フィルタとして動作します。
sufficient
このフラグを設定したモジュールの処理が成功すると、それより前に存在する required
フラグ付きのモジュールの処理が失敗しない限り、サービスは成功を示すメッセージを即時に受け取り、その他のモジュールが処理されなくなります。なお、 sufficient
フラグが設定されたモジュールの処理が失敗しても、直接的な結果には至らず、残りのモジュールは通常通り処理されます。
optional
このフラグを設定したモジュールの処理は、成功した場合も失敗した場合も、直接的な影響を与えません。このフラグは、メッセージ (たとえばメールが到着しているなど) を表示し、それ以外の処理を行わないモジュールを使用する場合に有用です。
include
このフラグを指定した場合、この位置に指定した追加設定を取り込むことを表します。
PAM モジュールに対する完全なファイル名を指定します。モジュールが既定のディレクトリ (32 ビット版の場合は /lib/security
, 64 ビット版の場合は /lib64/security
) 内に存在している場合、ディレクトリを指定する必要はありません。
PAM モジュールの動作に影響を与えるための、スペース区切りのパラメータリストです。たとえば debug
(デバッグの有効化) や nullok
(空のパスワードを許可する) などがあります。
これらに加えて、 /etc/security
ディレクトリ内には PAM モジュール向けのグローバルな設定ファイルが用意されています。このディレクトリ内には、モジュールに対する動作設定が書かれています (pam_env.conf
や time.conf
など) 。 PAM モジュールを使用する各アプリケーションは、 PAM の機能を実際に呼び出したあと、様々な設定ファイルに含まれる情報を処理して、結果を返します。
PAM モジュールの作成やメンテナンスを簡略化する目的で、 auth
, account
, password
, session
の各種類に対応する一般的な既定の設定ファイルが用意されています。これらは、各アプリケーション側の PAM 設定から読み込まれるようになっているため、これらの設定ファイルが更新されると、それぞれの PAM 設定ファイルを個別に書き換えることなく、各アプリケーションに適用できるようになっています。
このような PAM のグローバル設定ファイルは、 pam-config
ツールを利用して管理します。このツールは設定ファイルに新しいモジュールを自動的に追加したり、既存の設定ファイルを変更したり、既存の設定ファイルからモジュール (もしくはオプション) を削除したりすることができます。このような仕組みにより、 PAM の設定ファイルを手作業で管理する手間が最小化できているばかりか、場合によっては全く不要にもなっています。
64 ビットのオペレーティングシステムをお使いの場合、 32 ビットアプリケーション向けのランタイム環境をそろえることもできます。この場合、 32 ビット版の PAM モジュールを追加でインストールする必要があります。
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 session optional pam_lastlog.so silent noupdate showfailed 5
設定ファイルのバージョンを表す文字列です。慣習として書かれているだけの項目ですが、将来のバージョンでも使用できるよう、必ず記述しておくことをお勧めします。 | |
| |
4 種類のモジュールタイプに対して、それぞれ設定ファイルを参照しています ( | |
認証を行ったプロセスに対して、ログイン UID プロセス属性を設定します。 | |
ユーザの最終ログイン情報を表示します。 |
それぞれの PAM モジュールに対する設定ファイルに個別に追加していく代わりに、他の設定ファイルを取り込むように指定することで、管理者側が既定値を変更するだけで、その設定を取り込み元のモジュールに反映させることができるようになります。従来は PAM に対して変更があったり、新しいアプリケーションをインストールしたりするたびに、全ての設定ファイルを手作業で調整しなければなりませんでした。現在はこのような仕組みになっているため、設定の変更を一箇所で行うことができるようになっていて、各サービスの PAM 設定にもそのまま反映できるようになっています。
最初の include
では common-auth
という設定ファイルを取り込むように指定していますが、ここでは auth
の種類に対して、 3 種類のモジュール (pam_env.so
, pam_gnome_keyring.so
, pam_unix.so
を呼び出しています。詳しくは 例2.2「auth
セクションに対する既定の設定 ( common-auth
)」) をご覧ください。
auth
セクションに対する既定の設定 ( common-auth
) #auth required pam_env.so 1 auth optional pam_gnome_keyring.so 2 auth required pam_unix.so try_first_pass 3
| |
| |
|
auth
内の全てのモジュールは、 sshd
側でログインが成功したかどうかについて、結果を得る前に処理が行われます。また、制御フラグ required
が設定された全てのモジュールは、 sshd
が肯定応答を受け取るよりも前に成功していなければなりません。これらのうちのいずれかのモジュールが成功以外の状態になると、残りのモジュールはそのまま処理されるものの、最終的には sshd
が否定応答を受け取ることになります。
auth
の種類が設定された全てのモジュールが成功すると、その他のステートメントが処理されるようになります。この場合は 例2.3「account
セクションに対する既定の設定 ( common-account
)」 で示されている内容になります。この common-account
には 1 つのモジュール (pam_unix
) のみが書かれています。この pam_unix
は対象のユーザが存在しているかどうかを返すもので、 sshd が成功を表すメッセージを受け取ると、さらに続くモジュールスタック (この場合は 例2.4「password
セクションに対する既定の設定 ( common-password
)」 に示されている password
) を実行することになります。
account
セクションに対する既定の設定 ( common-account
) #account required pam_unix.so try_first_pass
password
セクションに対する既定の設定 ( common-password
) #password requisite pam_cracklib.so password optional pam_gnome_keyring.so use_authtok password required pam_unix.so use_authtok nullok shadow try_first_pass
sshd
の PAM 設定では、 common-password
のファイル名で指定されている password
モジュール向けの既定の設定のみが include で設定されています。ここには、アプリケーションが認証トークンの変更を要求した場合、必ず成功しておかなければならないもの (制御フラグ requisite
および required
) が書かれています。
パスワードなどの認証トークンを変更する際には、セキュリティチェックを必要とします。セキュリティチェックは pam_cracklib
モジュールで行います。 pam_unix
モジュールはその後に動作するモジュールで、 pam_cracklib
から古いパスワードと新しいパスワードを受け取ります。これにより、パスワードの変更に際しても、ユーザ側で再度認証を行う必要が無いようにしています。また、このような仕組みにより、 pam_cracklib
側のチェックは回避できないようにもなっています。 account
や auth
の種類でパスワードの有効期限を確認するよう設定する場合は、 password
モジュールも使用する必要があります。
session
セクションに対する既定の設定 ( common-session
) #session required pam_limits.so session required pam_unix.so try_first_pass session optional pam_umask.so session optional pam_systemd.so session optional pam_gnome_keyring.so auto_start only_if=gdm,gdm-password,lxdm,lightdm session optional pam_env.so
最後のステップとして、 session
の種類が指定されたモジュール (common-session
ファイル内に書かれています) を呼び出して、対象のユーザの設定に従ってセッションを設定します。 pam_limits
モジュールは /etc/security/limits.conf
ファイルを読み込むモジュールで、特定のシステム資源の使用に対して制限を設定することができるものです。ここでは再度 pam_unix
モジュールを使用しています。 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」 をご覧ください。
REMOTEHOST DEFAULT=localhost OVERRIDE=@{PAM_RHOST} DISPLAY DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
最初の行では環境変数 REMOTEHOST
の値に対して、 pam_env
側で判断が付かなかった場合、 localhost
を設定するよう指定しています。 2 行目の DISPLAY
環境変数は、 REMOTEHOST
の値をもとに設定を行う意味です。詳しくは /etc/security/pam_env.conf
内のコメント (英語) をお読みください。
pam_mount
は、ログインの処理中にユーザのホームディレクトリをマウントし、ログアウト時にマウントを解除するためのモジュールです。一般的には、中央のファイルサーバ内にユーザのホームディレクトリが存在しているような環境で使用するものです。この方式を使用することで、 /home
全体を共有してマウントする必要がなくなり、ログインしているユーザのホームディレクトリのみをマウントして使用できるようになります。
pam_mount
をインストールすると、 /etc/security
内に pam_mount.conf.xml
に対するテンプレートファイルが用意されるようになります。要素の説明について、詳しくは man 5 pam_mount.conf
で表示されるマニュアルページをお読みください。
なお、 YaST を利用することで、この機能に対する基本的な設定を行うことができます。
› › を選択して、ファイルサーバを追加してください。システムに対する制限は、 pam_limits
モジュールが読み込む limits.conf
ファイルで設定することができます。制限はユーザ単位やグループ単位で設定することができます。このファイルでは、超過を許さないハード制限のほか、一時的であれば超過を許すソフト制限も設定することができます。文法とオプションについて、詳しくは /etc/security/limits.conf
ファイル内のコメント (英語) をお読みください。
pam-config
ツールは、グローバルな PAM 設定ファイル ( /etc/pam.d/common-*
) やいくつかのアプリケーション設定を行う際の支援ツールとなるものです。対応するモジュールの一覧は、 pam-config --list-modules
を実行して得ることができます。また、 pam-config
コマンドは、お使いの PAM 設定ファイルを管理するためにも使用することができます。 PAM 設定への新しいモジュールの追加や、既存のモジュールの削除、モジュールに対する設定の変更などを行うことができます。グローバルな PAM 設定ファイルを変更する場合は、個別のアプリケーションに対して PAM の設定を手作業で調整する必要はありません。
pam-config
の使用例としては、下記のようなものがあります:
新しい Unix 形式の PAM 設定の自動生成: pam-config に対して、あとから追加や変更ができるよう、最もシンプルな設定を作成するように指示します。具体的には pam-config --create
というコマンドを実行することで、シンプルな Unix 認証設定を作成することができます。 pam-config で管理されていない設定が既に存在していた場合、設定は上書きされてしまいますが、バックアップコピーが *.pam-config-backup
という形式で保存されます。
新しい認証方式の追加: 新しい認証方式 (たとえば SSSD) をお使いの PAM モジュールスタックに追加するには、 pam-config --add --sss
のようにコマンドを実行します。このコマンドを実行すると、全ての common-*-pc
PAM 設定ファイルの該当箇所に対して SSSD が追加されます。
テスト目的でのデバッグの有効化: 新しい認証の仕組みが期待通りに動作しているかどうかを確認するには、全ての PAM 関連操作に対して、デバッグ機能を有効化する必要があります。たとえば pam-config --add --sss-debug
のように実行すると、 SSSD 関連の PAM 操作に対して、デバッグが有効化されます。 デバッグ出力は、 systemd
のジャーナル (詳しくは 第11章 「journalctl
: systemd
ジャーナルへの問い合わせコマンド」 をお読みください) 経由で読むことができます。
設定の問い合わせ: 新しい PAM の設定を適用する際には、必要な全てのオプションを指定しているかどうかを確認しておいてください。 pam-config --query --
モジュール名 コマンドを実行すると、使用されている種類の一覧と、モジュールに対して指定されているオプションを表示することができます。
デバッグオプションの削除: 設定に問題がないことを確認し終えたら、最後にデバッグオプションを削除します。たとえば pam-config --delete --sss-debug
のように実行すると、たとえば pam_ssh.so
に対して設定していたデバッグを無効化することができます。他のモジュールの場合も、同じようなコマンドで無効化することができます。
pam-config
コマンドに対する詳しい使用方法と利用可能なオプションについて、詳しくは pam-config(8)
のマニュアルページをお読みください。
PAM の設定ファイルを手作業で作成もしくは管理したい場合は、これらのファイルに対する pam-config
を無効化する必要があります。
pam-config --create
コマンドを利用して独自の PAM 設定ファイルを手作業で作成する場合、 common-*
から common-*-pc
ファイルに対するシンボリックリンクが作成されます。 pam-config
では common-*-pc
の設定ファイルのみを修正しますので、これらのシンボリックリンクを削除することで、 pam-config を効率的に無効化することができます。
pam_systemd.so
を含める必要性について独自の PAM 設定を作成する場合は、 pam_systemd.so
モジュールをsession optional
で指定するようにしてください。 pam_systemd.so
を含めるように指定しないと、 systemd
のタスク制限で問題が発生するようになります。詳しくは pam_systemd.so
のマニュアルページをお読みください。
ローカルログイン時にさらにセキュリティを高める方法として、 pam-u2f
フレームワークと YubiKey 等の U2F 機能を持つセキュリティキーを利用した 2 要素認証を設定することができます。
お使いの システムに対して U2F を設定するには、まず システムで鍵とアカウントの紐付けを行う必要があります。紐付け後は鍵を使用するように設定するだけです。手順はそれぞれ後続の章で説明しています。
U2F キーとアカウントの紐付けを行うには、下記の手順を行います:
まずは通常通りシステムにログインします。
U2F キーを接続します。
U2F キーの設定のためのディレクトリを作成します:
>
sudo
mkdir -p ~/.config/Yubico
pamu2fcfg
コマンドを実行して、出力結果を設定として出力します:
>
sudo
pamu2fcfg > ~/.config/Yubico/u2f_keys
接続したデバイスに搭載された LED が点灯したら、接続確認のためにデバイスの金属接点に触ってください。
なお、予備の U2F デバイスを用意して設定しておくことをお勧めします。下記のようなコマンドを実行します:
下記を実行します:
>
sudo
pamu2fcfg -n >> ~/.config/Yubico/u2f_keys
接続したデバイスに搭載された LED が点灯したら、接続確認のためにデバイスの金属接点に触ってください。
出力されたファイルは、既定の場所から sudo
での許可が必要なディレクトリに移動させておくことで、さらにセキュリティを高めることができます。たとえば /etc
ディレクトリ以下に移動したい場合は、下記のような手順を実施します:
まずは /etc
以下にディレクトリを作成します:
>
sudo
mkdir /etc/Yubico
あとは作成したファイルを移動するだけです:
>
sudo
mv ~/.config/Yubico/u2f_keys /etc/Yubico/u2f_keys
u2f_keys
ファイルを非標準の場所に配置する場合について出力されたファイルを既定のディレクトリ ( $HOME/.config/Yubico/u2f_keys
) 以外に移動させる場合、 2.7.2項 「PAM 設定の更新」 に示された手順に従って、 /etc/pam.d/login
ファイル内にそのディレクトリを設定しておく必要があります。
U2F キーの設定が終わったら、あとはシステムの PAM 設定を調整するだけです。
まずは /etc/pam.d/login
ファイルを開きます。
下記のようにして auth required pam_u2f.so
という行を追加します:
#%PAM-1.0
auth include common-auth
auth required pam_u2f.so
account include common-account
password include common-password
session optional pam_keyinit.so revoke
session include common-session
#session optional pam_xauth.so
なお、 $HOME/.config/Yubico/u2f_keys
以外のディレクトリに u2f_keys
ファイルを配置している場合は、 /etc/pam.d/login
ファイル内で、 authfile
オプションを指定する必要があります:
#%PAM-1.0
auth requisite pam_nologin.so
auth include common-auth
auth required pam_u2f.so authfile=<U2F_キーのディレクトリ>
...
ここで、 <U2F_キーのディレクトリ> には、 u2f_keys
ファイルのあるディレクトリを絶対パスで指定します。
pam-doc
パッケージをインストールすると、 /usr/share/doc/packages/pam
ディレクトリ内に下記のような追加のドキュメンテーションが提供されるようになります:
このディレクトリの直下には modules
サブディレクトリがあり、ここには利用可能な PAM モジュールに関する説明 (英語) の書かれた README ファイルがあります。
この文書には、システム管理者が PAM について知っておくべき内容を説明しています。設定ファイルの文法から、 PAM のセキュリティ要素までの範囲を説明しています。
この文書には、開発者の観点からの内容を説明しています。具体的には、標準に準拠した PAM モジュールの作成方法などを説明しています。
この文書には、 PAM ライブラリを使用したいアプリケーション開発者に対して、必要な情報が含まれています。
PAM の一般的な説明と、全てのコンポーネントの機能をよりよく説明するためのモジュール向けマニュアルページが用意されています。