セキュリティイベント・フック
idp-serverのセキュリティイベントとフックシステムの概念について説明します。
セキュリティイベントとは
セキュリティイベント(Security Event) とは、認証・認可ライフサイクル上の重要なアクションを表現するイベントです。
目的
- 可観測性: システムで何が起きているかをリアルタイ ムに把握
- 監査: コンプライアンス要件のためのログ記録
- 外部システム連携: SIEM、アラートシステムとの統合
- 自動対応: セキュリティイベントに基づく自動アクション(アカウントロック等)
イベント駆動アーキテクチャ
idp-serverでは、フロー本体のロジック(認証・認可処理)と副作用的処理(通知、ログ記録)を明確に分離しています。
従来のアプローチ:
// 認証処理の中に通知ロジックが混在
public void authenticate() {
// 認証処理
if (success) {
slackNotification.send("ログイン成功");
emailService.send("ログイン通知");
auditLog.record("login_success");
}
}
イベント駆動アプローチ:
// 認証処理はイベント発行のみ
public void authenticate() {
// 認証処理
if (success) {
eventPublisher.publish(SecurityEventType.LOGIN_SUCCESS);
// 通知・ログはイベントハンドラーが処理
}
}
イベント発行タイミングと処理モード
処理モードの設計方針
セキュリティイベントの処理モードは APIの利用者が誰か と 操作の不可逆性 で決まる。
エンドユーザー向けAPI(Application Plane) → 原則、非同期
ログイン画面の応答が遅くなるのはNG。
ログ保存が数秒遅れても問題ない。
ただし、不可逆な操作は同期:
- アカウント削除(user_self_delete)
- 身元確認の最終判定(approved / rejected)
管理者向けAPI(Control Plane) → 同期
管理画面の応答が少し遅くなるのは許容できる。
「ユーザーを削除したのにログが残っていない」は許容できない。
エンドユーザー向けAPI — 非同期
イベント処理はバックグラウンドで実行される。APIレスポンスはイベント処理の完了を待たない。
ログイン
ユーザーがログイン画面で認証操作を行ったとき。
| シナリオ | イベント |
|---|---|
| ID/パスワードを入力して送信した | password_success / password_failure |
| FIDO2セキュリティキーをタッチした | fido2_authentication_success / failure |
| FIDO2チャレンジを要求した | fido2_authentication_challenge_success / failure |
| FIDO UAF(生体認証)で認証した | fido_uaf_authentication_success / failure |
| FIDO UAFチャレンジを要求した | fido_uaf_authentication_challenge_success / failure |
| メールに送られたコードを入力した | email_verification_success / failure |
| メール認証コードの送信を要求した | email_verification_request_success / failure |
| SMSに送られたコードを入力した | sms_verification_success / failure |
| SMS認証コードの送信を要求した | sms_verification_challenge_success / failure |
| 外部サービスのトークンで認証した | external_token_authentication_success / failure |
認可・セッション
認証後、アプリケーションへのアクセス許可を判断するとき。
| シナリオ | イベント |
|---|---|
| 同意画面で「許可」を押した | oauth_authorize |
| 同意画面で「拒否」を押した | oauth_deny |
| ログイン済みセッションで自動的に認可された | oauth_authorize_with_session |
| セッションの期限が切れていた | oauth_authorize_with_session_expired |
| セッションの認証レベルが要求と合わなかった | oauth_authorize_with_session_acr_mismatch |
| セッションのポリシーが要求と合わなかった | oauth_authorize_with_session_policy_mismatch |
| 認可処理中にエラーが発生した | authorize_failure |
| ログアウトした | logout |