Skip to content

監査イベントカタログ ​

OP は op/audit パッケージで閉じたカタログとして定義された、構造化された監査イベントを発火します。ただしカタログは語彙であり、すべての定数が発火するという約束ではありません。本ページでは OP が発火するシグナルと、将来または組み込み側の account/device plane 向けに予約された名前を区別します。各イベントは <area>.<verb>(または <area>.<verb>.<qualifier>)形の安定した文字列です。SOC ダッシュボードは自由形式のメッセージを解析しなくても、area 単位で集計できます。

閉じたカタログ 1 つ、届き先 3 つ
OP の各処理パスは、閉じた 1 つのカタログから監査イベントを発火します。各イベントは文脈を extras に載せ、構造化ログ、SOC パイプライン、Prometheus のカウンタへ届きます。発火元届き先login / MFA要素の判定、ステップアップtoken / grant発行、ローテーション、失効DCR / device動的登録、デバイスの承認監査イベントaudit.* — 閉じた集合文脈は extras に載せるslog の JSON1 イベント 1 オブジェクトSOC / SIEMイベント名で検索できるPrometheus結果ごとのカウンタ
右の列が成立するのは、カタログが閉じているからです。イベント名の集合が固定されバージョン管理されているため、アラートをイベント名で組めます。呼び出し箇所のフォーマット文字列から組み立てているのではありません。

購読する ​

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

op.WithAuditLogger は *slog.Logger を受け取ります。各イベントは構造化ログのエントリとして記録されます。event 属性はイベント識別子(たとえば "token.issued")を、msg は人間向けの短いメッセージを持ちます。正規フィールドは任意のトップレベル属性です。actor_id、client_id、session_id、request_id、ip、user_agent、tag は未設定なら出力されません。空でない extras グループにカテゴリ固有のフィールドが入ります。発火は呼び出し元の goroutine 上で同期的に行われます。handler は遅い I/O や無制限 queue で block させず、多数の request から並行して呼ばれても安全にしてください。

WithAuditLogger を渡さない場合は、WithLogger で設定したロガーに流れます。どちらも渡していない場合、監査イベントは破棄されます。

Prometheus にも同時に送る

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

コードからカタログを列挙する ​

監査イベントの定数と、OP が使うイベントのレジストリは、github.com/libraz/go-oidc-provider/op/audit パッケージで公開されています(audit.LoginSuccess、audit.TokenIssued など。文字列値は以下のイベント名です)。audit.Catalog() は全イベントのコピーを []audit.EventDefinition として返します:

go
import "github.com/libraz/go-oidc-provider/op/audit"

for _, def := range audit.Catalog() {
    // def.Event       — 監査イベント識別子。例: "token.issued"
    // def.MetricName  — 対応する Prometheus カウンタ。監査のみのイベントでは空
    // def.MetricLabel — カテゴリカウンタで使う値域限定のラベル。空のことも多い
}

イベント集合を散文ではなくデータとして扱いたいとき、たとえば SIEM のルールを生成する、ダッシュボードが全イベントを網羅していることをテストで検証する、metrics 投影を持つイベントを洗い出す、といった場面で使います。ライブラリ内の発火箇所と Prometheus ブリッジが同じレジストリを参照しているため、イベントの一覧と metrics のルーティングが食い違うことはありません。

共通の属性 ​

発火したイベントには audit と event が含まれます。正規フィールドは任意で、未設定なら出力されません。extras は空なら出力されません。slog.JSONHandler を使うと、レコード時刻、レベル、メッセージも出力されます:

属性型補足
auditstring常に "true"
eventstringイベント識別子。例: "token.issued"
actor_idstringユーザ起点では subject 識別子、クライアント起点では client_id。未設定なら出力されません
client_idstringOAuth client_id。未設定なら出力されません
session_idstring該当する場合の OP session 識別子。未設定なら出力されません
request_idstringリクエストの相関 ID。未設定なら出力されません
ipstringOP のエッジで観測したクライアント IP。未設定なら出力されません
user_agentstring観測した User-Agent の値。未設定なら出力されません
tagstringoperator が設定した DCR tag。未設定なら出力されません
extrasgroupカテゴリ固有のフィールド(各セクションを参照)。空の場合は出力されません
timetimestampslog.Record.Time。WithClock またはシステム時刻のレコード時刻です
levelstringslog.Record.Level。INFO、WARN、ERROR など
msgstringslog.Record.Message。人間向けの短いメッセージです

イベントカタログ ​

カタログを機能領域ごとに再編成しました。各グループは、SOC や運用にとってこの一群のイベントが何を意味するかを短く述べたあと、event 定数(op/audit パッケージの Go 識別子)、発火タイミングまたは予約理由、想定シビアリティ(info は通常運転、warn は怪しい / 失敗系、alert は replay やストア障害といった即応すべきシグナル、という大まかな目安)、関連ページ の表に落としています。予約 と明記した行は OP が発火しません。予約イベントが存在しないことは、元の操作が起きなかった証拠ではありません。

