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
各行は上から下へ読み込まれます。このように積み重ねるように記述するため、同じモジュールインターフェースの行をまとめてスタックと呼ぶこともあります。
モジュールインターフェース
現在使用できるモジュールインターフェースは、auth
、account
、password
、session
の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 で確認できます。