なぜLinux PAMを深く理解する必要があるのか?
私のサーバーも、かつてSSHへのブルートフォース攻撃を絶え間なく受けたことがあります。その結果、トラブル対応で徹夜する羽目になりました。それ以来、プロジェクトを立ち上げる際には必ずPAMの設定を優先するようにしています。OSをインストールしたまま放置していれば、ボットネットは一般的な辞書攻撃を用いて、わずか数分で脆弱なパスワードを見つけ出してしまうでしょう。
PAM (Pluggable Authentication Modules) は、柔軟な「門番」のような存在です。アプリケーションのコードに手を加えることなく、認証ルールを変更することができます。ユーザーが自発的に複雑なパスワードを設定してくれるのを期待するのではなく、システム側で脆弱なパスワードを拒否するように強制するのです。同時に、アカウントの自動ロック機能とMFA(多要素認証)を組み合わせることで、強固な防御層を構築できます。
システムのテストには、複雑なサンプルパスワードが必要になります。私はよく ToolCraftのPassword Generator を利用しています。このツールは完全にクライアント側(ブラウザ)で動作するため、パスワードがサーバーに送信されることがなく、エンジニアにとって絶対的な安全性が保証されています。
1. pam_pwqualityによるパスワード強度の強制
デフォルトのLinuxは、ユーザーのパスワード設定に対してかなり「寛容」です。これを厳格化するには、pam_pwquality モジュールが必要です。これにより、passwd コマンドを入力した瞬間に複雑さがチェックされるようになります。
ライブラリのインストール
UbuntuまたはDebianの場合は、以下のコマンドを実行します。
sudo apt update && sudo apt install libpam-pwquality -y
詳細設定
主な設定は /etc/security/pwquality.conf にありますが、システム全体に適用するには、以下のファイルを開きます。
sudo nano /etc/pam.d/common-password
pam_pwquality.so の行を探し、以下の厳格な設定に置き換えます。
password requisite pam_pwquality.so retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
私がよく適用する各パラメータの意味は以下の通りです:
- retry=3: 3回入力に失敗すると、パスワード変更セッションが拒否されます。
- minlen=12: パスワードは最低12文字以上である必要があります。
- difok=3: 旧パスワードと少なくとも3文字は異なる必要があります。
- ucredit, lcredit, dcredit, ocredit=-1: 大文字、小文字、数字、特殊文字をすべて含めることを必須にします。
- enforce_for_root: 油断を防ぐため、rootアカウントにも適用します。
2. pam_faillockによるブルートフォース攻撃の阻止
強力なパスワードを設定した後のステップは、自動化されたパスワード試行攻撃を阻止することです。pam_faillock は、旧式となった pam_tally2 に代わる現代的なソリューションです。
認証設定ファイルを開きます:
sudo nano /etc/pam.d/common-auth
auth設定の冒頭に以下の行を挿入します:
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
そして、/etc/pam.d/common-account(ディストリビューションによっては common-auth の末尾)に以下の行を追加します:
account required pam_faillock.so
この設定は非常に効果的です。5回入力を間違えると(deny=5)、アカウントは即座に15分間ロックされます。ボットによるパスワード試行の速度が大幅に低下し、攻撃を断念させることにつながります。
ロックされたアカウントのリストは、以下のコマンドで確認できます:
sudo faillock --user <ユーザー名>
同僚が誤って自分自身をロックしてしまった場合は、リセットコマンドで救出できます:
sudo faillock --user <ユーザー名> --reset
3. SSHへのMFA(多要素認証)層の追加
パスワードがいかに強力であっても、フィッシングやキーロガーによって漏洩するリスクは常にあります。2要素認証(MFA)の追加は、最終防衛ラインとなります。Google Authenticatorは、最も手軽な選択肢です。
モジュールのインストールは非常に簡単です:
sudo apt install libpam-google-authenticator -y
各ユーザーは google-authenticator コマンドを実行してQRコードをスキャンする必要があります。その後、PAMで有効化します。/etc/pam.d/sshd を開き、末尾に以下の行を追加します:
auth required pam_google_authenticator.so
/etc/ssh/sshd_config ファイルの修正も忘れないでください。SSHがOTPコードの入力を要求するように、KbdInteractiveAuthentication を yes に変更する必要があります。
4. 監視とサポートツール
非常に重要な注意点:PAMを編集した直後に、現在のSSHセッションを絶対に閉じないでください。新しいタブを開いてログインを試してください。もし設定に誤りがあっても、古いセッションが残っていれば修正が可能であり、サーバーから締め出されるのを防ぐことができます。
ログを定期的に監視することは、システム管理者の良い習慣です:
sudo tail -f /var/log/auth.log
攻撃元のIPレンジをブロックするためにファイアウォールを設定する際、私はよく ToolCrafts Subnet Calculator を使用します。これによりCIDRの計算が非常に速くなり、複雑なセキュリティルールでのサブネット分割ミスを防げます。
また、PAM設定ファイルが不正に改ざんされていないかを確認するために、チェックサムを作成しておくべきです。Hash Generator ツールを使えば、/etc/pam.d/ 内のファイルのハッシュ値(SHA-256)を生成し、定期的に照合することができます。
おわりに
PAMの設定は、わずかなミスでシステムが孤立する可能性があるため、細心の注意が必要です。しかし、一度マスターしてしまえば、あなたのサーバーは真の要塞へと変わります。強力なパスワード、自動ロック機構、そしてMFAを組み合わせて、毎晩安心して眠れる環境を整えましょう。

