システムセキュリティ設定
idp-serverのシステムレベルセキュリティ設定について説明します。
システム設定とは
システム設定(System Configuration) とは、テナント横断で適用されるアプリケーションレベルのセキュリティ設定です。
┌─────────────────────────────────────────────────────────────┐
│ System Configuration │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ SSRF Protection │ │ Trusted Proxies │ │
│ └──────────┬──────────┘ └──────────┬──────────┘ │
└─────────────┼──────────────────────────┼────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Application │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ HttpRequestExecutor │ │ Request Handler │ │
│ └──────────┬──────────┘ └──────────┬──────────┘ │
└─────────────┼──────────────────────────┼────────────────────┘
│ │
▼ ▼
外部API呼び出し X-Forwarded-For
(検証後) (クライアントIP取得)
目的
- SSRF保護: サーバーサイドリクエストフォージェリ攻撃の防止
- プロキシ信頼設定: ロードバランサー/リバースプロキシ経由のクライアント情報の正確な取得
- 運用柔軟性: 環境に応じた動的な設定変更
テナント設定との違い
| 設定タイプ | 適用範囲 | 例 |
|---|---|---|
| テナント設定 | 特定テナントのみ | 認証ポリシー、クライアント設定 |
| システム設定 | 全テナント共通 | SSRF保護、信頼するプロキシ |
SSRF保護
SSRFとは
SSRF(Server-Side Request Forgery) は、攻撃者がサーバーを踏み台にして内部ネットワークやクラウドメタデータにアクセスする攻撃です。
【攻撃シナリオ - SSRF保護なし】
攻撃者 ──悪意のあるURL──▶ idp-server ──リクエスト──▶ 内部サービス
169.254.169.254
(クラウドメタデータ)
【SSRF保護あり】
攻撃者 ──悪意のあるURL──▶ idp-server ──× ブロック
│
▼
❌ 拒否
なぜIdPでSSRF保護が必要か
idp-serverは以下のシナリオで外部HTTPリクエストを実行します:
| 機能 | 外部リクエスト先 | リスク |
|---|---|---|
| フェデレーション | 外部IdPのuserinfo endpoint | URLがテナント設定から取得 |
| CIBA通知 | クライアント通知エンドポイント | URLがクライアント設定から取得 |
| Webhookフック | 外部Webhookエンドポイント | URLがフック設定から取得 |
| 身元確認連携 | 外部身元確認サ ービス | URLが設定から取得 |
これらのURLは管理者が設定しますが、設定ミスや悪意ある設定により内部ネットワークへのアクセスが発生する可能性があります。
ブロック対象
SSRF保護が有効な場合、以下のIPレンジへのリクエストがブロックされます:
| IPレンジ | 説明 | 攻撃リスク |
|---|---|---|
10.0.0.0/8 | クラスAプライベート | 内部サービスアクセス |
172.16.0.0/12 | クラスBプライベート | 内部サービスアクセス |
192.168.0.0/16 | クラスCプライベート | 内部サービスアクセス |
127.0.0.0/8 | ループバック | ローカルサービスアクセス |
169.254.0.0/16 | リンクローカル / クラウドメタデータ | AWS/GCP/Azureメタデータ取得 |
::1/128 | IPv6ループバック | ローカルサービスアクセス |
fc00::/7 | IPv6プライベート | 内部サービスアクセス |
設定オプション
{
"ssrf_protection": {
"enabled": true,
"bypass_hosts": ["localhost", "127.0.0.1", "mock-service"],
"allowed_hosts": ["api.example.com", "identity-provider.example.com"]
}
}
| フィールド | 説明 | デフォルト |
|---|---|---|
enabled | SSRF保護の有効/無効 | false(DBにデータなし時) |
bypass_hosts | プライベートIP検証をスキップするホスト | [] |
allowed_hosts | 許可するホストの明示的リスト(設定時はallowlist方式) | [] |
検証フロー
外部リクエスト
│
▼
┌─────────────────┐
│ SSRF保護 有効? │
└────────┬────────┘
│
No ──┴── Yes
│ │
▼ ▼
✅許可 ┌─────────────────────┐
│ bypass_hostsに含む? │
└──────────┬──────────┘
│
No ──┴── Yes
│ │
▼ ▼
┌──────────────────┐ ✅許可
│ allowed_hosts │
│ 設定あり? │
└────────┬─────────┘
│
No ──┴── Yes
│ │
│ ▼
│ ┌──────────────────┐
│ │ allowed_hostsに │
│ │ 含まれる? │
│ └────────┬─────────┘
│ │
│ No ──┴── Yes
│ │ │
│ ▼ │
│ ❌ブロック │
│ │
└───────┬ ────────┘
▼
┌─────────────────┐
│ プライベートIP? │
└────────┬────────┘
│
No ──┴── Yes
│ │
▼ ▼
✅許可 ❌ブロック