Provider ライフサイクル ​

startup.profile は OP instance の監査ストリームの起点です。op.New が設定を検証し、provider を返す前に 1 回だけ発火します。extras は次の 2 群で構成されます。

  • 宣言値 — profiles / features / grants。profiles は宣言順の小文字の識別子(oauth21、oidc-core、fapi2-baseline、fapi2-message-signing、fapi-ciba)です。op.WithProfile を指定しない場合は ["oauth21"] になります。
  • 解決後のポリシー — signing_alg(ES256 または RS256)、PKCE、PAR、nonce と state-or-nonce、送信者制約、client authentication、token TTL、token format、リフレッシュの猶予期間とローテーション、DPoP nonce、JAR、署名付き backchannel request、JARM、署名付き introspection、および 2 つの insecure_*_for_dev フラグ。
event 定数発火タイミング想定シビアリティ関連ページ
audit.StartupProfile検証済み provider の起動時infoOptions 索引

アカウント管理 ​

予約語です。 OP が直接ホストしない仕様外の管理経路(プロビジョニング / リカバリ / フェデレーションリンクなど)を表します。組み込み側は自身の監査 sink から発火できますが、OP 自体は発火しません。

event 定数発火タイミング想定シビアリティ関連ページ
audit.AccountCreated予約 — 組み込み側がユーザアカウントを払い出したinfo—
audit.AccountDeleted予約 — 組み込み側がユーザアカウントを削除したinfo—
audit.AccountEmailAdded予約 — アカウントに email を追加したinfo—
audit.AccountEmailVerified予約 — email の所有を確認したinfo—
audit.AccountEmailRemoved予約 — email を削除したinfo—
audit.AccountEmailSetPrimary予約 — プライマリ email を変更したinfo—
audit.AccountPasskeyRegistered予約 — WebAuthn credential を登録したinfo—
audit.AccountPasskeyRemoved予約 — WebAuthn credential を削除したinfo—
audit.AccountTOTPEnabled予約 — TOTP 登録を完了したinfo—
audit.AccountTOTPDisabled予約 — TOTP を解除したinfo—
audit.AccountPasswordChanged予約 — パスワードを変更したinfo—
audit.AccountRecoveryRegenerated予約 — recovery batch を再発行したinfo—
audit.RecoverySupportEscalation予約 — サポートによる override / 手動 recoverywarn—
audit.AccountFederationLinked予約 — 外部 IdP の credential を連携したinfo—
audit.AccountFederationUnlinked予約 — 外部 IdP の credential 連携を解除したinfo—

ログイン / MFA / step-up ​

login.* と mfa.* は、factor が解決したあとに authenticator chain から発火します。chain の最初の factor は login.*、2 つ目以降は mfa.* で報告されます。既存セッションでの step-up も mfa.* で、セッションが持つ過去の認証方式は完了済みとして数えられます。login.failed / mfa.failed は通常レベルの探索シグナルで、レートが恒常的に上がるようなら credential stuffing の典型的な兆候です。WithAuthnLockoutStore を使っている場合、ロックアウトを発動させた失敗した試行も、これらの失敗イベントとして報告され、続けて lockout.engaged が発火します。audit.MFARequired、audit.StepUpRequired、audit.StepUpSuccess は 予約 であり、OP は発火しません。step-up は resource server が決め、OP には通常の authorize request が届きます。

event 定数発火タイミング想定シビアリティ関連ページ
audit.LoginSuccessプライマリ credential の検証が成功し、subject が確定したinfoユースケース: MFA / ステップアップ
audit.LoginFailedプライマリ credential が拒否されたwarnユースケース: MFA / ステップアップ
audit.LockoutStalledcross-factor lockout の CAS 競合で失敗試行をカウントせず中断した。その subject の失敗回数の枠は進まないalertユースケース: MFA / ステップアップ
audit.LockoutEngaged失敗した試行によって、cross-factor の総当たり対策ロックが新たに成立した(password、TOTP、メール OTP、recovery code)。subject を ActorID として 1 回だけ発火し、ロック中の試行では再発火しない。ロック中のパスワード試行は誤ったパスワードとまったく同じ応答になるため、このイベントが「ユーザがログインできない」ことを運用者に知らせる合図になるwarnユースケース: MFA / ステップアップ
audit.StepBeginFailed(login.step_begin_failed)login flow の step が開始できなかった。プロンプトを出す前に拒否する factor でも記録が残る。extras は step_kind と reason(not_enrolled、aborted、locked、not_enrolled_skipped、error)を持つ。subject が確定していれば actor_id に入り、クライアントが中断したリクエストは記録しないwarn(not_enrolled_skipped は info。one-of step が、subject がどの factor も持たないために通過された場合)ユースケース: MFA / ステップアップ
audit.MFARequired予約 — OP は requirement 専用イベントを発火しないinfoユースケース: MFA / ステップアップ
audit.MFASuccess第 2 factor が受理されたinfoユースケース: MFA / ステップアップ
audit.MFAFailed第 2 factor が拒否されたwarnユースケース: MFA / ステップアップ
audit.StepUpRequired予約 — resource server の判断であり、OP は発火しないinfoユースケース: MFA / ステップアップ
audit.StepUpSuccess予約 — resource server の結果であり、OP は発火しないinfoユースケース: MFA / ステップアップ
extras
  • factor — password、passkey、totp、email_otp、captcha、recovery_code、または user-defined Step kind

