「パスワードを8文字以上にしてください」――社内でそう伝えても、実際にLinuxサーバー側で強制できていますか? ルールはあるのに仕組みで担保されていない。そんなサーバーは意外と多いものです。
Linuxにはパスワードの複雑さや有効期限、ログイン失敗時のアカウントロックを一元的に制御できるPAM(Pluggable Authentication Modules)という仕組みが標準で備わっています。設定ファイルを数行書き換えるだけで、ブルートフォース攻撃やパスワード使い回しへの耐性を大きく引き上げられます。
この記事では、PAMの基本的な仕組みから、パスワードポリシーの設定方法、アカウントロックの導入手順、設定後の確認方法まで、現場ですぐ使えるレベルで解説します。

PAM(Pluggable Authentication Modules)とは?なぜ重要なのか
PAM(Pluggable Authentication Modules)とは、Linuxの認証処理を「モジュール」として部品化し、差し替え可能にした仕組みです。ログイン、sudo、SSH接続、suコマンドなど、ユーザー認証が必要なあらゆる場面でPAMが動いています。
PAMが重要な理由は、認証に関するセキュリティポリシーをアプリケーションごとではなくOS全体で統一的に管理できる点にあります。
・パスワードの複雑さ: 最低文字数、大文字・小文字・数字・記号の組み合わせルールを強制できます
・アカウントロック: ログイン失敗が一定回数を超えたら自動的にアカウントをロックし、ブルートフォース攻撃を遮断します
・パスワード履歴: 過去に使ったパスワードの再利用を禁止できます
・認証の一元管理: SSH・sudo・コンソールログインなど、すべての認証経路に同じポリシーを適用できます
PAMを適切に設定していないサーバーでは、「password」や「123456」といった弱いパスワードがそのまま通ってしまいます。ルールを周知するだけでなく、仕組みで強制することがセキュリティの基本です。
PAMの仕組みを理解する
PAMの設定を変更する前に、仕組みの全体像を押さえておきましょう。
1. PAMの4つのモジュールタイプ
PAMのモジュールは、認証処理の段階に応じて4つのタイプに分類されます。
| タイプ | 役割 | 具体例 |
|---|---|---|
| auth | ユーザーの本人確認(パスワード検証など) | パスワード照合、ワンタイムパスワード |
| account | アカウントの有効性チェック | 有効期限切れ、ログイン時間帯の制限 |
| password | パスワードの変更処理 | 複雑さチェック、履歴チェック |
| session | セッション開始・終了時の処理 | ログ記録、ホームディレクトリ作成 |
2. PAM設定ファイルの場所
PAMの設定ファイルは /etc/pam.d/ ディレクトリに格納されています。各サービスごとに個別の設定ファイルが用意されています。
# PAM設定ファイルの一覧を確認 ls /etc/pam.d/ # 主な設定ファイル # /etc/pam.d/system-auth … システム全体の認証設定(RHEL系) # /etc/pam.d/common-auth … システム全体の認証設定(Debian/Ubuntu系) # /etc/pam.d/password-auth … パスワード認証の設定(RHEL系) # /etc/pam.d/sshd … SSH接続時の認証設定 # /etc/pam.d/login … コンソールログインの認証設定
3. 制御フラグの読み方
PAMの設定行は「タイプ」「制御フラグ」「モジュール」「引数」の4要素で構成されます。制御フラグはモジュールの成否がどう処理されるかを決定します。
・required: このモジュールが失敗すると最終的に認証失敗になりますが、残りのモジュールも処理されます
・requisite: 失敗した時点で即座に認証失敗を返します
・sufficient: 成功すれば、それ以降の同タイプのモジュールをスキップして認証成功になります
・optional: 他にrequiredやsufficientのモジュールがない場合にのみ結果が考慮されます

