Skip to content

Audit イベントカタログ

OP は op/audit.go で閉じたカタログとして定義された、構造化された監査イベントを発火します。各イベントは <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 で設定したロガーに流れます。どちらも渡していない場合、監査イベントは破棄されます。

Prometheus にも同時に送る

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

共通の属性

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

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

イベントカタログ

カタログを機能領域ごとに再編成しました。各グループは、SOC や運用にとってこの一群のイベントが何を意味するかを短く述べたあと、event 定数op/audit.go の Go 識別子)、発火タイミング想定シビアリティinfo は通常運転、warn は怪しい / 失敗系、alert は replay やストア障害といった即応すべきシグナル、という大まかな目安)、関連ページ の表に落としています。シビアリティはあくまで起点であり、実運用では発生レートに対するしきい値を調整してください。

アカウント管理

ほとんどは、OP が直接ホストしない out-of-band(帯域外)の管理パス — プロビジョニング / リカバリ / フェデレーションリンクなど — から発火します。実体の書き込み元がどこであっても、SOC が単一の購読点でカバーできるよう、本ライブラリのカタログに集約しています。

event 定数発火タイミング想定シビアリティ関連ページ
AuditAccountCreatedユーザアカウントを払い出したinfo
AuditAccountDeletedユーザアカウントを削除したinfo
AuditAccountEmailAddedアカウントに email を追加したinfo
AuditAccountEmailVerifiedemail の所有を確認した(リンク / OTP)info
AuditAccountEmailRemovedemail を削除したinfo
AuditAccountEmailSetPrimaryプライマリ email を変更したinfo
AuditAccountPasskeyRegisteredWebAuthn credential を登録したinfo
AuditAccountPasskeyRemovedWebAuthn credential を削除したinfo
AuditAccountTOTPEnabledTOTP 登録を完了したinfo
AuditAccountTOTPDisabledTOTP を解除したinfo
AuditAccountPasswordChangedパスワードリセット / 変更info
AuditAccountRecoveryRegeneratedrecovery batch を再発行したinfo
AuditRecoverySupportEscalationサポートによる override / 手動 recoverywarn
AuditAccountFederationLinked外部 IdP の credential を連携したinfo
AuditAccountFederationUnlinked外部 IdP の credential 連携を解除したinfo

ログイン / MFA / step-up

各 factor が解決したあとに、authenticator chain から発火します。login.failed / mfa.failed は通常レベルの探索シグナルで、レートが恒常的に上がるようなら credential stuffing の典型的な兆候です。step_up.required のレートを見れば、RP が acr_values を引き上げる頻度も追えます。

event 定数発火タイミング想定シビアリティ関連ページ
AuditLoginSuccessプライマリ credential の検証が成功し、subject が確定したinfoユースケース: MFA / step-up
AuditLoginFailedプライマリ credential が拒否されたwarnユースケース: MFA / step-up
AuditMFARequiredsession の AAL が要求未満で、第 2 factor を要求したinfoユースケース: MFA / step-up
AuditMFASuccess第 2 factor が受理されたinfoユースケース: MFA / step-up
AuditMFAFailed第 2 factor が拒否されたwarnユースケース: MFA / step-up
AuditStepUpRequiredRP がより高い acr_values を要求し、再度プロンプトしたinfoユースケース: MFA / step-up
AuditStepUpSuccessstep-up factor が受理されたinfoユースケース: MFA / step-up
extras
  • factorpasswordpasskeytotpemail_otpcaptcharecovery_code、または user-defined Step kind
  • aal — その factor がセッションを引き上げた assurance level
  • amr_valuesamr claim に寄与した RFC 8176 §2 のコード

同意

同意プロンプトとファーストパーティの fast-path から発火します。consent.granted.delta は「既存の grant が今回の要求を覆い切らず、ユーザに再確認させた」というシグナル、consent.revoked はユーザ起点の権限取り下げで、SOC ダッシュボードでは token.revoked と並べて見ると相関が取れます。