login/MFA イベントは aal、acr、amr_values を持ちません。

同意 ​

audit.ConsentGranted と audit.ConsentGrantedFirstParty は同意画面とファーストパーティの自動同意経路から発火します。その他の consent 定数は 予約 です。追加 scope の同意も通常の consent.granted として記録され、既存 grant の再利用にはイベントがなく、grant の取り下げには Grant Management の grant_management.revoked を使います。

event 定数発火タイミング想定シビアリティ関連ページ
audit.ConsentGrantedユーザが同意画面で同意したinfoガイド: 同意
audit.ConsentGrantedFirstPartyファーストパーティの自動同意を適用した(同意画面なし)infoユースケース: ファーストパーティ同意スキップ
audit.ConsentGrantedDelta予約 — 追加 scope は通常の audit.ConsentGranted として発火infoガイド: 同意
audit.ConsentSkippedExisting予約 — 保存済み同意の再利用は発火しないinfoガイド: 同意
audit.ConsentRevoked予約 — Grant Management の取り下げは audit.GrantManagementRevoked を発火infoガイド: 同意
extras
  • grant_id — consent を記録した grant
  • scope — コードを発行したときの scope
  • completion_id — ブラウザが RP へ運ぶ認可コードの不可逆な fingerprint

code / token のライフサイクル ​

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

event 定数発火タイミング想定シビアリティ関連ページ
audit.CodeIssued認可コードを発行した。対話的経路とサイレント経路を含め、コードごとに 1 回だけ発火しますinfoガイド: 認可コード + PKCE
audit.CodeConsumed/token で code を消費したinfoガイド: 認可コード + PKCE
audit.CodeReplayDetected認可コードが二度提示された — chain を失効させるalertガイド: 認可コード + PKCE
audit.TokenIssuedgrant に対する最初の refresh token を永続化した(すべての access token 発行を数えるイベントではない)infoガイド: トークン
audit.TokenRefreshedリフレッシュトークンをローテーションし、そのローテーションが永続化された。並行する提示にコミット時に負けた refresh やロールバックした refresh では記録されないinfoガイド: リフレッシュトークン
audit.TokenRevoked/revoke がトークンを失効させた。対象 grant の subject がすでに存在しないため /token が引き換えを拒否したときにも、warn レベルで記録されるinfoガイド: トークン
audit.TokenRevokeFailed失効処理がサブストアの障害を観測。RFC 7009 §2.2 により、通信路上の応答は 200 のままalertガイド: トークン
audit.RefreshReplayDetectedリフレッシュトークンがローテーション猶予を超過して提示された — chain を失効させるalertガイド: リフレッシュトークン
audit.RefreshChainRevokeFailedreplay 検出時の連鎖失効でサブストアの障害を観測alertガイド: リフレッシュトークン
audit.RefreshGrantRevokeFailedrefresh-rotation cascade で grant tombstone の書き込みが失敗alertガイド: リフレッシュトークン
audit.RefreshPriorAccessTokenRevokeFailedrefresh rotation で直前の access token を失効できなかった。retry 可否も extras に入るalertガイド: リフレッシュトークン

code_id と completion_id は認可コード識別子から作る不可逆な fingerprint です。相関用の値であり、生の認可コードや内部識別子ではありません。code.issued は発行したコードごとに 1 回だけ発火します。

