Linux におけるパスワードポリシーと攻撃の検出

CompTIABeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、堅牢なパスワードポリシーを実装・適用することで、Linux システムのセキュリティを強化するための必須技術を学びます。パスワードの複雑性、最小長、および大文字、小文字、数字などの異なる文字種の組み合わせを強制するシステム全体のルールを設定します。また、パスワードの有効期限ポリシーを設定し、資格情報が定期的に変更されるようにすることで、主要なシステム設定ファイルを変更することにより、侵害されたパスワードに関連するリスクを低減します。

ポリシーの確立を超えて、これらの強力なパスワード要件が新しいユーザーアカウントに適用されることを保証します。その後、実験はプロアクティブなセキュリティ対策からリアクティブな検出へと移行し、システム認証ログを監視する方法を学びます。これらのログを分析することで、繰り返し失敗したログイン試行など、ブルートフォース攻撃やその他の不正アクセス試行の兆候となりうる不審なアクティビティを特定できるようになります。

ローカルLinuxパスワードポリシーの複雑性と有効期限の設定

このステップでは、堅牢なパスワードポリシーを設定することにより、Linuxシステムのセキュリティを強化する方法を学びます。強力なパスワードポリシーは、複雑性有効期限という2つの重要な側面を強制する基本的なセキュリティ制御です。複雑性のルールは、文字種の組み合わせを要求することでパスワードが推測されにくいようにし、有効期限のルールはユーザーに定期的なパスワード変更を強制することで、認証情報の漏洩リスクを低減します。標準的なLinuxユーティリティを使用して、システム全体の構成ファイルを変更し、これらのポリシーを適用します。

まず、パスワードの複雑性について見ていきましょう。最新のDebianベースのシステム(Ubuntuなど)では、パスワードの品質はpam_pwqualityモジュールによって管理されています。その設定は/etc/security/pwquality.confファイルに保存されています。

まず、デフォルト設定を確認しましょう。catコマンドを使用して、設定ファイルの内容を表示します。出力をより見やすくするために、コメント行と空行を除外するためにgrepを使用します。

grep -vE '^#|^$' /etc/security/pwquality.conf

デフォルト設定が表示されるか、あるいはアクティブな設定がないためにファイルが空である可能性があります。次に、より強力なポリシーを適用します。管理者権限でこのファイルを編集する必要があるため、nanoエディタと共にsudoを使用します。

sudo nano /etc/security/pwquality.conf

新しいポリシーを適用するために、以下の行をファイルに追加します。これらの設定は、パスワードが最低10文字であり、少なくとも1つの数字、1つの大文字、1つの小文字を含むことを要求します。

minlen = 10
dcredit = -1
ucredit = -1
lcredit = -1

これらのオプションについて詳しく見ていきましょう。

  • minlen = 10: パスワードの最小許容長を10文字に設定します。
  • dcredit = -1: 少なくとも1つの数字を要求します。負の数は「少なくとも1つ」を意味します。
  • ucredit = -1: 少なくとも1つの大文字を要求します。
  • lcredit = -1: 少なくとも1つの小文字を要求します。

これらの行を追加した後、Ctrl+X、次にY、そしてEnterを押してnanoを保存して終了します。

次に、パスワードの有効期限の設定に進みます。これらの設定は、パスワードの最大および最小有効期間を定義します。新しいユーザーアカウントのデフォルト値は/etc/login.defsに保存されています。

grepを使用して、このファイル内の関連する設定を見つけます。

grep -E 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE' /etc/login.defs

デフォルト値が表示されますが、PASS_MAX_DAYSは非常に大きな値に設定されていることが多く、実質的に有効期限が無効になっています。

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   99999
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   0
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   7

有効期限を9000日に設定するポリシーを適用しましょう。sudo nanoでファイルを開きます。

sudo nano /etc/login.defs

PASS_MAX_DAYSの行を見つけ、その値を99999から9000に変更します。また、ユーザーがパスワードを頻繁に変更しすぎるのを防ぐために、PASS_MIN_DAYS7に設定することもできます。

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   9000
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   7
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   14

ファイルを保存してnanoを終了します。/etc/login.defs内のこれらの設定は、この変更のに作成されたユーザーに適用されます。既存のユーザー(例えば、私たちのlabexユーザー)にポリシーを適用するには、chageコマンドを使用します。

まず、labexユーザーの現在の有効期限情報を確認します。

sudo chage -l labex

