はじめに
今日のデジタル環境において、強力なパスワードポリシーは機密情報を保護するために不可欠です。しかし、ポリシーが施行されていても、脆弱性が存在する可能性があります。この実験(Lab)では、強力なパスワードクラッキングツールである John the Ripper を使用して、既存のパスワードポリシーの有効性を評価するプロセスを案内します。脆弱性を特定し、より強力なポリシーを推奨する方法、そして全体的なセキュリティを強化するための自動コンプライアンスチェックの実装方法を学びます。この実践的な経験により、パスワードセキュリティの監査と実施に関する実践的なスキルを習得できます。
既存のパスワードポリシーの分析
このステップでは、Linux システム上の既存のパスワードポリシーを分析する方法を理解することから始めます。この実験(Lab)ではシステム全体のポリシーを直接変更しませんが、これらのポリシーがどこで設定されているかを理解することは監査にとって非常に重要です。パスワードの複雑性、有効期間、ロックアウト設定を規定する一般的な設定ファイルを調査することに焦点を当てます。
まず、shadow password suite のグローバル設定が含まれる/etc/login.defsファイルを確認しましょう。このファイルは、パスワードの有効期間、最小パスワード長、最大パスワード有効期間などのパラメータを定義します。
grepコマンドを使用して、/etc/login.defs内のパスワード関連の設定を検索します。
grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE|ENCRYPT_METHOD" /etc/login.defs
値は異なる場合がありますが、以下のような出力が表示されるはずです。
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_WARN_AGE 7
ENCRYPT_METHOD SHA512
次に、パスワードの複雑性ルールを制御する PAM(Pluggable Authentication Modules)設定ファイルである/etc/pam.d/common-passwordを確認します。このファイルには、大文字小文字の混在、数字、特殊文字の必要性などのルールを強制するpam_cracklib.soまたはpam_pwquality.soのようなモジュールが含まれていることがよくあります。
catを使用して/etc/pam.d/common-passwordの内容を表示します。
cat /etc/pam.d/common-password
多くの行が表示されますが、pam_pwquality.soまたはpam_cracklib.soとそのパラメータ(例:minlen、difok、ucredit、lcredit、dcredit、ocredit)を含む行に注意してください。
password [success=1 default=ignore] pam_unix.so obscure sha512 shadow
password requisite pam_pwquality.so retry=3 minlen=8 difok=3 reject_username enforce_for_root
password optional pam_gnome_keyring.so
password optional pam_kwallet.so
password optional pam_systemd.so
最後に、/etc/security/pwquality.confファイルを確認します。これは、pam_pwquality.soが使用される際に、パスワード品質設定に対するより詳細な制御を提供します。
cat /etc/security/pwquality.conf
minlen、dcredit、ucredit、lcredit、ocredit、maxrepeatなどの設定が表示される場合があります。
## Configuration for the pam_pwquality module
#
## The setting of the PAM module is usually in /etc/pam.d/common-password
#
## minlen = 8
## difok = 3
## dcredit = -1
## ucredit = -1
## lcredit = -1
## ocredit = -1
## minclass = 0
## maxrepeat = 0
## maxsequence = 0
## gecoscheck = 0
## dictcheck = 1
## usercheck = 1
## enforce_for_root
これらのファイルを調べることで、システム上の現在のパスワードポリシー設定をよく理解することができます。
John the Ripper を使用したポリシー有効性のテスト
このステップでは、John the Ripper (JtR) を使用してパスワードポリシーの有効性をテストします。パスワードハッシュファイルへのアクセス権があるというシナリオをシミュレートし、弱いパスワードのクラッキングを試みます。
まず、デモンストレーション目的でダミーのパスワードファイルを作成します。passwords.txt という名前のファイルに、いくつかの弱いパスワードを作成します。
echo "user1:password123" > ~/project/passwords.txt
echo "user2:welcome" >> ~/project/passwords.txt
echo "user3:labexrocks" >> ~/project/passwords.txt
次に、これらのプレーンテキストパスワードを John the Ripper が理解できる形式に変換する必要があります。ここでは、ダミーの/etc/passwdと/etc/shadowのようなファイルを結合するためにunshadow(JtR のコンポーネント)を使用します。簡単にするために、ここではpasswords.txtファイルを JtR のstdinモードで直接クラッキングに使用します。
John the Ripper がパスワードのクラッキングに使用するwordlist.txtという簡単な単語リストファイルを作成しましょう。
echo "password123" > ~/project/wordlist.txt
echo "welcome" >> ~/project/wordlist.txt
echo "labexrocks" >> ~/project/wordlist.txt
echo "secret" >> ~/project/wordlist.txt
echo "123456" >> ~/project/wordlist.txt
次に、John the Ripper を使用して、wordlist.txtを使用してpasswords.txtからパスワードをクラックします。
john --format=raw-md5 --wordlist=~/project/wordlist.txt ~/project/passwords.txt
クラックされたパスワードを示す、以下のような出力が表示される場合があります。
Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts (Raw-MD5 [MD5])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (user1)
welcome (user2)
labexrocks (user3)
3g 0:00:00:00 DONE (2023-10-27 08:30) 100.0% 3g/s 100.0p/s 100.0c/s 100.0C/s password123 welcome labexrocks
Session completed.
クラックされたパスワードを表示するには、--showオプションを使用できます。
john --show ~/project/passwords.txt
出力:
user1:password123
user2:welcome
user3:labexrocks
3 password hashes cracked, 0 left
これにより、単純な単語リストを使用して弱いパスワードがどれほど簡単にクラックされるかがわかります。
パスワードポリシーのギャップの特定
このステップでは、前のステップのクラッキング結果に基づいて、シミュレートされたパスワードポリシーのギャップを特定します。John the Ripper がパスワードを容易にクラックできたという事実は、重大な脆弱性を示しています。
クラックされたパスワード(password123、welcome、labexrocks)に基づくと、それらがクラックされた原因となった一般的なギャップは以下の通りです。
- 複雑性要件の欠如: パスワードの
welcomeやlabexrocksは、単純な辞書単語または推測しやすいフレーズです。password123は一般的なパターンです。強力なポリシーは、大文字、小文字、数字、特殊文字の組み合わせを強制すべきです。 - 不十分な長さ:
password123とlabexrocksはそれぞれ 11 文字と 10 文字ですが、単純さゆえに依然として脆弱です。ポリシーは、攻撃者の検索空間を増やすために、通常 12 文字以上の最小長を強制すべきです。 - 辞書単語チェックの欠如: ポリシーは、ユーザーが一般的な辞書単語や単純なバリエーションを選択することを防ぎませんでした。
- 一般的なパターンチェックの欠如:
password123のようなパスワードは、クラッキング単語リストに含まれることが多い予測可能なパターンに従っています。 - パスワード履歴/再利用防止の欠如: ユーザーが古いパスワードを再利用できる場合、かつては強力だったとしても、それらの古いパスワードが漏洩すると脆弱になります。
これらのギャップを特定することをシミュレートするために、より強力なパスワードポリシーがどのようになるかを考えてみましょう。例えば、現在のポリシーがminlen=8を許可し、特定の文字クラス要件がない場合、welcome(7 文字)は失敗しますが、password123(11 文字、特殊文字なし)は合格します。クラッキング結果は、パスワードが基本的な長さ要件を満たしていても、複雑性および辞書チェックが強制されていない場合は依然として弱い可能性があることを強調しています。
pam_pwquality.soモジュールのパラメータ(minlen、dcredit、ucredit、lcredit、ocredit、dictcheckなど)を調整して、そのような弱いパスワードを防ぐ方法を考えてみてください。例えば、dcredit=-1を設定すると少なくとも 1 つの数字が必要になり、ucredit=-1で大文字が必要になります。
このステップは主に概念的なものであり、前のクラッキング実験の結果を分析してポリシーの欠陥を理解することに焦点を当てています。
より強力なパスワードポリシーの推奨
このステップでは、特定されたギャップに基づいて、より強力なパスワードポリシーの推奨事項を策定します。効果的なパスワードポリシーは、セキュリティとユーザビリティのバランスを取ります。
より堅牢なパスワードポリシーのための推奨事項を以下に示します。
- 最小長: パスワードの最小長を少なくとも 12〜14 文字に増やします。パスワードが長いほど、クラッキングは指数関数的に困難になります。
- PAM 設定例:
/etc/security/pwquality.confでminlen=12または/etc/pam.d/common-passwordでpam_pwquality.so minlen=12。
- PAM 設定例:
- 複雑性要件: 文字タイプの組み合わせの使用を強制します。
- 大文字 (A-Z)
- 小文字 (a-z)
- 数字 (0-9)
- 特殊文字 (!@#$%^&*()_+-=[]{}|;':",./<>?)
- PAM 設定例:
/etc/security/pwquality.confでdcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1または/etc/pam.d/common-passwordでpam_pwquality.so dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1。
- 辞書および一般的なパターンチェック: 一般的な辞書単語、一般的な名前、推測しやすいパターン(
password123、qwerty、123456など)の使用を防ぎます。- PAM 設定例:
/etc/security/pwquality.confでdictcheck=1 usercheck=1または/etc/pam.d/common-passwordでpam_pwquality.so dictcheck=1 usercheck=1。
- PAM 設定例:
- パスワード履歴/再利用防止: ユーザーが過去のパスワードを一定数再利用することを防ぎます。これにより、古いパスワードが侵害された場合のリスクが軽減されます。
- PAM 設定例:
/etc/pam.d/common-passwordのpam_unix.soでremember=5を使用します(例:password required pam_unix.so obscure sha512 shadow remember=5)。
- PAM 設定例:
- アカウントロックアウトポリシー: 一定回数ログインに失敗した場合にアカウントをロックアウトするポリシーを実装し、ブルートフォース攻撃を抑止します。
- PAM 設定例:
/etc/pam.d/common-authでpam_tally2.soまたはpam_faillock.soを使用します(例:auth required pam_faillock.so deny=3 unlock_time=600)。
- PAM 設定例:
- 定期的なパスワード変更(注意が必要): 従来推奨されてきましたが、頻繁な強制パスワード変更は、ユーザーがより単純で予測可能なパスワードを選択する原因となる可能性があります。より良いアプローチは、強力な複雑性と長さを強制し、侵害が疑われる場合にのみ変更を要求することです。
概念的な変更を実証するために、ポリシーを更新していると仮定しましょう。実際のシステムファイルを変更するわけではありませんが、pwquality.confファイルをどのように編集できるかを確認できます。
ポリシーの推奨事項をシミュレートするためにダミーファイルを開きます。
nano ~/project/recommended_policy.txt
ファイルに以下の内容を追加します。
## Recommended Password Policy Settings
minlen = 14
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
dictcheck = 1
usercheck = 1
maxrepeat = 3
maxsequence = 3
nanoを保存して終了します(Ctrl+S、Ctrl+X)。
これらの設定は、最小長 14 文字を強制し、少なくとも 1 つの数字、大文字、小文字、特殊文字を要求し、辞書単語とユーザー名の使用を防ぎます。
自動化されたポリシーコンプライアンスチェックの実装
このステップでは、自動化されたポリシーコンプライアンスチェックの実装について学びます。直接的なシステム全体のポリシー強制は PAM やその他の設定ファイルを通じて行われますが、自動化されたチェックは、定義されたポリシーに対してユーザーパスワードやシステム設定を定期的に監査するために使用できます。
この実験では、シェルスクリプトを使用して単純なコンプライアンスチェックをシミュレートします。このスクリプトは、ダミーユーザーのパスワードが基本的な長さの要件を満たしているかどうかを確認します。実際のシナリオでは、このようなスクリプトはより複雑になり、OpenSCAP のようなツールやカスタムスクリプトと統合して、実際のパスワードハッシュ(許可され、倫理的な場合)または設定ファイルを監査する可能性があります。
まず、システム状態をシミュレートするために、ダミーユーザーとダミーパスワードハッシュファイルを作成しましょう。実際のシステムユーザーは作成しません。
echo "testuser:\$6\$salt\$hashedpassword" > ~/project/dummy_shadow.txt
次に、dummy_shadow.txt内のtestuserのパスワード長が特定の値を(例:10 文字)超えているかを確認する、check_password_compliance.shという名前の単純なシェルスクリプトを作成します。
nano ~/project/check_password_compliance.sh
スクリプトに以下の内容を追加します。
#!/bin/bash
## This script simulates a basic password length compliance check.
## In a real scenario, you would parse actual shadow file entries
## or use more sophisticated tools.
MIN_LENGTH=10
PASSWORD_HASH=$(grep "testuser" ~/project/dummy_shadow.txt | cut -d':' -f2)
## For demonstration, we'll just check the length of a placeholder hash.
## In reality, you'd need to crack or analyze the actual hash.
## Here, we're just checking if the hash string itself is long enough,
## which is NOT how real password length checks work, but serves as a
## placeholder for a compliance check.
if [ ${#PASSWORD_HASH} -ge $MIN_LENGTH ]; then
echo "Compliance Check: testuser password hash length meets minimum requirement ($MIN_LENGTH characters)."
exit 0
else
echo "Compliance Check: testuser password hash length DOES NOT meet minimum requirement ($MIN_LENGTH characters)."
exit 1
fi
nanoを保存して終了します(Ctrl+S、Ctrl+X)。
スクリプトに実行権限を付与します。
chmod +x ~/project/check_password_compliance.sh
次に、コンプライアンスチェックスクリプトを実行します。
~/project/check_password_compliance.sh
ダミーハッシュの長さに基づいてコンプライアンスを示す出力が表示されるはずです。
Compliance Check: testuser password hash length meets minimum requirement (10 characters).
この単純な例は、自動化されたコンプライアンスチェックの概念を示しています。本番環境では、このようなスクリプトはcronを使用して定期的に実行するようにスケジュールされ、パスワードポリシーへの継続的な準拠を保証できます。より高度なチェックには、実際のパスワードハッシュの解析(許可され、適切なセキュリティ上の考慮事項がある場合)、辞書リストとの照合、またはセキュリティコンプライアンスフレームワークとの統合が含まれます。
まとめ
この実験では、パスワードポリシーの監査と実施に関する実践的な経験を積みました。/etc/login.defs、/etc/pam.d/common-password、/etc/security/pwquality.conf のような主要なファイルを調査することで、Linux システム上の既存のパスワードポリシー設定を分析する方法を学びました。その後、John the Ripper を使用して、弱いパスワードがどれほど容易にクラックされるかを実証し、堅牢なポリシーの重要性を強調しました。これらの発見に基づき、長さ、複雑性、辞書チェックに焦点を当てた、より強力なパスワードポリシーの推奨事項を策定しました。最後に、パスワードポリシーの遵守を確認する簡単なスクリプトを作成することで、自動化されたコンプライアンスチェックの概念を探りました。この実験は、パスワードセキュリティ監査の基本的な理解を提供し、パスワード関連の脆弱性を特定および軽減するためのスキルを身につけさせます。