extras
  • refresh_origin — refresh chain に記録された型付き origin。authorization_code、device_code、ciba、custom_grant のいずれかで、欠落または閉じた集合外は metrics bridge が unknown に投影します。任意の request grant_type label ではなく、実際に chain を発行した grant を表します
  • grant_id — token.issued・token.refreshed・token.revoked・code.* では、そのクレデンシャルが属する grant。token.revoke_failed(token endpoint)と refresh.grant_revoke_failed では、teardown に失敗した grant
  • scope — code.issued と code.consumed で、コードの scope
  • code_id — code.* で、認可コードの不可逆な fingerprint
  • offline_access — token.issued と token.refreshed で、bool。offline_access chain なら true
  • ttl_bucket — token.issued と token.refreshed で、どの refresh token 有効期間が適用されたか
  • surface — token.revoked では jwt_access_token、opaque_access_token、refresh_chain、refresh_grant(chain の起点を解決できず、/revoke が grant の refresh token の失効に切り替えた)。subject が存在しないため引き換えを拒否した場合は subject_deprovisioned。token.revoke_failed では障害を観測した段階で、たとえば refresh_chain_walk、refresh_chain、refresh_grant、opaque_access_token_lookup。token endpoint は連鎖失効の名前を前置し、code_replay_jwt_access_tokens のようになる
  • jti — JWT アクセストークンの token.revoked で
  • reason — refresh.chain_revoke_failed / refresh.grant_revoke_failed で、サブストアから返ったエラー文字列
  • err — token.revoke_failed で、サブストアから返ったエラー文字列
  • failure_stage、retryable — refresh.prior_access_token_revoke_failed の値

セッション / ログアウト ​

下記のセッション / ログアウトの行は、セッションマネージャ、/end_session、detached Back-Channel Logout coordinator から発火します。audit.LogoutRPInitiated は 予約 です。/end_session は RP が要求したという marker ではなく、セッションと配送の結果を記録します。

event 定数発火タイミング想定シビアリティ関連ページ
audit.SessionCreated新しいブラウザセッションを発行した(ログイン後)infoガイド: セッションとログアウト
audit.SessionDestroyedsession を削除した(logout / 期限切れ / 退避)infoガイド: セッションとログアウト
audit.SessionAlreadyAbsentログアウト対象の session がすでに無い、または期限切れだったinfoガイド: セッションとログアウト
audit.SessionDestroyFailedsession 削除が store 障害になった。リクエストは静的 503 で状態を保持するalertガイド: セッションとログアウト
audit.LogoutClientLookupFailedRP 起点ログアウトの解決中に client registry の store lookup が失敗した。通信路上の応答は汎用的なままalertガイド: セッションとログアウト
audit.LogoutRPInitiated予約 — RP が要求したことだけを示す marker は発火しないinfoガイド: セッションとログアウト
audit.LogoutTokenRevokeFailedlogout token またはログアウト cascade の失効で store 障害になったalertガイド: セッションとログアウト
audit.LogoutBackChannelDeliveredBack-Channel logout token を RP に配送したinfoユースケース: バックチャネルログアウト
audit.LogoutBackChannelFailedBack-Channel 配送に失敗(HTTP エラー / タイムアウト / 検証失敗)warnユースケース: バックチャネルログアウト
audit.LogoutBackChannelResolveFailedgrant ベースの通知先解決に失敗したalertユースケース: バックチャネルログアウト
audit.LogoutBackChannelOverflow上限付き通知先解決が overflow したwarnユースケース: バックチャネルログアウト
audit.BCLNoSessionsForSubjectsession-bearing /end_session notice で grant 由来の RP 対象が 0 件(通知する RP がない)infoユースケース: バックチャネルログアウト
bcl.no_sessions_for_subject の意図

このイベントは Notice.SessionID があり、grant ベースの audience 解決で RP 対象が 0 件になった場合だけ発火します。coordinator が SessionStore を辿った、または session が追い出されたことを意味しません。SessionStore が /end_session の snapshot 前に行を失うと、handler は detached fan-out を起動せず、このイベントも発火しません。grant 由来の対象 0 件は通常の no-op でも起きるため INFO レベルとし、SOC ツールは個別イベントではなく発生レートの上昇に対してアラートを張ります。設定された WithSessionDurabilityPosture の値は trigger / snapshot の喪失と対象 0 件を解釈する文脈として含まれます。

防御シグナル ​

下記では PKCE、redirect mismatch、CORS、(loose verifier の opt-in 時の)DPoP、retired key のシグナルを OP が発火します。rate-limit は 組み込み側向け予約語 です。legacy algorithm の定数は 予約語 であり、OP は拒否を返しますが監査イベントは発火しません。

event 定数発火タイミング想定シビアリティ関連ページ
audit.RateLimitExceededレートリミッタがリクエストを拒否した — 組み込み側が発火 する語彙。本ライブラリは汎用の per-IP / per-endpoint HTTP throttle を実装しませんwarn—
audit.RateLimitBypassedbypass トークンを消費した(運用者による上書き) — 組み込み側が発火 する語彙。スコープは audit.RateLimitExceeded と同じwarn—
audit.PKCEViolation/token で code_verifier の検証に失敗した。extras には endpoint と reason(verifier_mismatch、verifier_format、challenge_method_unsupported)が入り、verifier そのものは入らないwarnガイド: 認可コード + PKCE
audit.RedirectURIMismatch/authorize に未登録の redirect_uri が来た、または /token に認可リクエストと異なる値が来た。extras には endpoint と受け取った redirect_uri が入る。/token の応答は汎用の invalid_grant のままなので、原因はこのイベントで確認するwarnガイド: Redirect URI
audit.AlgLegacyUsed予約 — 旧 alg の telemetry を発火する OP パスはないwarnガイド: JOSE 基礎
audit.CORSPreflightAllowedCORS preflight が厳格な許可リストに合致したinfoユースケース: SPA 向け CORS
audit.DPoPLooseMethodCaseAdmitted条件付き — loose method-case bridge を設定した verifier のみ発火。標準 op.New は strictinfoガイド: DPoP
audit.KeyRetiredKidPresentedリクエストが JWKS の猶予期間を過ぎた kid を提示 — verifier で拒否warn運用: 鍵ローテーション