event 定数発火タイミング想定シビアリティ関連ページ
AuditConsentGrantedユーザがプロンプトで同意したinfoガイド: consent
AuditConsentGrantedFirstPartyファーストパーティの自動同意を適用した(プロンプトなし)infoユースケース: ファーストパーティ consent
AuditConsentGrantedDeltadelta consent が、新規センシティブ scope の再プロンプトを発生させたinfoガイド: consent
AuditConsentSkippedExisting既存の grant がリクエストを覆っており、プロンプトが不要だったinfoガイド: consent
AuditConsentRevokedユーザが過去の grant を取り消したinfoガイド: consent
extras
  • scopes_grantedscopes_requested — 文字列スライス
  • audience — audience 単位 scope の場合

code / token のライフサイクル

認可コード発行パスと token endpoint から発火します。replay 検出系(code.replay_detectedrefresh.replay_detected)とサブストア障害系(token.revoke_failedrefresh.chain_revoke_failedrefresh.grant_revoke_failed)が高シグナルなアラートで、それ以外は通常運転のライフサイクル telemetry です。

event 定数発火タイミング想定シビアリティ関連ページ
AuditCodeIssued認可コードを発行したinfoガイド: 認可コード + PKCE
AuditCodeConsumed/token で code を消費したinfoガイド: 認可コード + PKCE
AuditCodeReplayDetected認可コードが二度提示された — chain を失効させるalertガイド: 認可コード + PKCE
AuditTokenIssuedアクセストークン + (任意で)refresh + (任意で)id_token を発行したinfoガイド: tokens
AuditTokenRefreshedリフレッシュトークンをローテーションし、新しいアクセストークンを発行したinfoガイド: リフレッシュトークン
AuditTokenRevoked/revoke または grant cascade で失効させたinfoガイド: tokens
AuditTokenRevokeFailed失効処理がサブストアの障害を観測。RFC 7009 §2.2 により、通信路上の応答は 200 のままalertガイド: tokens
AuditRefreshReplayDetectedリフレッシュトークンがローテーション猶予を超過して提示された — chain を失効させるalertガイド: リフレッシュトークン
AuditRefreshChainRevokeFailedreplay 検出時の連鎖失効でサブストアの障害を観測alertガイド: リフレッシュトークン
AuditRefreshGrantRevokeFailedrefresh-rotation cascade で grant tombstone の書き込みが失敗alertガイド: リフレッシュトークン
extras
  • grant_typeauthorization_coderefresh_tokenclient_credentials
  • format — アクセストークンの jwt / opaque
  • offline_access — bool。offline_access chain なら true
  • cnf — sender-bound のとき、dpop_jkt または mtls_x5t#S256
  • surfacetoken.revoke_failed で障害を観測した呼び出し元。/revokejwt_access_token / refresh_chain / opaque_access_token、token endpoint では認可コード再利用に伴う AT カスケードが失敗したときに code_replay_jwt_access_tokens
  • grant_idtoken.revoke_failed(token endpoint)と refresh.grant_revoke_failed で、tombstone 書き込みに失敗した grant
  • reasonrefresh.chain_revoke_failed / refresh.grant_revoke_failed で、サブストアから返ったエラー文字列
  • errtoken.revoke_failed で、サブストアから返ったエラー文字列

session / logout

セッションストアと logout 系エンドポイントから発火します。bcl.no_sessions_for_subject は下に補足する volatile 配置のシグナル、Back-Channel 配送系イベントは RP が logout に応じない場合の SOC pivot 点です。

