本卡屬 FR-166(母卡 CM-3109 延伸),批 1,evidence-agent repo。決策者 2026-10-28 逐項拍板。
白話
一、AD 登入:現在 AD 驗不過會偷偷改用離線密碼驗,且跟離線密碼一樣受離線天數限制。改成選 AD 就只問 AD,AD 不通或密碼錯就失敗;不受離線天數限制。仍要在離線操作者名單上(AD 只證明你是誰,能做什麼看主系統授權),授權到期、撤銷照擋;Agent 從沒同步過(沒名單)時不能用 AD 登入。
二、離線密碼規則跟主系統一致:至少 12 碼,含大寫、小寫、數字(jedi-iam PasswordPolicy 預設);現在 Agent 只驗長度。本機管理員密碼同規則。
三、離線天數到期時,已登入的離線操作者要被踢出(現在只在登入當下檢查)。先寫測試確認現況,再修。本機管理員不受影響。
四、主控台本機開關「關閉離線登入」:關了以後離線操作者(AD 與離線密碼都算)一律不能登入,主系統設幾天都一樣;只能收緊、主系統遠端打不開;本機管理員不受影響。有 configure 範圍就能切。每次切換寫稽核。
怎麼做
- 【extend】core/console/local_auth.py:verify 加參數 method(ldap|password,前端登入時帶);ldap 只走 ldap_source.login_check,不退回 check_password;password 只走本機雜湊。_operator_usable 拆成「名單/授權」與「離線天數+本機開關」兩段,ldap 只檢第一段。舊前端沒帶 method → 當 password(較嚴)。
- 【extend】core/console/local_auth_routes.py 登入端點收 method;PASSWORD_POLICY 錯誤碼沿用。
- 【extend】core/local_credentials.py validate_password:加大寫/小寫/數字檢查(與 jedi-iam validate_password_policy 同規則;Agent 不依賴 jedi-iam,照抄規則並在註解寫明以主系統為準)。
- 【extend】到期踢人:require_session 取 session 時,若 session 是離線操作者(非 local-admin、非主系統票登入),以密碼登入且 offline_login_disabled() 或本機開關關閉 → 撤銷並回 401 AGENT_CONSOLE_SESSION_REQUIRED。AD 登入的 session 只檢名單與開關。session 需記 login method。
- 【new】本機開關:core/offline_login_window.py 擴充 local_disabled()/set_local_disabled(bool, actor)(另存同目錄檔,不與主系統天數混在一起);端點 GET/PUT /console/api/ops/offline-login(require_session('configure'));稽核 offline_login_local_set(只留本機,不在 REPORTED_ACTIONS 也可,但建議加進去並同步 BE sink 白名單與事件碼——如加,BE 要另開卡,本卡只回寫建議)。/console/state 多回 offline_login_local_disabled。
- re-enroll 清本機狀態時不清本機開關(那是這台機器的決定,不屬於哪個主系統)。
驗證
- 新測試:AD 不退回離線密碼;AD 不受天數限制但受名單/撤銷/未同步限制;密碼規則四種缺項各回 policy;到期後既有 session 下一個請求 401、local-admin 不受影響;本機開關關閉後兩種離線登入都失敗、local-admin 仍可。突變各拿掉一處要紅。全套 pytest。
紀律
- 要寫任何新函式/元件/composable/service 方法之前,第一步不是寫,是查:按行為 grep 真實程式碼,再查 docs/claude/domain-capabilities.md 與 FE frontend-overview.md §4。三擇一、預設不新增:reuse → extend → 確認沒有才新增。回寫列出 reuse 了哪些、新增了哪些、為什麼不能 reuse。
- BE 動到 api/app/infra 時 .claude/rules/security/ 自動載入,照著做;FE 規則在 FE repo .claude/rules/security/frontend.md,跨 repo 改 FE 不會自動載入,動手前自己讀。回寫列出本卡對到哪幾條、怎麼滿足。
- 不做義大利麵式程式:「怎麼做」每項已標 reuse/extend/new。extend 就改既有那支,不另開一支;紅旗:複製一段改兩行、開 XxxV2、同一行為兩條路徑。
- 檔案內註解只寫「為什麼」與「陷阱」(一到兩行),做了什麼進 commit message。