対話画面(interaction) ​

interaction driver が応答を commit する前に render に失敗した場合だけ、render failure signal を発火します。driver が応答を commit 済みなら、OP は応答を置き換えられないため、重複イベントを発火しません。

event 定数発火タイミング想定シビアリティ関連ページ
audit.InteractionRenderFailedinteraction driver の render が応答 commit 前に失敗した。OP は汎用の server_error ページを返すalertユースケース: SPA / 対話画面のカスタマイズ

introspection ​

/introspect がクライアント認証を拒否したとき、または opaque access token / refresh token の store lookup が失敗したときに発火します。正常な inactive miss ではエラーイベントを発火しません。NotFound 以外の lookup 障害では、監査イベントで障害を把握しつつ、RFC 7662 の通信路上の応答は HTTP 200 と {"active":false} のままです。クライアント認証失敗は従来の標準エラー応答です。

event 定数発火タイミング想定シビアリティ関連ページ
audit.IntrospectionError/introspect がクライアント資格情報を拒否した、または opaque token store が NotFound 以外の障害を返したwarn / alert運用: 可観測性

クライアント認証 ​

/token、/par、/device_authorization、/bc-authorize がクライアント認証を拒否したときに発火します。通信路上の応答は標準どおりの invalid_client のままに保ちつつ、このイベントから試行された client_id と短い理由コードを取り出せます。/introspect は audit.IntrospectionError、/revoke はこのイベントを使いません。

event 定数発火タイミング想定シビアリティ関連ページ
audit.ClientAuthnFailure/token、/par、/device_authorization、/bc-authorize がクライアントを拒否(誤った secret、期限切れ assertion、alg 不一致、private_key_jwt の不在など)warnガイド: クライアント種別
audit.ClientAuthnPreviousSecret(client_authn.previous_secret)クライアントが、ローテーションの猶予期間中に旧 secret で client_secret_basic または client_secret_post の認証を行った。extras["method"] が方式を示し、secret 自体は添付しない。猶予期間が閉じる前に切り替えが必要なクライアントを見つけるために使うwarnガイド: クライアント種別

Client ID Metadata Document ​

Experimental(op.WithClientIDMetadataDocuments と同じ)。URL 形式の client_id を OP が解決するときに発火します(MCP 認可サーバを参照)。

event 定数発火タイミング想定シビアリティ関連ページ
audit.CIMDFetched(cimd.fetched)client ID metadata document を取得し、検証したinfoユースケース: MCP 認可サーバ
audit.CIMDFetchFailed(cimd.fetch_failed)document の取得または検証に失敗した。extras["reason"] は status、network、too_large、content_type、json、validation のいずれかで、validation では extras["error_code"] に検証エラーコードが入るwarnユースケース: MCP 認可サーバ
audit.CIMDClientDenied(cimd.client_denied)ClientIDMetadataDocuments.Allow フックが client_id URL を拒否したwarnユースケース: MCP 認可サーバ

動的クライアント登録(DCR) ​

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

event 定数発火タイミング想定シビアリティ関連ページ
audit.DCRIATConsumedInitial Access Token を消費したinfoユースケース: 動的クライアント登録
audit.DCRIATExpiredTTL 超過の IAT を提示したwarnユースケース: 動的クライアント登録
audit.DCRIATInvalidIAT の signature / format が不正warnユースケース: 動的クライアント登録
audit.DCROpenRegistrationUsedopen(IAT 不要)登録を受理したinfoユースケース: 動的クライアント登録
audit.DCRClientRegistered新規 client を作成したinfoユースケース: 動的クライアント登録
audit.DCRClientMetadataReadRAT 持ちの GET on /register/{client_id}infoユースケース: 動的クライアント登録
audit.DCRClientMetadataUpdatedRAT 持ちの PUT on /register/{client_id}infoユースケース: 動的クライアント登録
audit.DCRClientDeletedRAT 持ちの DELETE on /register/{client_id}infoユースケース: 動的クライアント登録
audit.DCRRATInvalidRegistration Access Token を拒否したwarnユースケース: 動的クライアント登録
audit.DCRMetadataValidationメタデータペイロードがポリシー違反warnユースケース: 動的クライアント登録
audit.DCRCascadeRefreshRevokeFailedclient 削除時に refresh-token 行の失効に失敗alertユースケース: 動的クライアント登録
audit.DCRCascadeGrantRevokeFailedclient 削除時に grant の失効に失敗alertユースケース: 動的クライアント登録
audit.DCRCascadeAccessTokenRevokeFailedclient 削除時に JWT access-token 行の失効に失敗alertユースケース: 動的クライアント登録
audit.DCRCascadeOpaqueAccessTokenRevokeFailedclient 削除時に opaque access-token 行の失効に失敗alertユースケース: 動的クライアント登録