event 定数発火タイミング想定シビアリティ関連ページ
AuditSessionCreated新しいブラウザセッションを発行した(ログイン後)infoガイド: sessions and logout
AuditSessionDestroyedsession を削除した(logout / 期限切れ / 退避)infoガイド: sessions and logout
AuditLogoutRPInitiatedRP-Initiated Logout が発火したinfoガイド: sessions and logout
AuditLogoutBackChannelDeliveredBack-Channel logout token を RP に配送したinfoユースケース: Back-Channel Logout
AuditLogoutBackChannelFailedBack-Channel 配送に失敗(HTTP エラー / タイムアウト / 検証失敗)warnユースケース: Back-Channel Logout
AuditBCLNoSessionsForSubject/end_session で subject を指定したが、対応する session が 0 件だったinfoユースケース: Back-Channel Logout
bcl.no_sessions_for_subject の意図

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

防御シグナル

リクエスト検証パスが、不正利用シグナルや運用者向けポリシーのヒットを検知したときに発火します。自動の abuse-mitigation パイプラインが拾うのは、ほぼこのグループのイベントです。

event 定数発火タイミング想定シビアリティ関連ページ
AuditRateLimitExceededレートリミッタがリクエストを拒否した — 組み込み側が発火 する語彙。本ライブラリは汎用の per-IP / per-endpoint HTTP throttle を実装しませんwarn
AuditRateLimitBypassedbypass トークンを消費した(運用者による上書き) — 組み込み側が発火 する語彙。スコープは AuditRateLimitExceeded と同じwarn
AuditPKCEViolationPKCE verifier の不一致 / plain の拒否 / FAPI 下での不在alertガイド: 認可コード + PKCE
AuditRedirectURIMismatchredirect URI が登録リストに不一致warnガイド: redirect URI
AuditAlgLegacyUsed旧 alg のパスに到達した(テレメトリ目的。verifier 側では拒否)warnガイド: JOSE basics
AuditCORSPreflightAllowedCORS preflight が厳格な許可リストに合致したinfoユースケース: SPA 向け CORS
AuditDPoPLooseMethodCaseAdmittedDPoP 証明の htm が標準形でない大文字小文字。テレメトリ付きで受理infoガイド: DPoP
AuditKeyRetiredKidPresentedリクエストが JWKS の猶予期間を過ぎた kid を提示 — verifier で拒否warn運用: 鍵ローテーション

introspection

/introspect がクライアント認証や RFC 7662 §2.2 の応答契約を満たさず拒否したときに発火します。通信路上の応答は標準形のままに保ち、SOC ツールが追える理由はこのイベント側に集約しています。

event 定数発火タイミング想定シビアリティ関連ページ
AuditIntrospectionError/introspect がクライアントの資格情報を拒否warn

クライアント認証

/token および /par がクライアント認証を拒否したときに発火します。通信路上の応答は標準どおりの invalid_client のままに保ちつつ、このイベントから試行された client_id と短い理由コードを取り出せます。SOC ツールの probing 検知などに利用できます。

event 定数発火タイミング想定シビアリティ関連ページ
AuditClientAuthnFailure/token または /par がクライアントを拒否(誤った secret、期限切れ assertion、alg 不一致、private_key_jwt の不在など)warnガイド: クライアントの種類

DCR

/register および /register/{client_id} から発火します。RAT / IAT 系の失敗イベントは、DCR 配下では probing の典型的なシグナルです。

event 定数発火タイミング想定シビアリティ関連ページ
AuditDCRIATConsumedInitial Access Token を消費したinfoユースケース: Dynamic Client Registration
AuditDCRIATExpiredTTL 超過の IAT を提示したwarnユースケース: Dynamic Client Registration
AuditDCRIATInvalidIAT の signature / format が不正warnユースケース: Dynamic Client Registration
AuditDCROpenRegistrationUsedopen(IAT 不要)登録を受理したinfoユースケース: Dynamic Client Registration
AuditDCRClientRegistered新規 client を作成したinfoユースケース: Dynamic Client Registration
AuditDCRClientMetadataReadRAT 持ちの GET on /register/{client_id}infoユースケース: Dynamic Client Registration
AuditDCRClientMetadataUpdatedRAT 持ちの PUT on /register/{client_id}infoユースケース: Dynamic Client Registration
AuditDCRClientDeletedRAT 持ちの DELETE on /register/{client_id}infoユースケース: Dynamic Client Registration
AuditDCRRATInvalidRegistration Access Token を拒否したwarnユースケース: Dynamic Client Registration
AuditDCRMetadataValidationメタデータペイロードがポリシー違反warnユースケース: Dynamic Client Registration

