メインコンテンツまでスキップ

クレデンシャル攻撃と対策

このドキュメントの目的

ID/認証システムに対するクレデンシャル攻撃(認証情報を狙った攻撃)の種類と、効果的な対策を学びます。


クレデンシャル攻撃の種類

攻撃手法説明成功率検知難易度
ブルートフォース総当たり攻撃低(対策あれば)容易
辞書攻撃よく使われるパスワードを試行容易
クレデンシャルスタッフィング流出した認証情報を使用困難
パスワードスプレー多数のアカウントに少数のパスワード困難
フィッシング偽サイトで認証情報を詐取対象外
キーロガー入力を記録対象外

ブルートフォース vs パスワードスプレーの違い

【ブルートフォース】               【パスワードスプレー】
1つのアカウントに 多数のアカウントに
多数のパスワードを試行 少数のパスワードを試行

user1 user1 user2 user3 user4 ...
│ │ │ │ │
├─ pass001 ✗ └──────┴──────┴──────┴─── Password1! ✗✗✗✓
├─ pass002 ✗
├─ pass003 ✗ (1時間後)
├─ pass004 ✗ │ │ │ │
├─ ... └──────┴──────┴──────┴─── Summer2024 ✗✓✗✗
└─ pass999 ✓

→ アカウントロックで → 各アカウントの試行は1-2回
すぐ検知される 検知されにくい

ブルートフォース攻撃

攻撃の仕組み

攻撃者: すべてのパスワードの組み合わせを試行

例: 4桁の数字PIN
0000 → 失敗
0001 → 失敗
0002 → 失敗
...
1234 → 成功!

試行回数: 最大10,000回

計算量

パスワード長文字種組み合わせ数解読時間(毎秒1万試行)
4桁数字のみ10,0001秒
6文字小文字のみ約3億8時間
8文字英数字約218兆700年
12文字英数字記号約10^23天文学的時間

対策

1. 試行回数制限(Rate Limiting)

# 設定例
authentication_policy:
rate_limit:
max_attempts_per_minute: 10
max_attempts_per_hour: 100

2. アカウントロックアウト

authentication_policy:
lockout:
max_failed_attempts: 5
lockout_duration_seconds: 900 # 15分
reset_after_success: true

3. プログレッシブディレイ

1回目失敗: 即座にレスポンス
2回目失敗: 1秒待機
3回目失敗: 2秒待機
4回目失敗: 4秒待機
5回目失敗: アカウントロック
// 実装例
int delay = (int) Math.pow(2, failedAttempts - 1) * 1000;
Thread.sleep(Math.min(delay, 30000)); // 最大30秒

辞書攻撃

攻撃の仕組み

攻撃者: よく使われるパスワードのリストを使用

password
123456
qwerty
admin
letmein
welcome
...

流出データから収集された数百万のパスワードリストを使用

よく使われるパスワード(2024年統計)

1. 123456
2. password
3. 12345678
4. qwerty
5. 123456789
6. 12345
7. 1234
8. 111111
9. 1234567
10. dragon

対策

1. 禁止パスワードリスト

// 実装例
Set<String> bannedPasswords = loadBannedPasswordList();

public void validatePassword(String password) {
if (bannedPasswords.contains(password.toLowerCase())) {
throw new WeakPasswordException(
"This password is too common. Please choose a different one."
);
}
}

2. パスワード強度チェック

password_policy:
min_length: 12
require_uppercase: true
require_lowercase: true
require_number: true
require_special: true
banned_passwords_file: /config/banned-passwords.txt
check_leaked_passwords: true # Have I Been Pwned API

クレデンシャルスタッフィング

攻撃の仕組み

前提: 他のサービスから流出した認証情報を入手

流出データ例:
user1@example.com : password123
user2@example.com : qwerty456
user3@example.com : letmein789

攻撃:
1. ターゲットサイトに流出した認証情報でログイン試行
2. 多くのユーザーが同じパスワードを使い回している
3. 一定割合でログイン成功

統計

- 平均的なユーザーは5つのサービスで同じパスワードを使用
- 流出認証情報の約0.1-2%が他のサービスでも有効
- 1億件の流出データ → 10万〜200万アカウント侵害の可能性

