Skip to content

Audit イベントカタログ

OP は op/audit.go で閉じたカタログとして定義された、構造化された audit イベントを発火します。各イベントは <area>.<verb>(または <area>.<verb>.<qualifier>)形の安定した文字列で、SOC ダッシュボードが自由形式のメッセージを parse することなく、area 単位で集計できる形になっています。

購読する

go
op.New(
    /* 必須オプション */
    op.WithAuditLogger(slog.New(myJSONHandler)),
)

op.WithAuditLogger*slog.Logger を受け取ります。各イベントは、msg がイベント識別子(たとえば "token.issued")で、属性に request_id / subject / client_id とカテゴリ固有のフィールドを持つ extras グループが付いた、構造化ログのエントリとして記録されます。

WithAuditLogger を渡さない場合は、WithLogger で設定したロガー (または slog.Default())に流れます。

Prometheus にも同時に送る

WithPrometheus を併用すると、これらのイベントの厳選サブセットが Prometheus カウンタにも反映されます。1 回の発火で slog のストリームと該当カウンタの両方が更新されるので、metrics 用の追加発火はありません。

共通の属性

すべてのイベントが持つ:

属性補足
request_idstringリクエスト単位の識別子(X-Request-ID を伝播)
subjectstring該当ユーザの OIDC sub。認証前のイベントでは空
client_idstringOAuth client_id。アカウント管理イベントでは空
extrasgroupカテゴリ固有のフィールド(各セクションを参照)

イベントカタログ

アカウント管理

ほとんどは、OP が直接ホストしない out-of-band(帯域外)の管理パスから発火します。SOC が単一の購読点でカバーできるよう、本ライブラリのカタログに集約しています。

イベント発火タイミング
account.createdユーザアカウントを払い出した
account.deletedユーザアカウントを削除した
account.email.addedアカウントに email を追加した
account.email.verifiedemail の所有を確認した(リンク / OTP)
account.email.removedemail を削除した
account.email.set_primaryプライマリ email を変更した
account.passkey.registeredWebAuthn credential を追加した
account.passkey.removedWebAuthn credential を削除した
account.totp.enabledTOTP 登録を完了した
account.totp.disabledTOTP を解除した
account.password.changedパスワードリセット / 変更
account.recovery_codes.regeneratedrecovery batch を再発行した
recovery.support_escalationサポートによる override / 手動 recovery
federation.linked外部 IdP の credential をリンクした
federation.unlinked外部 IdP の credential を解除した

ログイン / MFA / ステップアップ

各 factor が解決したあとに、authenticator chain から発火します。

イベント発火タイミング
login.successプライマリ credential の検証が成功し、subject が確定した
login.failedプライマリ credential が拒否された
mfa.requiredsession の AAL が要求未満で、第 2 factor を要求した
mfa.success第 2 factor が受理された
mfa.failed第 2 factor が拒否された
step_up.requiredRP がより高い acr_values を要求し、再度プロンプトした
step_up.successstep-up factor が受理された
extras
  • factorpasswordpasskeytotpemail_otpcaptcharecovery_code、または user-defined Step kind
  • aal — その factor がセッションを引き上げた assurance level
  • amr_valuesamr claim に寄与した RFC 8176 §2 のコード
イベント発火タイミング
consent.grantedユーザがプロンプトで consent をクリックした
consent.granted.first_partyファーストパーティの自動 consent を適用した(プロンプトなし)
consent.granted.deltadelta consent が、新規センシティブ scope の再プロンプトをトリガした
consent.skipped.existing既存の grant がリクエストを覆っており、プロンプトが不要だった
consent.revokedユーザが過去の grant を取り消した
extras
  • scopes_grantedscopes_requested — 文字列スライス
  • audience — audience 単位 scope の場合

コード / トークン

authorize-code 発行パスと、token endpoint から発火します。

イベント発火タイミング
code.issuedauthorization code を発行した
code.consumed/token で code を消費した
code.replay_detectedcode が二度提示された — chain を失効させる
token.issuedaccess token + (任意で)refresh + (任意で)id_token を発行した
token.refreshedrefresh token をローテーションし、新しい access token を発行した
token.revoked/revoke または grant cascade で失効させた
refresh.replay_detectedrefresh token がローテーション猶予を超過して提示された — chain を失効させる
extras
  • grant_typeauthorization_coderefresh_tokenclient_credentials
  • format — access token の jwt / opaque
  • offline_access — bool。offline_access chain なら true
  • cnf — sender-bound のとき、dpop_jkt または mtls_x5t#S256

セッション / ログアウト

イベント発火タイミング
session.created新しいブラウザセッションを発行した(ログイン後)
session.destroyedsession を削除した(logout / 期限切れ / eviction)
logout.rp_initiatedRP-Initiated Logout が発火した
logout.back_channel.deliveredBack-Channel logout token を RP に配送した
logout.back_channel.failedBack-Channel 配送失敗(HTTP エラー / timeout / 検証失敗)
bcl.no_sessions_for_subject/end_session で subject を指定したが、対応する session が 0 件だった
bcl.no_sessions_for_subject の意図

揮発な SessionStore(persistence 無しの Redis、maxmemory eviction 配下のインメモリ層など)では、これは「session が確立から logout までの間に追い出された」というシグナルになります。OIDC Back-Channel Logout 1.0 §2.7 にある best-effort delivery の最低ラインがゼロまで下がる、という意味です。INFO レベルの運用が想定で、揮発配置ではこのギャップは想定済みです。SOC ツールはイベント単位ではなく、発生レートの上昇に対してアラートを張ります。設定された WithSessionDurabilityPosture の値も extras に含むので、ダッシュボードは「揮発配置で想定内」と「永続配置で想定外」を分離できます。

防御

リクエスト検証パスが、不正利用シグナルや運用者向けポリシーのヒットを検知したときに発火します。

イベント発火タイミング
rate_limit.exceededレートリミッタがリクエストを拒否した
rate_limit.bypassedbypass token を消費した(運用者の override)
pkce.violationPKCE verifier 不一致 / plain の拒否 / FAPI 下で不在
redirect_uri.mismatchredirect URI が登録リストに不一致
alg.legacy_used旧 alg のパスに到達した(テレメトリ。verifier では拒否)

Dynamic Client Registration

/register および /register/{client_id} から発火します。

イベント発火タイミング
dcr.iat.consumedInitial Access Token を消費した
dcr.iat.expiredTTL 超過の IAT を提示した
dcr.iat.invalidIAT の signature / format が不正
dcr.open_registration_usedopen(IAT 不要)登録を受理した
dcr.client.registered新規 client を作成した
dcr.client.metadata_readRAT 持ちの GET on /register/{client_id}
dcr.client.metadata_updatedRAT 持ちの PUT on /register/{client_id}
dcr.client.deletedRAT 持ちの DELETE on /register/{client_id}
dcr.rat.invalidRegistration Access Token を拒否した
dcr.metadata.validation_failedメタデータペイロードがポリシー違反

安定性

audit イベント名は公開 API 表面の一部です:

  • 新しいイベントは、マイナーリリースで追加され得ます。
  • 既存のイベント名は、メジャーリリースで deprecation notice 付きでしか改名されません。

ダッシュボードはイベント名を pin してください。出現順序や、このページに記載のない extras フィールドの形には依存しないでください。

このリストの裏取り

sh
git clone https://github.com/libraz/go-oidc-provider.git
cd go-oidc-provider
grep -hE 'AuditEvent\("[a-z_.]+"\)' op/audit.go \
  | grep -oE '"[a-z_.]+"' | sort -u

出力が、このページがミラーしている閉じたカタログです。