Device Code (RFC 8628)

/device_authorizationop/devicecodekit の verification ヘルパ、token endpoint の device-code grant から発火します。device_code.verification.user_code_brute_forcedevice_code.token.slow_down は、典型的なポーリング乱用シグナルです。

event 定数発火タイミング想定シビアリティ関連ページ
AuditDeviceAuthorizationIssued/device_authorization が新しい device_code + user_code ペアを返却infoガイド: device code
AuditDeviceAuthorizationRejected/device_authorization がリクエストを拒否(未知 client、scope 拒否など)warnガイド: device code
AuditDeviceAuthorizationUnboundRejectedDPoP / mTLS の証明が必要だが /device_authorization に無かったwarnガイド: 送信者制約付きトークン
AuditDeviceCodeVerificationApproved組み込み側の verification ページがユーザの承認を報告infoユースケース: device code
AuditDeviceCodeVerificationDenied組み込み側の verification ページがユーザ拒否を報告(またはレコード単位の総当たり対策がロックアウト)warnユースケース: device code
AuditDeviceCodeUserCodeBruteForceuser_code 提出が外れた。カウンタを増やし、devicecodekit.MaxUserCodeStrikes(既定 5)でロックアウト発火alertユースケース: device code
AuditDeviceCodeTokenIssued承認済 device authorization に対し /token がトークンを発行infoユースケース: device code
AuditDeviceCodeTokenRejected/token が device-code grant を拒否(access_deniedexpired_token など)warnユースケース: device code
AuditDeviceCodeTokenSlowDown/tokenslow_down を返却。サブストア上のレコードで interval が倍化されるwarnユースケース: device code
AuditDeviceCodeRevokedop/devicecodekit.Revoke がレコードを拒否状態に遷移させた。Deps.AccessTokens が渡されている場合は、ヘルパが発行済みアクセストークンも連鎖失効させ、revoked_access_tokens を記録するinfoユースケース: device code

CIBA

/bc-authorize、組み込み側の authentication-device 連携、token endpoint の CIBA grant から発火します。ciba.poll_abuse.lockout がクライアントの不正挙動を捕まえる主要シグナルです。

event 定数発火タイミング想定シビアリティ関連ページ
AuditCIBAAuthorizationIssued/bc-authorize が新しい auth_req_id を返却infoガイド: CIBA
AuditCIBAAuthorizationRejected/bc-authorize がリクエストを拒否(未知ユーザ、hint resolver 失敗、scope 拒否)warnガイド: CIBA
AuditCIBAAuthorizationUnboundRejectedDPoP / mTLS の証明が必要だが /bc-authorize に無かったwarnガイド: 送信者制約付きトークン
AuditCIBAAuthDeviceApprovedサブストアが保留中リクエストに対する Approve を観測(組み込み側の認証デバイスコールバック)infoユースケース: CIBA
AuditCIBAAuthDeviceDeniedサブストアが保留中リクエストに対する Deny を観測warnユースケース: CIBA
AuditCIBAPollAbuseLockoutポーリング間隔が交渉済みの interval を大きく下回り続け、リクエストをロックアウトalertユースケース: CIBA
AuditCIBATokenIssued承認済 CIBA リクエストに対し /token がトークンを発行infoユースケース: CIBA
AuditCIBATokenRejected/token が CIBA grant を拒否(access_deniedexpired_tokenauthorization_pending)warnユースケース: CIBA
AuditCIBATokenSlowDown/tokenslow_down を返却。クライアントが交渉 interval より速くポーリングしたwarnユースケース: CIBA
AuditCIBAPollObservationFailedポーリングの LastPolledAt 永続化が失敗。判定自体は続行する(best-effort な観測)warnユースケース: CIBA