対策

1. 流出パスワードチェック(Have I Been Pwned API)

// k-Anonymity を使用した安全なチェック
public boolean isPasswordBreached(String password) {
String sha1 = sha1Hash(password);
String prefix = sha1.substring(0, 5);
String suffix = sha1.substring(5).toUpperCase();

// APIにはハッシュの先頭5文字のみ送信
String response = httpClient.get(
"https://api.pwnedpasswords.com/range/" + prefix
);

// 返されたリストに完全なハッシュがあるかチェック
return response.contains(suffix);
}

2. 異常検知

監視すべき指標:
- 異なるユーザーへの同一IPからのログイン試行
- 短時間での多数のログイン失敗
- 通常と異なる地理的位置からのアクセス
- 通常と異なるUser-Agent

3. 多要素認証(MFA)の強制

authentication_policy:
mfa:
required: true
methods:
- webauthn
- totp
remember_device_days: 30

パスワードスプレー攻撃

攻撃の仕組み

通常のブルートフォース:
1つのアカウント × 多数のパスワード
→ アカウントロックで検知される

パスワードスプレー:
多数のアカウント × 少数のパスワード(1-3個)
→ 各アカウントの試行回数が少ないため検知されにくい

例:
user1 + "Password1!" → 失敗
user2 + "Password1!" → 失敗
user3 + "Password1!" → 成功!
user4 + "Password1!" → 失敗
...

特徴

- 試行間隔を空ける(1時間に1回等)
- IPアドレスを分散
- アカウントロックを回避
- 組織全体を標的

対策

1. グローバルレート制限

# アカウント単位ではなく、IP/組織単位で制限
rate_limit:
per_ip:
max_attempts_per_hour: 20
per_organization:
max_failed_attempts_per_hour: 100
alert_threshold: 50

2. パスワードスプレー検知

// 同一パスワードハッシュでの複数アカウント試行を検知
public void detectPasswordSpray() {
Map<String, Integer> passwordAttempts =
getPasswordHashAttemptsInLastHour();

for (Map.Entry<String, Integer> entry : passwordAttempts.entrySet()) {
if (entry.getValue() > SPRAY_THRESHOLD) {
alertSecurityTeam("Password spray detected: " +
entry.getValue() + " accounts targeted");
}
}
}

3. CAPTCHA/チャレンジ

authentication_policy:
captcha:
enabled: true
trigger_after_failed_attempts: 3
type: recaptcha_v3
min_score: 0.5

防御の多層化

防御レイヤー

Layer 1: ネットワーク
├── WAF(Web Application Firewall)
├── DDoS Protection
└── IP Reputation

Layer 2: アプリケーション
├── レート制限
├── CAPTCHA
├── アカウントロック
└── プログレッシブディレイ

Layer 3: 認証強化
├── パスワードポリシー
├── 多要素認証
├── リスクベース認証
└── パスキー/WebAuthn

Layer 4: 検知・対応
├── 異常検知
├── セキュリティイベント監視
├── アラート
└── インシデント対応

リスクベース認証

リスクスコア計算:
- 新しいデバイス: +30
- 新しいIP: +20
- 異なる国: +40
- 通常と異なる時間: +10
- 過去の不正アクセス履歴: +50

スコアに応じた対応:
0-30: 通常認証
31-60: SMS/Email確認
61-80: MFA必須
81+: アクセス拒否+管理者通知

実装チェックリスト

基本対策

  • パスワードポリシーを設定(12文字以上、複雑性要件)
  • 禁止パスワードリストを導入
  • レート制限を実装
  • アカウントロックアウトを実装
  • HTTPS必須化

高度な対策

  • 流出パスワードチェック(Have I Been Pwned)
  • 多要素認証を導入
  • リスクベース認証を導入
  • 異常検知システムを導入
  • パスキー/WebAuthnをサポート

監視・対応

  • 認証イベントをログ記録
  • 失敗試行のアラートを設定
  • パスワードスプレー検知を導入
  • インシデント対応手順を文書化

参考資料


最終更新: 2025-12-25 対象: セキュリティエンジニア、ID基盤開発者