Device Code (RFC 8628) ​

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

event 定数発火タイミング想定シビアリティ関連ページ
audit.DeviceAuthorizationIssued/device_authorization が新しい device_code + user_code ペアを返却infoガイド: Device Code
audit.DeviceAuthorizationRejected/device_authorization がリクエストを拒否(未知 client、scope 拒否など)warnガイド: Device Code
audit.DeviceAuthorizationUnboundRejectedDPoP / mTLS の証明が必要だが /device_authorization に無かったwarnガイド: 送信者制約付きトークン
audit.DeviceCodeVerificationApproved組み込み側の verification ページがユーザの承認を報告infoユースケース: Device Code
audit.DeviceCodeVerificationDenied組み込み側の verification ページがユーザ拒否を報告(またはレコード単位の総当たり対策がロックアウト)warnユースケース: Device Code
audit.DeviceCodeUserCodeBruteForceuser_code 提出が外れた。カウンタを増やし、devicecodekit.MaxUserCodeStrikes(既定 5)でロックアウト発火alertユースケース: Device Code
audit.DeviceCodeTokenIssued承認済 device authorization に対し /token がトークンを発行infoユースケース: Device Code
audit.DeviceCodeTokenRejected/token が device-code grant を拒否(access_denied、expired_token など)warnユースケース: Device Code
audit.DeviceCodeTokenSlowDown/token が slow_down を返し、サブストア上のポーリング間隔に 5 秒を加算warnユースケース: Device Code
audit.DeviceCodeRevokedop/devicecodekit.Revoke がレコードを拒否状態に遷移させた。ヘルパは device flow が確保した grant 配下で連鎖失効させる。extras には試行した面ごとの結果(cascade_complete、revoked_access_tokens、grant_tombstone_written、revoked_opaque_access_tokens、refresh_token_cascade_complete)が入り、任意の Deps.Grants を渡した場合は grant_record_deleted も入るinfoユースケース: Device Code
audit.DeviceCodePollObservationFailedポーリングの LastPolledAt 永続化が失敗。判定自体は続行する(best-effort な観測)warnユースケース: Device Code

CIBA ​

/bc-authorize と token endpoint の CIBA grant から発火します。ciba.poll_abuse.lockout がクライアントの不正挙動を捕まえる主要シグナルです。authentication-device の approve / deny 定数は 予約 です。組み込み側が CIBARequestStore.Approve / Deny を直接呼ぶため、OP の発火点がありません。

event 定数発火タイミング想定シビアリティ関連ページ
audit.CIBAAuthorizationIssued/bc-authorize が新しい auth_req_id を返却infoガイド: CIBA
audit.CIBAAuthorizationRejected/bc-authorize がリクエストを拒否(未知ユーザ、ヒントリゾルバ失敗、scope 拒否)warnガイド: CIBA
audit.CIBAAuthorizationUnboundRejectedDPoP / mTLS の証明が必要だが /bc-authorize に無かったwarnガイド: 送信者制約付きトークン
audit.CIBAAuthDeviceApproved予約 — 組み込み側 callback が直接 Approve を呼ぶため OP は観測しないinfoユースケース: CIBA
audit.CIBAAuthDeviceDenied予約 — 組み込み側 callback が直接 Deny を呼ぶため OP は観測しないwarnユースケース: CIBA
audit.CIBAPollAbuseLockoutポーリング間隔が交渉済みの interval を大きく下回り続け、リクエストをロックアウトalertユースケース: CIBA
audit.CIBATokenIssued承認済 CIBA リクエストに対し /token がトークンを発行。引き換えは grant を記録するため、同じ scope への次回以降のリクエストは consent 画面を省略するinfoユースケース: CIBA
audit.CIBATokenRejected/token が CIBA grant を拒否(access_denied、expired_token、authorization_pending)warnユースケース: CIBA
audit.CIBATokenSlowDown/token が slow_down を返却。クライアントが交渉 interval より速くポーリングしたwarnユースケース: CIBA
audit.CIBAPollObservationFailedポーリングの LastPolledAt 永続化が失敗。判定自体は続行する(best-effort な観測)warnユースケース: CIBA

