2026年10月15日
2026年10月15日
Linuxのパスワードポリシーを強化する方法(pwquality・faillock・有効期限)
Linux のパスワードポリシーは、PAM の pam_pwquality で強度を、pam_faillock で連続失敗時のロックを、chage と /etc/login.defs で有効期限を設定する、という3つの仕組みで組み立てます。この記事では、Ubuntu/Debian 系と RHEL 系(Rocky Linux、AlmaLinux など)それぞれでの設定場所と、締め出し事故を避けるための確認手順を説明します。WordPress を動かすサーバーでも、SSH やコンソールのログインに使うアカウントのパスワードが弱いと、そこが入り口になります。
先に考えたい「何を強制するか」
設定を始める前に、方針を決めておきます。以前は「大文字・小文字・数字・記号をそれぞれ含める」「90日ごとに変更させる」といった規則が定番でしたが、米国 NIST のデジタル認証ガイドライン(SP 800-63B)では、文字種の組み合わせを強制するより長さを確保すること、漏えいの兆候がないのに定期変更を強制しないこと、既知の漏えいパスワードや辞書語を拒否することが推奨されています。このガイドラインは2025年に改訂版が公開されており、具体的な最小文字数などは原文で確認してください。
実務では次の考え方が扱いやすいと思います。
- 長さを主な条件にする(目安として12〜15文字以上)
- 辞書語やユーザー名を含むものを拒否する
- 連続失敗にはロックで対処する
- 社内規程や監査の要件で定期変更が求められる場合だけ有効期限を設ける
もうひとつ大事なのは、パスワード自体を使う場面を減らすことです。SSH は公開鍵認証にしてパスワードログインを止め、パスワードは sudo とコンソールでだけ使う構成にすると、ポリシーの効き目もはっきりします。
作業前の準備
PAM の設定を間違えると、誰もログインできなくなることがあります。作業中は root(または sudo できるユーザー)のセッションを1つ開いたままにし、変更は別のセッションで試してください。VPS なら管理画面のコンソール機能に入れることも事前に確認しておきます。対象のファイルはバックアップしてから編集します。
sudo cp -a /etc/security/pwquality.conf /etc/security/pwquality.conf.bak
sudo cp -a /etc/login.defs /etc/login.defs.bak
pam_pwqualityでパスワードの強度を決める
pam_pwquality は、passwd で新しいパスワードを設定するときに強度を確認するモジュールです。設定は /etc/security/pwquality.conf、または /etc/security/pwquality.conf.d/ 配下の追加ファイルに書きます。
Ubuntu/Debian ではパッケージを入れると PAM 側の設定(/etc/pam.d/common-password)も自動で更新されます。
sudo apt install libpam-pwquality
grep pwquality /etc/pam.d/common-password
RHEL 系では標準で有効になっていることが多く、PAM のファイルは authselect が管理しています。/etc/pam.d/system-auth などを直接書き換えると、authselect の実行時に上書きされるため、強度の設定は pwquality.conf 側で行います。
設定例です。
# /etc/security/pwquality.conf.d/50-local.conf
minlen = 14
minclass = 2
maxrepeat = 3
dictcheck = 1
usercheck = 1
difok = 5
retry = 3
enforce_for_root
各項目の意味は次のとおりです。
minlen: 最小の長さ。dcreditなどのクレジット設定が正の値だと、文字種によって実質の必要文字数が減る仕組みがあるため、長さを素直に効かせたいならクレジットは既定のまま(0)にしておきますminclass: 含めるべき文字種(大文字・小文字・数字・その他)の数。厳しくしすぎると「Password1!」のような予測しやすい形に寄りがちなので、2 程度にとどめていますmaxrepeat: 同じ文字の連続回数の上限dictcheck/usercheck: 辞書語とユーザー名を含むパスワードを拒否difok: 古いパスワードと何文字以上違う必要があるかenforce_for_root: root がパスワードを設定するときにも規則を適用(指定しないと root は警告だけで通過できます)
設定したら、一般ユーザーで passwd を実行し、短いパスワードや辞書語が拒否されるか試します。パスワードを実際に変えずに強度だけを見たいなら、libpwquality に含まれる pwscore コマンドも使えます(ディストリビューションによっては別パッケージです)。
pam_faillockで連続失敗をロックする
総当たりへの対策として、一定回数失敗したアカウントを一時的にロックします。以前使われていた pam_tally2 は廃止されており、現在は pam_faillock が使われます。設定は /etc/security/faillock.conf に書きます。
# /etc/security/faillock.conf
deny = 5
fail_interval = 900
unlock_time = 600
この例では、15分(900秒)以内に5回失敗するとロックし、10分(600秒)後に自動で解除します。unlock_time = 0 にすると管理者が解除するまでロックされたままになりますが、攻撃者がわざと失敗を繰り返して正規ユーザーを締め出す(サービス妨害)こともできてしまうため、一定時間で解除する設定の方が運用しやすいでしょう。even_deny_root を付けると root もロックの対象になりますが、root で入れなくなる危険があるため、付けるなら root_unlock_time もあわせて設定します。
RHEL 系では authselect の機能として有効にします。
sudo authselect current
sudo authselect enable-feature with-faillock
sudo authselect apply-changes
Ubuntu/Debian では、/etc/pam.d/common-auth と common-account に pam_faillock.so の行を正しい順番で追加する必要があります。順番を誤るとロックが効かない、あるいは誰もログインできない状態になるため、お使いのバージョンの man pam_faillock に載っている設定例を見ながら作業し、編集後は別セッションでログインを試してください。
ロック状態の確認と解除は次のコマンドで行います。
sudo faillock --user taro
sudo faillock --user taro --reset
SSH を公開鍵認証のみにしている場合、SSH 経由の総当たりはそもそもパスワードの判定まで届きません。インターネット側からの試行は Fail2ban などで IP 単位に止め、pam_faillock はアカウント単位の保険と考えると役割が分かりやすくなります。
有効期限と履歴を設定する
定期変更が要件として求められる場合は、/etc/login.defs に既定値を書きます。
PASS_MAX_DAYS 365
PASS_MIN_DAYS 1
PASS_WARN_AGE 14
ここで間違えやすいのは、login.defs の値は新しく作るユーザーにだけ使われる点です。既存ユーザーには chage で個別に設定します。
sudo chage -l taro
sudo chage -M 365 -m 1 -W 14 taro
PASS_MIN_DAYS を設けるのは、変更直後に何度も変えて元のパスワードに戻す抜け道をふさぐためです。過去のパスワードの再利用を禁止したい場合は pam_pwhistory を使います。RHEL 系では authselect の機能として用意されている場合があるため、authselect list-features で確認してから有効にしてください。
パスワードのハッシュ方式も見ておきます。/etc/login.defs の ENCRYPT_METHOD が古い方式になっていないか確認し、近年のディストリビューションの既定(yescrypt や SHA-512)から変えないのが無難です。
設定後の確認
最後に、次の点を一通り試してから作業を終えます。
- 一般ユーザーで
passwdを実行し、短いパスワードや辞書語が拒否される - 別セッションでわざとパスワードを間違え、指定回数でロックされ、
faillock --resetで解除できる - 正しいパスワードで sudo とコンソールログインができる
chage -lで既存ユーザーの有効期限が意図どおりになっている
ポリシーの変更は既存のパスワードには遡って適用されません。強度が足りないパスワードを使い続けているアカウントがあれば、chage -d 0 ユーザー名 で次回ログイン時の変更を求めます。なお、ディストリビューションやバージョンによってモジュールの既定値や設定ファイルの場所が異なることがあるため、作業前に手元の環境の man ページを確認してください(2026年10月現在の主要ディストリビューションを前提に書いています)。
まとめ
- 強度は
pam_pwquality、ロックはpam_faillock、有効期限はlogin.defsとchageで設定する - 文字種の組み合わせより長さと辞書チェックを重視し、定期変更は要件がある場合に限る
- RHEL 系の PAM ファイルは
authselect経由で変更し、直接編集しない login.defsの有効期限は新規ユーザーだけに効くため、既存ユーザーはchageで設定する- 作業中は root のセッションを残し、別セッションでログインとロック解除を試してから終える