監査ログは、ロールの割り当て、エンジンの編集、APIキーの発行、請求内容の変更など、組織内のあらゆる状態変更アクションを記録し、検索・絞り込み可能なタイムラインとして表示します。Roles & Permissions とあわせて Enterprise プランで利用できます。
このログはデータベースレベルで追記専用になっています。アプリケーションの接続では、監査ログの行を更新・削除・truncate できません。一度書き込まれた内容は、そのまま残ります。
記録される内容#
各イベントには、実行者、アクション、対象、そしてリクエストが HTTP で到達した際のコンテキストが記録されます。
| 項目 | 補足 |
|---|---|
| 実行者 | アクションを実行したユーザー、または API key |
| アクション | engine.created や member.role_changed のような型付きの値 |
| 対象 | 変更対象となったエンティティ(例: エンジン、ロール、用語集項目) |
| メタデータ | 関連エンティティの ID のみを保存し、名前・メールアドレス・コンテンツ断片は保存しません |
| リクエストコンテキスト | request_id、IPアドレス、ユーザーエージェント — HTTP 経由で受信した時点の情報を記録します |
| タイムスタンプ | UTC に加え、欠落検知のための単調増加シーケンス番号を記録します |
設計上、保存するのは ID のみ
metadata カラムには、人が読める値ではなく ID だけを保存します。UI は表示時に現在の名前を結合するため、エンジン名やユーザー名を変更しても履歴が書き換わることはありません。また、監査ログの行を GDPR の削除権との衝突から切り離せます。要するに、秘匿化すべきコンテンツ自体を持たないためです。
対象アクション#
イベントは、ダッシュボードのフィルターに対応したカテゴリごとにグループ化されています。
| カテゴリ | 現在対応しているアクション |
|---|---|
| 組織 | org.created、org.settings_updated、org.ownership_transferred、org.deleted |
| メンバー | member.invited、member.removed、member.role_changed |
| ロール | role.created、role.updated、role.deleted |
| エンジン | engine.created、engine.updated、engine.deleted |
| API keys | api_key.created、api_key.revoked |
| コンテンツ | glossary_item.*、instruction.*、brand_voice.*(単一操作のみ) |
ログへのアクセス#
組織でこの権利が有効になっている場合にのみ、Organization サイドバーに Audit logs が表示されます。ページ内では、次の機能を利用できます。
- 絞り込み可能な一覧 — 実行者、アクションカテゴリ、対象タイプ、日付範囲で絞り込めます。未来日付は指定できず、終了日は常に開始日以上になります。
- 無限スクロール — 新しいイベントから順に表示され、スクロールに合わせて過去のイベントを読み込みます。
- 詳細シート — 任意の行をクリックすると、完全なメタデータ、リクエスト ID、IP、ユーザーエージェントを確認できます。
- 更新 — フィルター条件を保持したまま最新のイベントを取得します。フィルター状態と開いているイベントは URL に反映されるため、どの表示状態でも共有できます。
閲覧できるユーザー#
このページへのアクセスは、次の 2 つの条件で制御されます。
- 権利 — 監査ログ機能がその組織で有効になっている必要があります(Enterprise プラン)。
- 権限 — 閲覧者の role に
org:view_audit_logsが含まれている必要があります。あらかじめ用意されている Full Access ロールにはデフォルトで含まれており、Owner は常にこの権限を持ちます。
この権限を持たないメンバーには、タイムラインの代わりに「アクセスなし」ページが表示されます。権利のない組織のメンバーには、ペイウォールが表示されます。
Enterprise プランが失効した場合
監査ログは、同じ RBAC ティアの権利に含まれています。過去のイベントはデータベースに残りますが、ページは非表示になり、読み取りエンドポイントはプランが復旧するまで 403 を返します。
改ざんの痕跡#
監査ログは単なる記録ではありません。あとから書き換えることが、現実的にかなり難しい設計になっています。
- データベースレベルで追記専用。 テーブルを作成するマイグレーションでは、API ロールに対して
REVOKE UPDATE, DELETE, TRUNCATEを実行します。今後どのようなコードパスであっても — バグ、新しいエンドポイント、SQL インジェクションであっても — 行を変更する前に Postgres によって拒否されます。 - 単調増加シーケンス。 すべての行には、厳密に増加する
seqカラムが付与されます。監査担当者はこのシーケンスを確認することで、欠番として削除を検出できます。
これは SOC 2 で想定されるような統制には十分です。ただし、本番データベースへの直接アクセス資格情報を持つ攻撃者までは防げません。より強固な構成(分離されたオーナーロール、WORM ミラー)については、ご要望に応じて提供可能です。
保持期間#
監査イベントは、デフォルトで無期限に保持されます。カスタム保持期間 — 通常は 1 年、3 年、7 年 — は Enterprise で利用できます。コンプライアンス対応やセキュリティ質問票のために特定の保持ポリシーが必要な場合は、ご相談ください。
対象外の内容#
v1 では、意図的にいくつかの制約があります。
- ベストエフォートでの記録であり、トランザクションではありません。 トランザクション内での記録は短期ロードマップに入っています。監査イベントは、対象となるアクションの実行後に書き込まれ、同じデータベーストランザクション内では処理されません。まれな障害時には(アクションは成功したが、その後の監査ログ挿入に失敗した場合)、対応するイベントなしでアクションだけが実行される可能性があります。
- まだ対応していないアクションタイプがあります。 エンジンメンバーシップの変更、インテグレーションの connect / update / disconnect、model-config の編集、請求サブスクリプションの変更、一括コンテンツ操作(CSV アップロード、
createMany/updateMany/deleteMany)では、まだイベントは生成されません。アクション語彙は予約済みのため、対応後は既存のフィルターカテゴリに表示されます。 - 読み取り操作は監査対象外です。 監査ログ自体の閲覧、エンジンのリクエストログの閲覧、用語集のダウンロードではイベントは生成されません。対象となるのは状態変更アクションのみです。
- エクスポート機能はまだありません。 監査データはダッシュボード上で確認できます。CSV エクスポート、SIEM webhook、S3 ミラーはロードマップに含まれています。必要であればお知らせください。
- エンジン単位のビューはありません。 組織内のすべての監査イベントは、単一のタイムラインに表示されます。対象タイプまたは対象 ID で絞り込むことで範囲を限定できます。
- ライブ tail はありません。 一覧は必要に応じて、または 更新 をクリックしたときに更新されます。WebSocket ストリームはありません。