Token Exchange (RFC 8693) ​

同梱の WithTokenExchangeGrant ハンドラから発火します。requested は parse と構造検証より前の handler 入口で発火するため、構造上の拒否も含みます。成功時は requested + granted を発火します。granted と refresh_issued は発行に成功したあとにだけ記録し、発行に失敗した場合は代わりに custom_grant.failed を記録します。後段の拒否時は requested + 失敗系イベント 1 つを発火します。policy_denied / scope_inflation_blocked / audience_blocked が、SOC ダッシュボードで通常追うポリシー判定シグナルです。

event 定数発火タイミング想定シビアリティ関連ページ
audit.TokenExchangeRequested/token が RFC 8693 の試行を exchange handler に dispatch した。parse と構造検証より前infoガイド: Token Exchange
audit.TokenExchangeGrantedexchange を許可し、発行も成功した。トークンの発行後にだけ記録するinfoユースケース: トークン交換
audit.TokenExchangePolicyDenied組み込み側の TokenExchangePolicy が拒否(deny)を返却warnユースケース: トークン交換
audit.TokenExchangePolicyErrorポリシーが拒否(deny)以外のエラーを返却(一過性のインフラ障害など)warnユースケース: トークン交換
audit.TokenExchangeScopeInflationBlocked要求 scope が subject_token の scope または client 許可リストを超えたwarnユースケース: トークン交換
audit.TokenExchangeAudienceBlocked要求 audience がポリシーの許可リストの外だったwarnユースケース: トークン交換
audit.TokenExchangeTTLCapped発行 TTL を(ハンドラの希望、subject_token の残り、グローバル上限)の最小値で切り詰めたinfoユースケース: トークン交換
audit.TokenExchangeActChainTooDeepsubject_token のネストした act チェーンが 5 段の深さ上限を超えた。policy の実行前に検査するwarnユースケース: トークン交換
audit.TokenExchangeEmptyScopeRejectedscope subset を空集合に解決して拒否warnユースケース: トークン交換
audit.TokenExchangeActorEqualsSubjectactor_token が subject_token と同じ subject に解決。exchange は invalid_request で拒否infoユースケース: トークン交換
audit.TokenExchangeSubjectTokenExternalsubject_token がローカルレジストリで解決できず、外部発行の opaque トークンとして扱ったinfoユースケース: トークン交換
audit.TokenExchangeActorTokenExternalactor_token がローカルレジストリで解決できず、外部発行の opaque トークンとして扱ったinfoユースケース: トークン交換
audit.TokenExchangeSubjectTokenInvalidsubject_token の検証に失敗(signature / TTL / cnf 不一致)warnユースケース: トークン交換
audit.TokenExchangeSubjectTokenRegistryErrorレジストリの参照(lookup)が NotFound 以外の障害を観測。通信路上の応答は invalid_grant のままalertユースケース: トークン交換
audit.TokenExchangeRefreshIssuedexchange が refresh 発行を明示し(IssueRefreshToken=op.PtrBool(true))、refresh token を発行したinfoユースケース: トークン交換
audit.TokenExchangeSelfExchangeactor_token なしで、subject_token の発行先が呼び出し client 自身(self-exchange。act claim は付かない)infoユースケース: トークン交換
audit.TokenExchangeIDJAGIssued(token_exchange.idjag_issued)ID-JAG の token exchange に対して ID-JAG を発行した。応答の書き込み後に 1 回記録する。extras は audience、aud_client_id、granted_scope、resource、ttl_seconds、ID-JAG の jtiinfoユースケース: トークン交換

JWT bearer grant (RFC 7523) ​

/token の urn:ietf:params:oauth:grant-type:jwt-bearer grant から、plain と ID-JAG の両プロファイルで発火します。拒否の reason は、失敗した検証ステージ(parse、issuer、typ、signature、claims、idjag、replay)か、token endpoint 側の検査(たとえば public_client、missing_assertion、client_not_allowed、scope、resource、binding、unknown_subject、key_source_unavailable、verifier_fault)です。

event 定数発火タイミング想定シビアリティ関連ページ
audit.JWTBearerGranted(jwt_bearer.granted)assertion を償還してアクセストークンを発行した。extras は assertion の issuer と profile、actor は解決した subjectinfoユースケース: トークン交換
audit.JWTBearerRejected(jwt_bearer.rejected)償還を拒否した。extras は reason、assertion の iss を読んだあとなら issuer も含むinfoユースケース: トークン交換

カスタム grant ​

