はじめに
Linux上で動作するプログラムの認証を柔軟に管理する仕組みである、PAMについて学んだ時に分かりにくかった箇所を中心に整理した記事となります
個人的にPAMの仕組みの理解が難しかったため、忘れた頃に見返せるように記事にさせていただきました
誰かの助けになれば幸いです
記事の対象者
- PAMの設定をしたことがない
- PAMを設定するイメージを掴みたい
- 他の記事やAIの出力を確認したけど、理解にあともう一押し必要だと感じた
PAMの基本概念
- PAMはユーザやプログラムやサービスに対しての認証を一元管理する仕組みです
- プログラム毎(例:
ssh,su,sudo)に認証のメカニズムをPAMの設定ファイル(/etc/pam.d/)として、設定が可能です - 特定のユーザーやグループに対して異なる認証ルールを適用することも可能です
- 設定方法として、
authselectでプロファイルを作成し、簡略的にPAMやNSS(ネットワークセキュリティーサービス)を変更することが一般的ですが、設定方法は別の記事で投稿しようと思います
PAMの全体像
PAMの基本
PAMはプログラム毎に設定ファイルを作成、変更を行い設定します
最初にPAMの設定ファイルの場所を確認します
PAMの設定ファイル
- PAMの設定ファイルは
/etc/pam.dディレクトリにあります - ファイル名は殆どがプログラム名と同じです
- 例えば、
/etc/pam.d/suはsuコマンドの認証設定ファイルです -
otherファイルは例外で、設定ファイルを持たないプログラムに対して適用されます - PAMの設定ファイルには、PAMモジュールの呼び出し順序と制御フラグを記載します(書式については、後ほど解説します)
- ディストリビューションによっては、
/etc/pam.confもありますが、こちらプログラム毎の管理が難しくなるため、こちらで編集することは非推奨です
次に、PAMのモジュールについて確認します
PAMのモジュール
- PAMのモジュール自体は
/usr/lib64/securityディレクトリにあります - PAMの設定では、モジュールに引数(オプション)を渡して詳細な動作を制御することが可能です
次にログについて確認します
ログ
- ログは
/var/log/secureに保存されます
Dec 13 09:59:36 ip-10-0-138-50 sudo[1558]: ssm-user : TTY=pts/0 ; PWD=/usr/bin ; USER=root ; COMMAND=/bin/su - ec2-user
Dec 13 09:59:36 ip-10-0-138-50 systemd[1561]: pam_unix(systemd-user:session): session opened for user root(uid=0) by root(uid=0)
Dec 13 09:59:36 ip-10-0-138-50 sudo[1558]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1001)
Dec 13 09:59:36 ip-10-0-138-50 su[1575]: pam_unix(su-l:session): session opened for user ec2-user(uid=1000) by (uid=0)
PAM設定方法
PAMの設定ファイルの書式について確認します
PAMの書式
- PAMの設定ファイルは上から順に実行されます
- コントロールの設定により、処理を途中で終了することが出来るなど、柔軟な制御ができます
- PAMの設定ファイルの各行は、以下の4つの要素で構成されます
モジュールタイプ コントロール モジュールのパス [引数]
<記述例>
auth required pam_env.so
auth required pam_faillock.so
auth sufficient pam_unix.so
auth required pam_deny.so # 前行のpam_unix.soが成功した場合、実行しない
モジュールタイプ
モジュールタイプによって、PAMモジュールが異なる動作をします
PAMのモジュールタイプは以下の4つ(auth, account, password, session)のいずれかとなります
auth
- ユーザ認証を行います
- パスワードを利用した認証などで、ユーザを認証します
auth required pam_env.so # ユーザログイン時の環境変数を設定します
auth required pam_faillock.so preauth # 認証前:ユーザがロック中かを確認します
auth sufficient pam_unix.so # パスワード(/etc/shadow)を使用してユーザを認証します
auth [default=die] pam_faillock.so authfail # 認証失敗時:失敗回数を記録します
auth required pam_faillock.so authsucc # 認証成功時:失敗カウントをリセットします
auth required pam_deny.so # フェイルセーフ:ここまで到達した場合は必ず拒否します
account
-
accountでは、authのフェーズで認証したユーザの有効性を確認します - パスワード有効期限切れやプログラムへのアクセスが許可されているか等を評価できます
account sufficient pam_succeed_if.so uid = 0 use_uid quiet # root(uid:0)の場合、次の処理は実行せず、成功。root以外は次の行へ進む
account required pam_unix.so # ユーザが有効状態を確認します(パスワードの有効期限、アカウントロック)
account required pam_faillock.so # ロックされたアカウントでないか、確認します
password
- passwordは、passwordの検証、変更、保存などを行うフェーズです
- 少々分かりにくいですが、新規のパスワード保存や変更のタイミングで実行されるモジュールタイプです
-
/etc/pam.d/suにもpassword記載がありますが、実際には実行されません(慣習的に置いてる可能性があります)
password requisite pam_pwquality.so local_users_only # ローカルユーザのパスワードがpwquality.confの要件(パスワードの複雑性)に満たすか確認する
password sufficient pam_unix.so sha512 shadow nullok use_authtok # 前行で要件に満たした、パスワードを保存する。
session
- ユーザ認証の前後に実行する処理を定義します
- ユーザがログインしたことをログに記録したり、サービスを設定したりできます
- 先頭のマイナス"-"はモジュールが無くても、エラーとならない処理を表しています
session required pam_unix.so # ログインしたことを記録します
session optional pam_motd.so # ログイン後バナーを表示する
-session optional pam_systemd.so # systemdモジュールが呼び出せる場合、呼び出しを行う
コントロール
コントロールでは、認証処理の制御を定義します
表のNo.はモジュールの実行順序を表しています
required
requisite
sufficient
- モジュールの実行が成功した場合、前の行まで
requiredが全て成功であれば、以降の行は実行されず認証(auth)に成功します - 実行に失敗した場合、次の行に進みます
- 例えば、以下の表のNo.2でパスワード認証が失敗した場合、処理が終了します
- また、No.2のパスワード認証が失敗しても、No.3以降の処理を実行します
optional
include
- 他のPAM設定ファイルを読み込んで実行します
- 呼び出し元と同じモジュールタイプのみ実行します
- 通常、
system-auth(システム全体の認証設定)、password-auth(パスワード認証設定)は認証の共通設定のため、呼ばれることが多いです - 例えば、以下の表ではNo.2で
sample2を呼び出しており、No.3で認証を行います
-
include元の設定ファイル(No.4)で認証が失敗した場合、同じフェーズであるNo.5は実行されますが、sessionフェーズは実行しません
substack
-
includeと同じ、PAM設定ファイルを読み込みます -
includeと違う点として、呼び出し先(スタック)で処理が完結します- 例えば、
includeでは呼び出し先にsufficientがあり、成功すれば呼び出し元でも即座にフェーズが完了します - しかし、
substackの場合は呼び出し先のファイル内でsufficientが成功してもPAM設定ファイルでのみsufficientの効果を発揮します - 呼び出し元には結果(成功/失敗)のみが返され、呼び出し元の処理は継続します
- 例えば、
- No.3の処理で
sufficientが成功しておりますが、呼び出し元のsample1は処理を継続します
モジュールパス
モジュールパスには実行するPAMモジュールを指定します
多くのモジュールは引数(オプション)を指定することで動作をカスタマイズできます
ここでは、よく使われる主要なモジュールについて説明します
注意
PAMモジュールの説明は大部分を
に頼って書いています
設定される際は、公式ドキュメント等ダブルチェックでお願いします![]()
pam_echo.so
指定したメッセージを表示するモジュールです(デバッグ・テスト用)
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| 全て | メッセージ表示 | 指定したメッセージを表示 |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| file=/path | 表示するファイルのパス | auth optional pam_echo.so file=/etc/banner |
| (メッセージ) | 直接指定するメッセージ(引数として記述) | auth optional pam_echo.so test |
pam_unix.so
通常のパスワード認証で利用するモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | パスワード認証 | /etc/shadowのハッシュと入力パスワードを比較 |
| account | アカウント有効性チェック | アカウント/パスワードの有効期限、ロック状態を確認 |
| password | パスワード変更 | 新しいパスワードをハッシュ化して/etc/shadowに保存 |
| session | ログイン/ログアウト記録 | /var/log/wtmp、/var/run/utmpにログイン履歴を記録 |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| nullok | 空のパスワードを許可 | auth sufficient pam_unix.so nullok |
| try_first_pass | 前のモジュールで入力したパスワードを先に試す | auth sufficient pam_unix.so try_first_pass |
| use_first_pass | 前のモジュールで入力したパスワードのみ使用(再入力不可) | auth sufficient pam_unix.so use_first_pass |
| sha512 | SHA-512ハッシュアルゴリズムを使用(推奨) | password sufficient pam_unix.so sha512 |
| md5 | MD5ハッシュアルゴリズムを使用(非推奨) | password sufficient pam_unix.so md5 |
| shadow | /etc/shadowを使用 | password sufficient pam_unix.so sha512 shadow |
| remember=N | 過去N回のパスワードを記憶(再利用禁止) | password sufficient pam_unix.so remember=5 |
| use_authtok | 前のモジュールで入力したパスワードを使用(二重入力回避) | password sufficient pam_unix.so use_authtok |
| rounds=N | ハッシュの反復回数(セキュリティ強化) | password sufficient pam_unix.so rounds=65536 |
pam_faillock.so
ログイン失敗回数を制限し、アカウントをロックアウトするモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | ログイン失敗回数の記録・チェック | preauth: ロック状態確認 / authfail: 失敗を記録 / authsucc: カウントリセット |
| account | ロック状態の最終確認 | ログイン失敗回数によるロックアウト状態をチェック |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| preauth | 認証前のチェック(このオプションを付けて最初に呼び出す) | auth required pam_faillock.so preauth |
| authfail | 認証失敗時の処理(失敗を記録) | auth [default=die] pam_faillock.so authfail |
| authsucc | 認証成功時の処理(カウントリセット) | auth required pam_faillock.so authsucc |
| deny=N | N回失敗でロックアウト | auth required pam_faillock.so deny=5 |
| unlock_time=N | N秒後に自動ロック解除(0=手動解除のみ) | auth required pam_faillock.so unlock_time=900 |
| fail_interval=N | N秒以内の失敗をカウント | auth required pam_faillock.so fail_interval=900 |
| even_deny_root | rootもロックアウト対象にする | auth required pam_faillock.so even_deny_root |
| root_unlock_time=N | rootの自動ロック解除時間(秒) | auth required pam_faillock.so root_unlock_time=600 |
| silent | ロック状態をユーザーに通知しない | auth required pam_faillock.so silent |
| audit | 監査ログに記録 | auth required pam_faillock.so audit |
| dir=/path | ロック情報の保存ディレクトリ(デフォルト: /var/run/faillock) | auth required pam_faillock.so dir=/var/log/faillock |
pam_pwquality.so
パスワードの品質(複雑性)をチェックするモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| password | パスワード品質チェック | /etc/security/pwquality.confに基づいて複雑性要件をチェック(文字数、文字種、辞書等) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| retry=N | パスワード入力の再試行回数 | password requisite pam_pwquality.so retry=3 |
| minlen=N | 最小パスワード長 | password requisite pam_pwquality.so minlen=14 |
| dcredit=N | 数字の要件(N>0: ボーナス、N<0: 必須数) | password requisite pam_pwquality.so dcredit=-1 |
| ucredit=N | 大文字の要件 | password requisite pam_pwquality.so ucredit=-1 |
| lcredit=N | 小文字の要件 | password requisite pam_pwquality.so lcredit=-1 |
| ocredit=N | 記号の要件 | password requisite pam_pwquality.so ocredit=-1 |
| minclass=N | 最低N種類の文字種を使用 | password requisite pam_pwquality.so minclass=4 |
| maxrepeat=N | 同じ文字の最大連続回数 | password requisite pam_pwquality.so maxrepeat=3 |
| maxsequence=N | 連続文字列の最大長(abc, 123など) | password requisite pam_pwquality.so maxsequence=3 |
| maxclassrepeat=N | 同じ文字種の最大連続回数 | password requisite pam_pwquality.so maxclassrepeat=4 |
| gecoscheck | GECOSフィールド(名前等)との一致を禁止 | password requisite pam_pwquality.so gecoscheck |
| dictcheck | 辞書チェックを有効化 | password requisite pam_pwquality.so dictcheck=1 |
| usercheck | ユーザー名との一致を禁止 | password requisite pam_pwquality.so usercheck=1 |
| enforce_for_root | rootにも品質チェックを適用 | password requisite pam_pwquality.so enforce_for_root |
| local_users_only | ローカルユーザーのみチェック(LDAP/ADユーザーは除外) | password requisite pam_pwquality.so local_users_only |
pam_pwhistory.so
パスワード履歴を管理し、過去のパスワードの再利用を防ぐモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| password | パスワード履歴チェック | /etc/security/opasswdに記録された過去のパスワードとの重複をチェック |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| remember=N | 過去N回のパスワードを記憶 | password required pam_pwhistory.so remember=5 |
| use_authtok | 前のモジュールで入力したパスワードを使用 | password required pam_pwhistory.so use_authtok |
| retry=N | パスワード入力の再試行回数 | password required pam_pwhistory.so retry=3 |
| enforce_for_root | rootにも履歴チェックを適用 | password required pam_pwhistory.so enforce_for_root |
| file=/path | 履歴ファイルのパス(デフォルト: /etc/security/opasswd) | password required pam_pwhistory.so file=/var/log/opasswd |
pam_limits.so
ユーザーのリソース制限を適用するモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| session | リソース制限適用 | /etc/security/limits.confに基づいてプロセス数、ファイル数、メモリ等のリソース制限を適用 |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| conf=/path | 設定ファイルのパス(デフォルト: /etc/security/limits.conf) | session required pam_limits.so conf=/etc/security/limits.d/custom.conf |
| utmp_early | utmpエントリを早期に作成 | session required pam_limits.so utmp_early |
| noaudit | 監査ログに記録しない | session required pam_limits.so noaudit |
pam_rootok.so
実行ユーザーがrootかどうかをチェックするモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | root特権チェック | 実行ユーザーがroot(UID=0)なら即座に認証成功(パスワード不要) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| debug | デバッグ情報を記録 | auth sufficient pam_rootok.so debug |
pam_wheel.so
wheelグループのメンバーシップをチェックするモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | wheelグループチェック | wheelグループのメンバーかチェック(root権限取得の制限に使用) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| use_uid | 実UID(real UID)を使用 | auth required pam_wheel.so use_uid |
| trust | wheelグループメンバーは無条件で認証成功 | auth sufficient pam_wheel.so trust use_uid |
| deny | wheelグループメンバーを拒否(逆の動作) | auth required pam_wheel.so deny |
| group=name | チェックするグループ名(デフォルト: wheel) | auth required pam_wheel.so group=admin |
pam_securetty.so
rootが安全な端末からログインしているかをチェックするモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | 安全な端末チェック | rootが安全な端末からログインしているかチェック(/etc/securetty参照) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| debug | デバッグ情報を記録 | auth required pam_securetty.so debug |
pam_succeed_if.so
条件に基づいて成功・失敗を判定するモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | 条件付き成功 | 指定条件(UID、サービス名等)が真なら成功 |
| account | 条件付き成功 | 指定条件(UID、グループ、サービス名等)が真なら成功 |
| session | 条件付き成功 | 指定条件(UID、サービス名等)が真なら成功 |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| uid N | UIDの比較(<, >, =, <=, >=, !=) | account sufficient pam_succeed_if.so uid < 1000 |
| gid N | GIDの比較 | account sufficient pam_succeed_if.so gid = 0 |
| user = name | ユーザー名の一致 | account sufficient pam_succeed_if.so user = root |
| user != name | ユーザー名の不一致 | account sufficient pam_succeed_if.so user != guest |
| user ingroup name | グループメンバーシップ | account sufficient pam_succeed_if.so user ingroup wheel |
| service = name | サービス名の一致 | session [success=1 default=ignore] pam_succeed_if.so service in crond |
| service != name | サービス名の不一致 | session sufficient pam_succeed_if.so service != sshd |
| quiet | エラーメッセージを表示しない | account sufficient pam_succeed_if.so uid = 0 quiet |
| use_uid | 実UID(real UID)を使用(デフォルトは実効UID) | account sufficient pam_succeed_if.so uid = 0 use_uid |
pam_nologin.so
システムログインを制限するモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| account | システムログイン制限 | /etc/nologinまたは/run/nologinが存在するとroot以外のログインを拒否 |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| file=/path | nologinファイルのパス | account required pam_nologin.so file=/etc/nologin |
| successok | /etc/nologinが存在しない場合も成功 | account required pam_nologin.so successok |
pam_loginuid.so
監査システム用のログインUIDを設定するモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| session | 監査UID設定 | /proc/self/loginuidに監査システム用のログインUIDを設定(sudo後も元のユーザーを追跡可能) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| require_auditd | auditdが動作していない場合は失敗 | session required pam_loginuid.so require_auditd |
pam_lastlog.so
最終ログイン時刻を表示するモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| session | 最終ログイン表示 | /var/log/lastlogから最終ログイン時刻を読み込んで表示 |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| silent | 最終ログイン情報を表示しない | session optional pam_lastlog.so silent |
| never | lastlogファイルを更新しない | session optional pam_lastlog.so never |
| showfailed | 失敗したログイン試行を表示 | session optional pam_lastlog.so showfailed |
| nowtmp | wtmpファイルを更新しない | session optional pam_lastlog.so nowtmp |
| noupdate | lastlogファイルを更新しない(読み取りのみ) | session optional pam_lastlog.so noupdate |
pam_env.so
環境変数を設定するモジュールです
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | 環境変数設定 | /etc/security/pam_env.confから環境変数を読み込んで設定 |
| session | 環境変数設定 | 同上(sessionで使われることが多い) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| conffile=/path | 設定ファイルのパス(デフォルト: /etc/security/pam_env.conf) | auth required pam_env.so conffile=/etc/security/pam_env.d/custom.conf |
| envfile=/path | 環境変数ファイルのパス | auth required pam_env.so envfile=/etc/environment |
| readenv=0/1 | /etc/environmentを読み込むか(1=読み込む) | auth required pam_env.so readenv=1 |
| user_envfile=file | ユーザーごとの環境変数ファイル | auth required pam_env.so user_envfile=.pam_environment |
| user_readenv=0/1 | ユーザー環境変数ファイルを読み込むか | auth required pam_env.so user_readenv=0 |
pam_deny.so
常に失敗を返すモジュールです(フェイルセーフ用)
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| auth | 必ず拒否 | 常に失敗を返す(フェイルセーフ) |
| account | 必ず拒否 | 常に失敗を返す(フェイルセーフ) |
| password | 必ず拒否 | 常に失敗を返す(フェイルセーフ) |
| session | 必ず拒否 | 常に失敗を返す(フェイルセーフ) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| (なし) | オプションなし | auth required pam_deny.so |
pam_permit.so
常に成功を返すモジュールです(テスト用、本番非推奨)
モジュール別動作
| モジュールタイプ | 動作 | 説明 |
|---|---|---|
| 全て | 必ず許可 | 常に成功を返す(テスト用、本番非推奨) |
引数
| 引数(オプション) | 説明 | 使用例 |
|---|---|---|
| (なし) | オプションなし | auth required pam_permit.so |
詳細はmanコマンドで確認できます
$man pam_echo
実践
CIS BenchMarksを基に、以下の設定を行ってみたいと思います
5.2.7 Ensure access to the su command is restricted (Automated)
こちらはsuコマンドを特定のグループのユーザに制限する設定です
初期設定では、相手ユーザのパスワードが分かれば、どのユーザでも切り替えることが出来てしまいます
また、Auditのコマンドを実行すると制限の設定はありませんでした (CIS BenchMarkの結果はNG設定)
[ec2-user@ip-10-0-138-50 ~]$ grep -Pi '^\h*auth\h+(?:required|requisite)\h+pam_wheel\.so\h+(?:[^#\n\r]+\h+)?((?!\2)(use_uid\b|group=\H+\b))\h+(?:[^#\n\r]+\h+)?((?!\1)(use_uid\b|group=\H+\b))(\h+.*)?$' /etc/pam.d/su
[ec2-user@ip-10-0-138-50 ~]$
検証環境
- AWS
- RHEL9.6
注意
PAMの設定によって、ログインできなくなる可能性があります
検証中は別のセッションでrootログインを維持しておくことを推奨します
設定
実際に設定していきます
最初に検証用のユーザとグループを作成しておきます
# ユーザとパスワードを設定します
userA: p@sswordA
userB: passwordB
[ec2-user@ip-10-0-138-50 ~]$ sudo useradd -s /bin/bash -m userA
passwd userA
[ec2-user@ip-10-0-138-50 ~]$ sudo useradd -s /bin/bash -m userB
passwd userB
# グループを作成します
[ec2-user@ip-10-0-138-50 ~]$ sudo groupadd sugroup
次にuserAからuserBに切り替えが出来てしまうことを確認します
[userA@ip-10-0-138-50 ~]$ su - userB
Password:
[userB@ip-10-0-138-50 ~]$ # userBに切り替えが出来てしまった
次にsuコマンドが実行できるユーザを制限したいと思います
/etc/pam.d/suを以下のように変更します
<変更前>
10 :#auth required pam_wheel.so use_uid
<変更後>
10 :auth required pam_wheel.so use_uid group=sugroup
設定ファイルの変更後にサービスの再起動などは不要です
次にuserAがuserBに切り替えできないことを確認します
[userA@ip-10-0-138-50 ~]$ su - userB
Password:
su: Permission denied
[userA@ip-10-0-138-50 ~]$
/etc/pam.d/suで変更した設定が反映できていることを確認しました!
次はsugroupにuserAを追加して、userBに切り替えられるかを確認します
# userAをsugroupに追加
[ec2-user@ip-10-0-138-50 ~]$ getent group sugroup
sugroup:x:1004:
[ec2-user@ip-10-0-138-50 ~]$ sudo usermod -aG sugroup userA
[ec2-user@ip-10-0-138-50 ~]$ getent group sugroup
sugroup:x:1004:userA
# userAがuserBにスイッチできることを確認
[userA@ip-10-0-138-50 ~]$ su - userB
Password:
Last login: Sat Dec 13 07:54:50 UTC 2025 on pts/0
Last failed login: Sat Dec 13 08:05:36 UTC 2025 on pts/0
There was 1 failed login attempt since the last successful login.
[userB@ip-10-0-138-50 ~]$
# userBからuserAにスイッチできないことを確認
[userB@ip-10-0-138-50 ~]$ su - userA
Password:
su: Permission denied
[userB@ip-10-0-138-50 ~]$
最後にAuditのコマンドを再実行し、表示を確認します
[ec2-user@ip-10-0-138-50 ~]$ grep -Pi '^\h*auth\h+(?:required|requisite)\h+pam_wheel\.so\h+(?:[^#\n\r]+\h+)?((?!\2)(use_uid\b|group=\H+\b))\h+(?:[^#\n\r]+\h+)?((?!\1)(use_uid\b|group=\H+\b))(\h+.*)?$' /etc/pam.d/su
auth required pam_wheel.so use_uid group=sugroup
[ec2-user@ip-10-0-138-50 ~]$
こちらも問題なさそうです!
まとめ
- OSのセキュリティ周りの設計をした際にPAMの設定の理解が浅かったため、今回整理させていただきました
- モジュールタイプとコントロールの動作を理解が個人的に難しかったため、誰かの助けになれば幸いです
- 次はauthselectの設定方法について記事を書こうと思います
参考
- RedHut: PAM 設定ファイルについて
- CIS Benchmarks
- die.net
- An introduction to Pluggable Authentication Modules (PAM) in Linux
仲間を募集しています!
ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です!
ご興味ある方はこちらをご覧ください。




