PAM認証とは

FTPサーバを設定する際にPAM認証という言葉が出てきたので調べてみました。

PAM認証とは

PAM とは Pluggable Authentication Modules の略で、ユーザ認証を行うためのモジュール群とそのAPIを指します。

OS によるユーザ認証を独立させ、各アプリケーションが使用できる共通部品としてモジュール化したものをPAMと呼びます。

PAM は Solaris、HP-UX、FreeBSD、Linux など幅広いシステムで使用されています。

このPAMを使用した認証をPAM認証と呼びます。


例えば FTP サーバとして動作する vsftpd は、設定次第でOSのユーザ名とパスワードでログインができますが、ここで使われているのが PAM です。

認証を共通部分として独立させることによって以下のメリットが得られます。

  • 各アプリケーションで認証処理を1から実装しなくてよい
  • 認証処理に修正がある場合でも各アプリケーションはそのままでよい(アップデートや再コンパイルが必要ない)

セキュリティ面でもいいのかな?


PAM の設定ファイルは /etc/pam.d にサービスごとに設置されています。

[root@a9f1d86a1421 /]# ls /etc/pam.d
chfn              login          postlogin  smartcard-auth  systemd-user
chsh              other          remote     su
config-util       passwd         runuser    su-l
fingerprint-auth  password-auth  runuser-l  system-auth

su や login といったコマンドも PAM を使用していることがわかります。

設定ファイル

[root@a9f1d86a1421 /]# cat /etc/pam.d/su
#%PAM-1.0
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
auth		substack	system-auth
auth		include		postlogin
account		sufficient	pam_succeed_if.so uid = 0 use_uid quiet
account		include		system-auth
password	include		system-auth
session		include		system-auth
session		include		postlogin
session		optional	pam_xauth.so

設定ファイルは1行ごとに意味を持ち、各行は以下の項目がスペース区切りで記述されています。

  • モジュールインターフェース
  • コントロールフラグ
  • モジュール名
  • モジュール引数

例えば以下の行は、

account sufficient pam_succeed_if.so uid = 0 use_uid quiet

以下のように解釈されます。

モジュールインターフェース account
コントロールフラグ sufficient
モジュール名 pam_succeed_if.so
モジュール引数 uid = 0 use_uid quiet

これは言い換えると、「pam_succeed_if.so モジュールの account インターフェースを使用する」ということを PAM に伝えていることになります。

以下のように、複数のモジュールを組み合わせて使用することもできます。

auth    sufficient  pam_rootok.so
auth    substack    system-auth
auth    include     postlogin

各行は上から下へ読み込まれます。このように積み重ねるように記述するため、同じモジュールインターフェースの行をまとめてスタックと呼ぶこともあります。

モジュールインターフェース

現在使用できるモジュールインターフェースは、authaccountpasswordsession の4つです。

モジュールは全て、またはいくつかのインターフェースを実装しています。

auth

ユーザの認証に使用するインターフェースです。
パスワードや、Kerberosのチケットの有効性を検証します。

account

アカウントが許可されているかどうかを確認するインターフェースです。

password

パスワードを変更するために使用するインターフェースです。

session

ユーザセッションを設定、管理するインターフェースです。

コントロールフラグ

モジュールから返ってくる成功または失敗の結果をもとに、どのように動作するかを指定するフラグです。

複雑な処理を記述することもできますが、ここではシンプルなフラグのみ紹介します。

required

失敗時 ・・・ 次の行へ移る
成功時 ・・・ 次の行へ移る

必須条件を記述します。
結果にかかわらず、スタック内のすべてのモジュールが処理されます。
ただし途中で失敗している場合は最初の失敗が返ります。

sufficient

失敗時 ・・・ 結果を無視して次の行へ移る
成功時 ・・・ 次の行以降を無視して成功を返す

十分条件を記述します。

optional

失敗時 ・・・ 結果を無視して次の行へ移る
成功時 ・・・ 結果を無視して次の行へ移る

ただし、スタック内のすべてのモジュールの結果が無視されている場合のみ、いずれかの optional が成功の場合は成功、すべての optional が失敗の場合は失敗を返します。

モジュール

CentOS 7 の場合、モジュールは /lib/security/ に置いてあります。

[root@a9f1d86a1421 /]# ls /lib64/security/
pam_access.so    pam_faildelay.so  pam_listfile.so    pam_pwhistory.so       pam_succeed_if.so  pam_unix_passwd.so
pam_cap.so       pam_faillock.so   pam_localuser.so   pam_pwquality.so       pam_systemd.so     pam_unix_session.so
pam_chroot.so    pam_filter        pam_loginuid.so    pam_rhosts.so          pam_tally2.so      pam_userdb.so
pam_console.so   pam_filter.so     pam_mail.so        pam_rootok.so          pam_time.so        pam_warn.so
pam_cracklib.so  pam_ftp.so        pam_mkhomedir.so   pam_securetty.so       pam_timestamp.so   pam_wheel.so
pam_debug.so     pam_group.so      pam_motd.so        pam_selinux.so         pam_tty_audit.so   pam_xauth.so
pam_deny.so      pam_issue.so      pam_namespace.so   pam_selinux_permit.so  pam_umask.so
pam_echo.so      pam_keyinit.so    pam_nologin.so     pam_sepermit.so        pam_unix.so
pam_env.so       pam_lastlog.so    pam_permit.so      pam_shells.so          pam_unix_acct.so
pam_exec.so      pam_limits.so     pam_postgresok.so  pam_stress.so          pam_unix_auth.so

各モジュールの説明は The Linux-PAM System Administrators’ Guide で確認できます。

参考リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です