dispatcher は登録済みの custom handler に到達したすべての dispatch 試行について、成功と handler を呼ぶ前の gate 失敗を含め、入口で custom_grant.requested を発火します。未登録の grant_type は custom-grant dispatch の入口に到達する前に返るため、custom-grant の監査イベントは発火しません。失敗時は 1 つの失敗出口から custom_grant.failed を 1 回発火します。handler の panic は recover され、panic の情報を extras に含む同じ失敗イベント 1 回になります。

イベント意味レベル参照
audit.CustomGrantRequested (custom_grant.requested)登録済み custom handler に到達したすべての dispatch 試行(handler 前の gate 失敗も含む)infoユースケース: カスタム grant
audit.CustomGrantFailed (custom_grant.failed)custom grant の dispatch または handler が失敗した。panic を recover した場合も、試行ごとに 1 回だけ発火しますwarnユースケース: カスタム grant
audit.CustomGrantRefreshDropped (custom_grant.refresh_dropped)ハンドラが IssueRefreshToken でリフレッシュトークン発行を求めたが、クライアントが refresh_token grant に登録されていない。アクセストークン応答自体は成功するinfoユースケース: カスタム grant

Grant management ​

OAuth 2.0 Grant Management endpoint のイベントです。認証済み revoke request の grant cascade が完了しないときは failure シグナルが発火します。

イベント定数発火タイミングseverity の目安リンク先
audit.GrantManagementRevokedgrant management エンドポイントへの DELETE が grant を失効させ、トークンをカスケードしたinfoユースケース: Grant management
audit.GrantManagementRevokeFailedDELETE の認証後、grant の失効副作用が失敗したalertユースケース: Grant management

Shared Signals ​

op.WithSharedSignals で有効にした Shared Signals transmitter から発火するイベントです(Shared Signals を参照)。いずれも metrics は更新しません。配送系のイベントは extras に stream_id、jti、kind、event_type を持ちます。

イベント定数発火タイミングseverity の目安リンク先
audit.SSFStreamCreated(ssf.stream.created)Receiver が stream を作成したinfo運用: Shared Signals
audit.SSFStreamUpdated(ssf.stream.updated)Receiver が stream を更新・置換した、または status を変更したinfo運用: Shared Signals
audit.SSFStreamDeleted(ssf.stream.deleted)Receiver が stream を削除した。キューに残っていたイベントはすべて破棄されるinfo運用: Shared Signals
audit.SSFSETEnqueued(ssf.set.enqueued)Security Event Token を stream のキューに入れた。extras は stream_id、jti、event_type、delivery、heldinfo運用: Shared Signals
audit.SSFEnqueueFailed(ssf.enqueue_failed)イベントを Receiver のキューに入れられなかった。イベントの発生元の操作(ログアウトや RevokeSubject)は失敗させない。extras["reason"] が原因を示し、fanout_capacity は subject の Receiver 数が 1 回のファンアウトで読める上限を超えたことを表すalert運用: Shared Signals
audit.SSFPushDelivered(ssf.push_delivered)Receiver が push した SET を 202 で受理したinfo運用: Shared Signals
audit.SSFPushRejected(ssf.push_rejected)Receiver が push した SET に 400 を返した。再送せずに破棄する。Receiver がエラーコードを返したときは extras["err"] に入るwarn運用: Shared Signals
audit.SSFPushRetried(ssf.push_retried)push が一時的に失敗し(5xx、429、ネットワーク)、再送を予約した。extras は attempts と next_attempt_atwarn運用: Shared Signals
audit.SSFPushAbandoned(ssf.push_abandoned)最後の再送でも届かず SET を破棄した、または stream の authorization header を復号できなくなった(extras["reason"] = "seal")alert運用: Shared Signals
audit.SSFPollSETError(ssf.poll_set_error)poll の Receiver が処理できなかった SET を報告した(RFC 8936 の setErrs)。その SET は破棄する。extras は err と descriptionwarn運用: Shared Signals

安定性 ​

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

  • 新しいイベントは、マイナーリリースで追加され得ます。
  • 既存のイベント名は、メジャーリリースで deprecation notice 付きでしか改名されません。
  • godoc で Experimental と記されたイベント(audit.TokenExchangeIDJAGIssued と audit.CIMD*)は、追跡している IETF ドラフトに従い、マイナーリリースで変わる場合があります。

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

このリストの裏取り ​

sh
git clone https://github.com/libraz/go-oidc-provider.git
cd go-oidc-provider
audit_catalog_tmp=$(mktemp ./audit-catalog-XXXXXX.go)
trap 'rm -f "$audit_catalog_tmp"' EXIT
cat >"$audit_catalog_tmp" <<'EOF'
package main

import (
  "fmt"
  "github.com/libraz/go-oidc-provider/op/audit"
)

func main() {
  for _, def := range audit.Catalog() {
    fmt.Println(def.Event)
  }
}
EOF
go run "$audit_catalog_tmp"

公開 API audit.Catalog() を呼び出し、このページがミラーしている閉じたカタログを出力します。