出力には、パスワードの有効期限が設定されていないことが示されます。

Last password change                                    : Jul 22, 2023
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

次に、-Mフラグを使用してchageを実行し、labexユーザーの最大日数を9000に設定します。

sudo chage -M 9000 labex

ユーザーの有効期限情報を再度確認して、変更を検証します。

sudo chage -l labex

これで、Password expiresの日付が更新され、最大日数が9000日に設定され、有効期限ポリシーが正常に適用されたことがわかります。

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 7

これで、Linuxシステム上でパスワードの複雑性と有効期限の両方のポリシー設定が完了しました。

新規ユーザーアカウントに強力なパスワードを強制する

このステップでは、前のステップで設定したパスワードの複雑性および有効期限ポリシーが、新規ユーザーアカウントに対して適用されていることを確認します。これをテストする最良の方法は、新しいユーザーを作成し、ルールに違反するパスワードを設定しようと試みることです。これにより、pam_pwqualityモジュールとシステムのデフォルト設定が連携して、アカウント作成直後から新規アカウントを保護する方法が実証されます。

ここでは、Debianベースのシステムでユーザーを作成するための、ユーザーフレンドリーな対話型スクリプトである adduser コマンドを使用します。testuser という名前の新しいユーザーを作成しましょう。

sudo adduser testuser

システムは直ちに新しいユーザーのパスワード設定を求めます。ここで私たちのポリシーがテストされます。

まず、ポリシーに違反する単純で弱いパスワードを設定してみましょう。新しいパスワードを求められたら、password と入力して Enter キーを押します。