パスワードポリシーの設定手順
ここからは具体的な設定手順に入ります。パスワードの複雑さと履歴管理をPAMで強制する方法です。
1. pam_pwqualityモジュールの導入と設定
RHEL/AlmaLinux/Rocky Linux系では pam_pwquality が標準でインストールされています。Ubuntu/Debian系ではパッケージのインストールが必要です。
# Ubuntu/Debian系: pam_pwqualityのインストール sudo apt install libpam-pwquality # RHEL/AlmaLinux系: 標準搭載(確認コマンド) rpm -q libpwquality
pam_pwqualityの設定は /etc/security/pwquality.conf で行います。
# /etc/security/pwquality.conf の設定例 # 最低文字数を12文字に設定(デフォルト: 8) minlen = 12 # 大文字を1文字以上含む(デフォルト: 0 = 制限なし) ucredit = -1 # 小文字を1文字以上含む(デフォルト: 0 = 制限なし) lcredit = -1 # 数字を1文字以上含む(デフォルト: 0 = 制限なし) dcredit = -1 # 記号を1文字以上含む(デフォルト: 0 = 制限なし) ocredit = -1 # ユーザー名をパスワードに含めることを禁止 usercheck = 1 # 辞書にある単語をパスワードに使うことを禁止 dictcheck = 1 # 旧パスワードと異なる文字数の最低数(デフォルト: 5) difok = 5
設定値の読み方: ucredit、lcredit、dcredit、ocreditの値は「マイナス値」で「最低○文字以上必須」を意味します。-1なら「1文字以上必須」、-2なら「2文字以上必須」です。
2. PAM設定ファイルへの反映
pwquality.confの設定をPAMに反映するには、PAMの設定ファイルにpam_pwqualityモジュールが組み込まれていることを確認します。
# RHEL/AlmaLinux系: /etc/pam.d/system-auth を確認 # 以下の行が含まれていることを確認(通常はデフォルトで存在) # password requisite pam_pwquality.so try_first_pass local_users_only retry=3 # Ubuntu/Debian系: /etc/pam.d/common-password を確認 # 以下の行が含まれていることを確認 # password requisite pam_pwquality.so retry=3
3. パスワード履歴の管理(再利用禁止)
pam_pwhistoryモジュールを使うと、過去に使ったパスワードの再利用を禁止できます。
# RHEL/AlmaLinux系: /etc/pam.d/system-auth に追記 # pam_pwquality.soの行の直後に追加する password required pam_pwhistory.so remember=12 use_authtok # Ubuntu/Debian系: /etc/pam.d/common-password に追記 password required pam_pwhistory.so remember=12 use_authtok # remember=12 … 過去12回分のパスワードを記憶し、再利用を禁止 # use_authtok … 前のモジュール(pam_pwquality)で入力されたパスワードを使う
アカウントロックの設定手順
ブルートフォース攻撃に対する最も効果的な防御策の一つが、ログイン失敗回数によるアカウントロックです。
1. pam_faillock モジュールの設定
RHEL 8以降では、従来のpam_tallyに代わってpam_faillockが標準のアカウントロックモジュールとして採用されています。
# /etc/security/faillock.conf の設定例 # 5回ログインに失敗したらアカウントをロック(デフォルト: 3) deny = 5 # ロック解除までの時間(秒)。600 = 10分(デフォルト: 600) unlock_time = 600 # 失敗カウントがリセットされるまでの時間(秒)。900 = 15分 fail_interval = 900 # rootアカウントもロック対象にする(推奨) even_deny_root # rootのロック解除時間(一般ユーザーより長くする) root_unlock_time = 1200
2. PAMへの組み込み(RHEL/AlmaLinux系)
RHEL 8以降では、authselectコマンドを使ってPAM設定を安全に変更できます。
# authselectで現在のプロファイルを確認 sudo authselect current # faillockを有効化(既存のプロファイルに追加) sudo authselect enable-feature with-faillock # 変更内容を確認 sudo authselect current
3. PAMへの組み込み(Ubuntu/Debian系)
Ubuntu/Debian系ではauthselectがないため、PAM設定ファイルを直接編集します。
# /etc/pam.d/common-auth の先頭付近に以下を追加 # pam_unix.soの行よりも前に配置すること auth required pam_faillock.so preauth auth required pam_faillock.so authfail # /etc/pam.d/common-account に以下を追加 account required pam_faillock.so
4. ロック状態の確認と手動解除
アカウントがロックされたかどうかの確認と、管理者による手動解除の方法です。
# 特定ユーザーのログイン失敗状況を確認 sudo faillock --user username # 特定ユーザーのロックを手動で解除 sudo faillock --user username --reset # 全ユーザーのロック状態を一覧表示 sudo faillock
中小企業でも今日からできること
PAMの設定は難しそうに感じるかもしれませんが、以下の3ステップなら30分程度で完了します。
・ステップ1 — パスワード最低文字数を12文字に: /etc/security/pwquality.conf に minlen = 12 を追記するだけで、弱いパスワードの設定を防止できます。これだけでブルートフォース攻撃に対する耐性が大幅に上がります
・ステップ2 — アカウントロックを有効化: /etc/security/faillock.conf に deny = 5 と unlock_time = 600 を設定すれば、5回失敗で10分間ロックされます。自動化された攻撃ツールに対して非常に効果的です
・ステップ3 — パスワード履歴を12世代分保持: pam_pwhistoryモジュールで remember=12 を設定すれば、過去12回分のパスワードの再利用を防止できます
設定変更後は、必ずテスト用のユーザーアカウントで動作確認を行ってください。本番のrootアカウントやSSH接続を遮断してしまうと復旧が困難です。
よくある誤解と注意点
【誤解】「パスワードポリシーを厳しくすれば安全」
あまりに厳しいポリシー(20文字以上、記号3文字以上など)を設定すると、ユーザーがパスワードをメモ帳に書いたり、パターン化した使い回しをしたりと、かえってセキュリティが低下します。NIST SP 800-63Bでも、過度な複雑さ要件は推奨されていません。12文字以上の長さを確保したうえで、多要素認証との組み合わせが現実的です。
【誤解】「rootアカウントはロックしなくてよい」
「rootをロックすると管理できなくなる」という不安から、rootをロック対象から外すケースがありますが、rootこそ最も狙われるアカウントです。even_deny_rootを有効にしつつ、コンソールアクセスやシングルユーザーモードでの復旧手段を確保しておくのが正しいアプローチです。
【注意】PAM設定の変更は慎重に
PAMの設定を誤ると、すべてのユーザーがログインできなくなる可能性があります。設定変更時は以下を必ず守ってください。
・変更前にバックアップ: cp -p /etc/pam.d/system-auth /etc/pam.d/system-auth.bak でバックアップを取得してから編集します
・別のSSHセッションを開いたまま作業: 設定変更後、新しいセッションでログインを試みます。既存のセッションは閉じないでください
・コンソールアクセスを確保: 物理コンソールやクラウドのシリアルコンソールへのアクセス手段を事前に確認しておきます
Linuxの基本的なファイル権限管理やsudoの設定については、姉妹サイトLinuxMaster.JPで詳しく解説しています。

本記事のまとめ
PAMはLinuxの認証基盤を支える仕組みであり、適切に設定するだけでサーバーのセキュリティレベルを大きく引き上げられます。
| 対策 | 設定ファイル | 難易度 |
|---|---|---|
| パスワード最低12文字+複雑さ要件 | /etc/security/pwquality.conf | 低(設定ファイル編集のみ) |
| パスワード履歴12世代の再利用禁止 | /etc/pam.d/system-auth(またはcommon-password) | 低(1行追記) |
| 5回失敗でアカウントロック | /etc/security/faillock.conf | 低(設定ファイル編集のみ) |
| rootアカウントもロック対象にする | /etc/security/faillock.conf | 低(1行追記) |
| ロック状態の確認と手動解除 | faillockコマンド | 低(コマンド実行のみ) |
あなたのサーバー、「password」でログインできませんか?
パスワードポリシーは「ルールを決めた」だけでは機能しません。PAMで仕組みとして強制することで、初めてサーバーの防御力が上がります。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。


コメント