Skip to content

查詢 audit log

何時用這份文件 你要回答:

  • 「過去 X 時間,有人對 Y 做了什麼?」
  • 「Z 帳號最近的活動軌跡」
  • 「某事故的時間軸」
  • 月度 / 季度合規報表

前置條件

  • 你的角色擁有 bb.auditLog.read
  • 已讀過 Audit Log 概念 的欄位定義與動作清單

三種查詢方式

方式適合限制
UI探索式查、單一事件追蹤一次最多回 1000 筆;不適合大量分析
API(REST/gRPC)程式化、自動化報表filter 語法需學一下
直連 metastore SQL大量分析、ad-hoc 統計繞過 UI 權限;極少人應有此權限

UI 操作

Audit Log(左側 sidebar)。

可篩選:

  • Time range:絕對 / 相對(最近 24h、7d、30d…)
  • Actor:user / system runner
  • Action:多選(bb.issue.approve / bb.taskrun.start / …)
  • Resource type / resourceprojects/<p>/issues/<i>
  • Severityinfo / notice / warning / critical
  • Response statusok / denied / error
  • Correlation ID:追同一個請求的所有 entry

常用視角

  • 某個 issue 的時間軸 → 篩 resource = projects/<p>/issues/<i>,依時間排
  • 某 user 過去 7 天動作 → 篩 actor = user/login_id=<id>,期間 7d
  • 登入失敗潮 → 篩 action = bb.auth.login.fail,依 actor / IP 分組

API 操作

bash
# 基本範例
curl -s -H "Authorization: Bearer $TOKEN" \
  "$ARGUS/v1/auditLogs?filter=resource:projects/play/issues/42" | jq

# 多條件 AND
curl -s -H "Authorization: Bearer $TOKEN" \
  "$ARGUS/v1/auditLogs?filter=actor:alice%20AND%20action:bb.issue.approve" | jq

# 時間範圍
curl -s -H "Authorization: Bearer $TOKEN" \
  "$ARGUS/v1/auditLogs?filter=timestamp%3E%3D2026-05-01T00:00:00Z%20AND%20timestamp%3C2026-06-01T00:00:00Z" | jq

filter 完整語法

運算語法
等於field:valueactor:alice
大於field>valuetimestamp>2026-05-01T00:00:00Z
小於等於field<=valueseverity<=warning
AND... AND ...actor:alice AND action:bb.issue.approve
OR... OR ...action:bb.issue.reject OR action:bb.issue.cancel
萬用field:prefix*resource:projects/play/*

可篩欄位:timestamp / actor / actor_ip / action / resource / resource_type / severity / response_status / correlation_id

常見場景模板

1. 「過去 30 天,所有 prod DDL 是誰批的?」

bash
filter='resource:projects/*/issues/*
        AND action:bb.issue.approve
        AND timestamp>=2026-04-23T00:00:00Z
        AND extra.environment:prod
        AND extra.change_type:DDL'

2. 「某 user 上週活動」

bash
filter='actor:user/login_id=alice
        AND timestamp>=2026-05-16T00:00:00Z
        AND timestamp<2026-05-23T00:00:00Z'

3. 「登入失敗集中現象」

bash
filter='action:bb.auth.login.fail
        AND timestamp>=2026-05-22T00:00:00Z'

回傳後用 jqactor_ip 分組:

bash
... | jq -r '.auditLogs[] | .actorIp' | sort | uniq -c | sort -rn

4. 「上週所有審批者 reject 的單」

bash
filter='action:bb.issue.reject
        AND timestamp>=2026-05-16T00:00:00Z
        AND timestamp<2026-05-23T00:00:00Z'

5. 「Setting 被誰改過」

bash
filter='action:bb.setting.update
        AND timestamp>=2026-04-01T00:00:00Z'

特別注意 severity = critical 的 setting 變動:EMERGENCY_PAUSE 切換、disallow_self_approval_default 改動。

6. 「override 紀錄」

bash
filter='extra.override_reason:*
        AND timestamp>=2026-04-01T00:00:00Z'

7. 「同一個請求的完整鏈路」

bash
filter='correlation_id:req-2026-05-23-09-42-...'

回傳會是同一個 HTTP / RPC 請求引發的所有 audit entry(含子動作)。

8. 「SQL Editor 違規查詢」(A2 PR-1 後可用)

A2 PR-1 起,Argus 對互動 SQL(Query / AdminExecute / Export)跑跟 Plan 流程同一套 advisor 規則庫。違規會寫入 audit_log 一條 RULE_VIOLATION 事件:

bash
filter='method=/argus.v1.SQLService/AdvisorViolation
        AND timestamp>=2026-06-01T00:00:00Z'

只看 ERROR 嚴重度(必須處理的):

bash
filter='method=/argus.v1.SQLService/AdvisorViolation
        AND severity=ERROR
        AND timestamp>=2026-06-01T00:00:00Z'

回傳的每筆 row 的 service_data 是一個 packed AuditDetailAdvisorViolation

jsonc
{
  "queryPath": "query",                           // query / admin_execute / export
  "instance": "smoke-m2",
  "database": "app",
  "statementRedacted": "SELECT * FROM users WHERE 1=1",
  "violations": [
    { "title": "STATEMENT_SELECT_NO_SELECT_ALL", "status": "ERROR",
      "content": "\"SELECT * FROM users WHERE 1=1\" uses SELECT all" },
    { "title": "STATEMENT_OBJECT_OWNER_CHECK", "status": "ERROR",
      "content": "..." },
    { "title": "STATEMENT_CHECK_SET_ROLE_VARIABLE", "status": "WARNING",
      "content": "No SET ROLE statement found." }
  ]
}

SQL 字面已 redact(PII / 密文不會留在 audit log,跟 query_history 同政策)。actor 在 row 的 user 欄位。

常見追問:

想問怎麼篩
「alice 上週踩了哪些規則」method=/argus.v1.SQLService/AdvisorViolation AND user=users/alice
STATEMENT_SELECT_NO_SELECT_ALL 上個月 fleet 共幾次」UI 拿出全部 AdvisorViolation rows 後在 service_data.violations[] 統計
「Export path 上的違規(資料外流前的合規 hot zone)」篩後再看 service_data.queryPath = "export" 的子集

同樣資料也存在 query_history.payload.rule_violations[],但 audit_log 是「跨 user 跨 project」的單一查詢入口;query_history 是「我自己跑過的」視角。詳見 SQL Editor 概念

直連 metastore SQL

⚠️ 繞過 UI 權限。只有極少數人(DBA Lead)應有此存取,且此存取本身會在 PG-level audit 留痕(9006##audit_rls_and_roles.sql)。

sql
SET search_path TO public;

-- 過去 7 天 prod 上的所有 DDL 審批
SELECT
  ts AS timestamp,
  actor,
  resource,
  payload->>'message' AS message
FROM audit_log
WHERE ts >= now() - interval '7 days'
  AND action = 'bb.issue.approve'
  AND payload->>'environment' = 'prod'
  AND payload->>'change_type' = 'DDL'
ORDER BY ts DESC;

實際表名與欄位以 LATEST.sql 為準(Migration)。

寫進 audit log 的「查詢動作」

對 audit log 的查詢與匯出本身會被記錄:

  • bb.auditlog.query(含 filter 條件、回傳筆數)
  • bb.auditlog.export(含 filter 與輸出檔 hash)

換句話說,「誰查了 audit log」這件事 在 audit log 裡。

相關

Argus — 公司內部資料庫變更審計平台