Token Exchange (RFC 8693)

同梱の RegisterTokenExchange ハンドラから発火します。成功時は requested + granted を必ず発火し、拒否時は requested + 失敗系イベント 1 つを発火します。policy_denied / scope_inflation_blocked / audience_blocked が、SOC ダッシュボードで通常追うポリシー判定シグナルです。

event 定数発火タイミング想定シビアリティ関連ページ
AuditTokenExchangeRequested/token が RFC 8693 リクエストを受理しハンドラに入ったinfoガイド: token exchange
AuditTokenExchangeGrantedexchange を許可し、新しいアクセストークン(任意で refresh)を発行infoユースケース: token exchange
AuditTokenExchangePolicyDenied組み込み側の TokenExchangePolicy が拒否(deny)を返却warnユースケース: token exchange
AuditTokenExchangePolicyErrorポリシーが拒否(deny)以外のエラーを返却(一過性のインフラ障害など)warnユースケース: token exchange
AuditTokenExchangeScopeInflationBlocked要求 scope が subject_token の scope または client allow-list を超えたwarnユースケース: token exchange
AuditTokenExchangeAudienceBlocked要求 audience がポリシーの allow-list の外だったwarnユースケース: token exchange
AuditTokenExchangeTTLCapped発行 TTL を(ハンドラの希望、subject_token の残り、グローバル上限)の最小値で切り詰めたinfoユースケース: token exchange
AuditTokenExchangeActChainTooDeepネストした act チェーンの深さが上限を超えたwarnユースケース: token exchange
AuditTokenExchangeEmptyScopeRejectedscope subset を空集合に解決して拒否warnユースケース: token exchange
AuditTokenExchangeActorEqualsSubjectactor_token が subject_token と同じ subject に解決(委譲なし)infoユースケース: token exchange
AuditTokenExchangeSubjectTokenExternalsubject_token がローカルレジストリで解決できず、外部発行の opaque トークンとして扱ったinfoユースケース: token exchange
AuditTokenExchangeActorTokenExternalactor_token がローカルレジストリで解決できず、外部発行の opaque トークンとして扱ったinfoユースケース: token exchange
AuditTokenExchangeSubjectTokenInvalidsubject_token の検証に失敗(signature / TTL / cnf 不一致)warnユースケース: token exchange
AuditTokenExchangeSubjectTokenRegistryErrorレジストリの参照(lookup)が NotFound 以外の障害を観測。通信路上の応答は invalid_grant のままalertユースケース: token exchange
AuditTokenExchangeRefreshIssuedexchange が refresh 発行をオプトイン(IssueRefreshToken=op.PtrBool(true))infoユースケース: token exchange
AuditTokenExchangeSelfExchangeexchange の宛先が呼び出し client 自身(受動的なトークン replay シナリオ)warnユースケース: token exchange

Custom Grant

イベント意味レベル参照
custom_grant.requestedcustom grant_type がディスパッチャに入ったinfoユースケース: custom grant
custom_grant.failedcustom grant の dispatch またはハンドラが失敗したwarnユースケース: custom grant
custom_grant.refresh_droppedハンドラが IssueRefreshToken でリフレッシュトークン発行を求めたが、クライアントが refresh_token grant に登録されていない。アクセストークン応答自体は成功するinfoユースケース: custom grant

Grant management

イベント定数発火タイミングseverity の目安リンク先
AuditGrantManagementRevokedgrant management エンドポイントへの DELETE が grant を失効させ、トークンをカスケードしたinfoユースケース: grant management

安定性

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

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

ダッシュボードや SIEM ルールはイベント名で固定し、出現順序や、このページに記載のない 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

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