本卡屬 FR-187(母卡 CM-3711),第 3 批 E:系統日誌線上查詢與日誌分租戶(主系統 repo
compliance-manager-be,12 檔/約 1110 行)。只掃不修。工作坊會用.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描,小弟不必自己打指令。
用 Claude Code 官方 claude-security plugin 掃「系統日誌線上查詢與日誌分租戶」這一塊,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題,修是另外開卡的事。
FR-178 讓維運人員在畫面上查完整的系統日誌(主系統+Agent 兩邊),同時把日誌表分租戶、開資料庫隔離。這一棒看查詢端點、誰看得到哪些列、日誌裡的祕密有沒有遮。
日誌裡什麼都有:帳號、請求路徑、錯誤內容,有時還有沒遮乾淨的 token。分租戶判斷錯一點,子公司就看得到整台機器的日誌;遮罩漏一欄,能看日誌的人就拿到別人的登入權杖。
背景:這一輪掃的是 2026-11-01(FR-172 開案)到 11-09 之間主專案與 jedi-remote-agent 新寫或大改的程式(FR-171/172/178/179/180/181/182),這些程式都沒掃過。
api/support/routes/system_log_route.py
api/support/serializers/system_log.py
app/support/service/system_log_query_app_service.py
api/support/routes/agent_log_route.py
app/support/service/agent_log_query_app_service.py
common/authz/log_viewer.py
infra/support/diag_db_reader.py
scripts/sql/2026-11-06-fr178-log-tables-rls.sql
scripts/sql/2026-11-06-fr178-log-tables-tenant.sql
scripts/sql/2026-11-06-fr178-log-partitions-revoke-direct.sql
scripts/sql/2026-11-06-fr178-log-caps-tenant-grantable.sql
scripts/sql/2026-11-08-fr178-support-route-own-capability.sql
檔數 12、約 1110 行。驗檔數:git -C <工作目錄> ls-files -- api/support/routes/system_log_route.py api/support/serializers/system_log.py app/support/service/system_log_query_app_service.py api/support/routes/agent_log_route.py app/support/service/agent_log_query_app_service.py common/authz/log_viewer.py infra/support/diag_db_reader.py scripts/sql/2026-11-06-fr178-log-tables-rls.sql scripts/sql/2026-11-06-fr178-log-tables-tenant.sql scripts/sql/2026-11-06-fr178-log-partitions-revoke-direct.sql scripts/sql/2026-11-06-fr178-log-caps-tenant-grantable.sql scripts/sql/2026-11-08-fr178-support-route-own-capability.sql | wc -l 應為 12。scope 外的檔不要讀,除非下面「重點看什麼」明寫「只追這幾行」;越界的發現首腦驗收時會挑掉。
首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單,行號以 2026-11-09 的主線為準,對不上就以內容為準。工具不會照這份走,掃完後你要自己逐條對一遍:工具沒報的,開檔看一眼,寫「人工查過:成立/不成立/為什麼」。
common/authz/log_viewer.py:28-40 is_first_level_tenant_on_host 用 allowed_tenant_paths 的段數判斷「第一層」、而且是 any:同一個人同時掛在子公司與總部某單位時,會不會看到整機(root)日誌。revoke-direct 那支在擋這件事;確認每月新長出來的分區也會被 revoke 與開 RLS,不是只處理建立當下那幾個。fr178-log-caps-tenant-grantable.sql、fr178-support-route-own-capability.sql:哪些日誌能力點被設成子租戶可以授予——跟上一點合起來看。diag_db_reader.py:287-330 _system_log_where:keyword 已轉義 LIKE;查詢用 f-string 組 WHERE {where_sql},確認片段全是常數、值全走參數。system_log_route.py:50 從 pager 取 page_size,有沒有上限;大 offset 會不會拖垮資料庫。diag_slice_domain_service.py:310-320 只遮 message(不在 scope,只追這段);path 欄(可能含帶 token 的查詢字串)、user_name 有沒有遮;CSV 匯出的公式注入(excel_safe)。agent_log_route.py+agent_log_query_app_service.py:agent_uid 由使用者給,verify_remote_agent_is_exist 是在使用者的 RLS 下查;Agent 回來的日誌內容原樣回畫面。FR-077(2026-09)掃過 jedi-remote-agent 與主系統接線的舊版,FR-086 掃過檔案上傳下載,FR-177(2026-11-05~07)掃過 Agent 本體;結論在主系統 repo docs/features/security-scan-consolidated/README.md,只是參照,沒有經過本棒的三人投票。