Adding user `testuser' ...
Adding new group `testuser' (1001) ...
Adding new user `testuser' (1001) with home directory `/home/testuser' ...
Copying files from `/etc/skel' ...
New password:

password は私たちのルール(短すぎる、大文字や数字が含まれていない)に違反しているため、システムはこれを拒否します。システムが出す理由を見てみましょう。

BAD PASSWORD: The password contains less than 1 digits

システムは拒否し、数字が含まれていないことを指摘しています。これは複数のポリシーに違反していますが、最初に報告されたのはこれです。

システムは再度入力を求めます。次に、長さの要件は満たしているものの、複雑性のルールにはまだ違反しているパスワードを試してみましょう。12345 と入力して Enter キーを押します。

BAD PASSWORD: The password contains less than 1 uppercase letters
New password:

ヒント: 誤ってユーザーを作成してしまった場合は、sudo deluser testuser を使用してユーザーを削除し、再度試すことができます。

システムは再び拒否します。今回は、パスワードに数字が含まれていないためです。大文字も含まれていないため、複雑性の要件を満たしていません。それでは、すべての基準を満たすパスワードを入力しましょう。求められたら、StrongPass2025 と入力して Enter キーを押します。確認のために再入力が求められます。

New password:
Retype new password:
passwd: password updated successfully

成功です!システムは強力なパスワードを受け入れました。次に、ユーザーに関する追加情報が尋ねられます。デフォルトを受け入れるために、各プロンプトで単に Enter キーを押すだけで構いません。

Changing the user information for testuser
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

これでユーザー testuser が作成されました。id コマンドを使用して、ユーザーが存在することを確認できます。

id testuser

これにより、ユーザーID、グループID、およびグループメンバーシップが表示されます。

uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)

次に、/etc/login.defs で設定したパスワード有効期限ポリシーが、この新しいユーザーに自動的に適用されたことを確認します。chage コマンドを使用して、testuser の有効期限情報を表示します。

sudo chage -l testuser

出力には、Maximum number of days between password change(パスワード変更間の最大日数)が、設定したとおり正確に 9000 に設定されていることが示されます。

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 7
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 14

最後に、システムをクリーンに保つために、テストユーザーを削除しましょう。deluser コマンドでユーザーアカウントが削除されます。

sudo deluser testuser

システムがユーザーが削除されたことを確認します。

Removing user `testuser' ...
Warning: group `testuser' has no more members.
Done.

新しいユーザーの作成、パスワードポリシーの強制力のテスト、およびデフォルトの有効期限ルールが適用されたことの確認に成功しました。

ログイン失敗試行のための認証ログを監視する

このステップでは、システム認証ログを監視して、ブルートフォース攻撃などの潜在的なセキュリティ脅威を検出する方法を学びます。システム管理の重要な部分として、疑わしいアクティビティのためにログを定期的にレビューすることがあります。ログイン失敗は、不正アクセスの試みを示す重要な指標です。ログイン失敗をシミュレートし、標準的な Linux コマンドを使用して対応するログエントリを見つけて分析します。

Ubuntu のような Debian ベースのシステムでは、認証イベント(成功および失敗の両方)は通常、/var/log/auth.log ファイルに記録されます。このファイルを読むには管理者権限が必要です。

まず、ログイン失敗を生成しましょう。これは、su(ユーザーの切り替え)コマンドを使用して、自分のユーザーアカウント labex に切り替えようとしますが、意図的に間違ったパスワードを提供することで安全に行うことができます。

su labex

システムはパスワードを求めます。間違ったパスワード(例:wrongpassword)を入力して Enter を押します。

Password:
su: Authentication failure

失敗のパターンを作成するために、もう一度行いましょう。

su labex

再度、間違ったパスワードを入力します。これでいくつかのログデータが生成されたので、認証ログファイルを確認しましょう。sudo と共に tail コマンドを使用して、/var/log/auth.log の最後の数行を表示します。新しいイベントはここに記録されます。

sudo tail /var/log/auth.log

失敗した su の試行に関連するいくつかの新しい行が表示されます。出力はこれに似ており、タイムスタンプ、プロセス(su)、および失敗メッセージが表示されます。

Jul 22 16:45:01 labex-vm su[12345]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:01 labex-vm su[12345]: FAILED SU (to labex) labex on /dev/pts/0
Jul 22 16:45:15 labex-vm su[12346]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:15 labex-vm su[12346]: FAILED SU (to labex) labex on /dev/pts/0

ログを手動で検索するのは時間がかかる場合があります。より効率的な方法は、grep を使用して特定のキーワードでフィルタリングすることです。「authentication failure」という単語を含むすべての行を検索してみましょう。

sudo grep "authentication failure" /var/log/auth.log

このコマンドはパターンに一致する行のみを表示するため、作成したばかりの失敗した試行を簡単に見つけることができます。

次に、この監視プロセスを自動化するための簡単なシェルスクリプトを作成しましょう。このスクリプトはログをチェックして失敗を検出し、概要を報告します。~/project ディレクトリで、nano を使用して log_monitor.sh という名前の新しいファイルを作成します。

nano log_monitor.sh

エディタに次の Bash スクリプトを入力します。このスクリプトは -c フラグ付きの grep を使用して失敗したログイン試行の数をカウントし、ステータスメッセージを表示します。

#!/bin/bash

LOG_FILE="/var/log/auth.log"
FAILURE_COUNT=$(sudo grep -c "authentication failure" $LOG_FILE)

echo "--- Authentication Log Monitor ---"
if [ "$FAILURE_COUNT" -gt 0 ]; then
  echo "WARNING: Found $FAILURE_COUNT failed login attempts."
else
  echo "OK: No failed login attempts found."
fi
echo "--------------------------------"

ファイルを保存し、Ctrl+XYEnter の順に押して nano を終了します。

次に、chmod コマンドを使用して新しいスクリプトを実行可能にします。

chmod +x log_monitor.sh

最後に、監視スクリプトを実行して結果を確認します。

./log_monitor.sh

ログイン失敗を生成したため、スクリプトはそれらを検出し、正確なカウントを示す警告メッセージを表示します。

--- Authentication Log Monitor ---
WARNING: Found 2 failed login attempts.
--------------------------------

これで、ログイン失敗のシミュレーション、検出、および基本的な監視スクリプトの作成方法を学びました。これはシステムセキュリティを維持するための重要なスキルです。

まとめ

この実験では、堅牢なローカルパスワードポリシーを設定することにより、Linux システムのセキュリティを強化する方法を学びました。/etc/security/pwquality.conf ファイルを変更して、pam_pwquality モジュールを使用してパスワードの複雑性ルールを強制しました。これには、推測されやすい認証情報から保護するために、最小パスワード長を設定し、少なくとも 1 つの数字、1 つの大文字、1 つの小文字を含めることを要求することが含まれていました。

さらに、新しいユーザーアカウントを作成する際に、これらの強力なパスワードポリシーが適用されることを確認する方法を探りました。この実験では、繰り返し発生するログイン失敗などのセキュリティイベントを検出および分析するために、システム認証ログを監視するという重要なスキルについても学びました。これは潜在的な攻撃を示している可能性があります。