3. 直接進門與登入
3.1 現況的門怎麼開、哪裡斷
FR-157 D1 裁「Agent 不開登入表單」,前提是主系統一定連得到。本案的前提剛好相反:主系統連不到是常態之一。FR-157 的三條路在離線時:
所以「離線登入」要新開一條路,而這條路的核心問題不是表單怎麼畫,是 Agent 離線時憑什麼認得你。
3.2 業界常見的五種模式(D1)
還有兩個常被問到的,本稿先排除:硬體金鑰/客戶端憑證(瀏覽器匯入憑證才能進——落地版客戶會抱怨麻煩,且撤銷要管 CRL)、Agent 自己接 OIDC 到雲端 IdP(離線時一樣斷,等於 A)。
多因子(TOTP 驗證碼 App):B/C/D 都能疊。業界獨立管理台(Nessus、pfSense)多半有,但要客戶每個人裝驗證器 App。本稿建議列第二期選配,不綁第一版。
3.3 定案:三層身分(D1 已裁)
決策者點出的關鍵:「主系統沒先給、根本沒設過」100% 會發生。這種情境下 Agent 只有兩種選擇——只認安裝時設的那組密碼,或自己放寬讓任何主系統帳號試(離線時驗不了主系統密碼,等於讓人猜,就是跳板的開端)。沒有第三條路;業界所有有管理頁的設備(Nessus scanner、FortiGate、UniFi)都走第一種。所以登入分三層,從「最後保障」到「日常」:
救援:機上 sudo guidant-agent-ctl console-login 一次性網址(現況已有),給「本機管理員密碼也忘了」的情況。忘密碼的恢復路徑是「有機器 sudo 權限的人」,與所有設備忘密碼要接 console 口同理。
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB','actorBkg':'#E2F0F1','actorTextColor':'#14201F','actorBorder':'#0E7C86','actorLineColor':'#C7D1D2','signalColor':'#4A5A5C','signalTextColor':'#14201F','labelBoxBkgColor':'#EEF2F3','labelBoxBorderColor':'#C7D1D2','labelTextColor':'#14201F','loopTextColor':'#14201F','noteBkgColor':'#F6EBD5','noteTextColor':'#14201F','noteBorderColor':'#9C6B12','activationBkgColor':'#EEF2F3','activationBorderColor':'#C7D1D2','sequenceNumberColor':'#FFFFFF'}}}%%
sequenceDiagram
participant I as 安裝者
participant U as 使用者瀏覽器
participant M as 主系統
participant AG as Agent 8444
Note over I,AG: 安裝時
I->>AG: install.sh 強制設 local-admin 密碼(只存雜湊)
Note over M,AG: 在線時(平常)
M->>AG: 心跳回應帶「離線操作者名單」:誰、範圍、到期日(沒有主系統密碼)
U->>M: Agent 管理頁按「開啟主控台」
M-->>U: 五分鐘入場券
U->>AG: 帶票進門
AG-->>U: 發 session;在名單且未設離線密碼 → 提示設定
U->>AG: 設離線密碼(只存雜湊)
Note over U,AG: 離線時
U->>AG: 直接打 https://agent:8444/console
AG-->>U: 登入頁(橫幅:主系統連線中斷)
U->>AG: 主系統帳號+離線密碼,或 local-admin+管理員密碼
AG->>AG: 名單內?未到期?密碼對?沒被鎖?(local-admin 只驗後兩項)
AG-->>U: 發 session;掃描範圍仍照清冊,未同步只准診斷
Note over U,AG: 什麼都不行時
U->>AG: 機上 sudo console-login 印一次性網址
圖 1 — 三層登入:在線走跳轉(順手設離線密碼),離線用離線密碼或本機管理員,什麼都不行用救援碼
設計點:
- 名單由主系統下發,Agent 只做快取,名單只有帳號、顯示名、範圍、到期日,沒有主系統密碼雜湊。Agent 端沒有任何「新增使用者」功能,①只有一個固定帳號——Agent 永遠不會長出主系統看不見的身分。
- 離線密碼是另一組:主系統密碼雜湊不該離開主系統(FR-157 的動機);一人授權多台各設一組可接受(與 FR-157 D9 同理);在線跳轉進任一台都能重設該台密碼。
- 登入頁版面照主系統
Login.vue(左 44% 表單、右品牌面板、底線式分頁),改 Agent 模式:分頁依連線狀態變——在線=主系統登入(首選,跳回主系統驗證)/AD/離線密碼;離線=AD/離線密碼/本機管理員;未同步=只有本機管理員可按。右面板主角是「這台 Agent 卡」(名稱、IP、版本、角色、連線狀態)加一句狀態提示,不放 hero 標語;拿掉記住我、忘記密碼、captcha。FE console 的 Login.vue 直接從主站複製版面與樣式再刪分流邏輯。
- 主控台殼改左側邊選單,結構照主系統、身分靠四個訊號分(決策者 2026-10-26 裁:「結構一樣、身分明顯不一樣」)。FR-157 的頂部 TabView 在三頁時合理,七頁不夠放。側欄 14rem、頂欄 4rem、麵包屑、側欄底部使用者區,照主站
AppSidebar/AppTopbar 複製版面(console 不載 router 與 Pinia,選單項寫死在 console 自己的清單)。分組:總覽/作業(掃描工具、網路除錯、執行紀錄)/設定(檢測工具、身分來源、檔案)/維運(服務與重啟);未同步時作業與設定項反灰。四個環境訊號:①側欄用主站現成的 teal 主題色(--menu-bg: #00695C),主站側欄跟亮暗走、Agent 固定 teal;②側欄頂「AGENT」字樣+這台的名稱與狀態點(主站同位置是租戶/專案);③內容區頂部常駐狀態列「AGENT · 高雄機房 Agent-01 · 主系統連線正常/中斷/未同步」,不是只有異常才出現;④瀏覽器分頁標題「Guidant AI Agent · 高雄機房 Agent-01」加 favicon 角標。同一套產品的 prod/staging 就是這樣分,不靠版面不同辨識。
- 總覽=dashboard,不另開 Dashboard 頁:要處理的事放最上面(主系統連線、待回傳積壓、磁碟低於門檻、清冊過舊、帳密儲存損壞、有掃描被拒絕),其他正常收成一行;網路一行四個點(網卡、閘道、DNS、主系統);正在執行;最近五筆;這台的靜態資訊放最下。主系統端 Agent 清單本身就是跨台 dashboard,不另做「Agent 總覽儀表板」;跨據點統計圖列第二期報表。
- 「沒設過」不能是靜默狀態:主系統 Agent 清單對「離線操作者 0 位」顯示紅字警示;安裝完成畫面與手冊要求把 local-admin 密碼交給現場負責人保管。
- local-admin 不是萬能帳號:它只過門 1;門 2(清冊)與門 3(工具清單)不看身分(§6.1)。攻擊者拿到 local-admin 能做的是對清冊內已授權設備跑既有工具,不能掃任意 IP、不能下指令;未同步過的 Agent 連掃描都跑不了。
D1 離線登入模式(已裁 2026-10-26)
三層:安裝時強制設的本機管理員 local-admin(永不過期、不受離線停用、仍過清冊)+主系統授權的離線操作者(C 模式,日常)+入場券跳轉(在線首選);救援碼保留。LDAP/AD 列第二期選配;純本機多帳號不做;多因子第二期。
D2 有效期、鎖定與離線停用(已裁 2026-10-26)
離線操作者授權預設 90 天、可選 30/180/不限;離線超過 30 天(最後一次心跳成功起算)離線操作者登入與獨立掃描一併停用(清冊可能早過期),只剩 local-admin 可登、只准網路除錯與主系統連線診斷;主系統派的任務若復線後才領到照常跑。登入失敗 5 次鎖 15 分鐘並寫稽核;密碼最短 12 碼;local-admin 永不過期。
3.4 登入後能做什麼:在線、離線、未同步三種狀態
「未同步」=這台 Agent 從未收過授權清冊或離線操作者名單(剛裝好還沒註冊、或註冊後第一次心跳還沒成功)。決策者裁:未同步就預設沒完成設定,拒絕用工具,只准 local-admin 登進來查連線(D12)。
D12 未同步狀態(已裁 2026-10-26)
沒收過清冊或名單=未完成設定:只有 local-admin 能登,只准主系統連線診斷,畫面寫「尚未完成與主系統的同步,請先連上主系統」。這是防跳板的核心——沒被主系統認可的 Agent 不管誰登入都掃不了任何東西。
3.5 第四層:接客戶 AD/LDAP(D17、D18、D19 已裁)
決策者判斷老闆會要。實查現況與缺漏在 §13.8;這裡講設計。
三選一(各區可能不同 AD——總部一個網域、新加坡子公司自己的、日本點用 Google Workspace 沒有 AD)。主控台「檢測工具」旁同形狀多一張「身分來源」卡:
守住的點:LDAP 只取代「密碼怎麼驗」那一步,不決定「誰能登」——名單仍是主系統下發的離線操作者;名單內的人可選用 AD 密碼登 Agent、不必另設離線密碼;名單不在、AD 密碼對也不給進。AD 也連不到時退回離線密碼或 local-admin,登入頁一個帳號欄,Agent 自己判斷。
憑證(D18):客戶多半沒有 CA 憑證可貼,「驗證憑證」勾選框是工程師思維。改成 首次信任、之後釘住(SSH known_hosts 模式,專案 SSH 連線已是 RejectPolicy+known_hosts):第一次連自動記下伺服器憑證指紋、畫面顯示「已信任 xxx 的憑證(到期 2027-03)」;之後指紋變了就擋並紅字「伺服器憑證變了,若非你們更換憑證請聯絡網管」,管理員按「重新信任」才放行。拿掉勾選框,只留「貼上 CA」當進階選項。加密方式預設 STARTTLS,連不上自動退 389 並黃字「目前是明文連線」。使用者零操作、零憑證知識,中間人攻擊擋得住。此條推翻 CM-2239(當時裁預設不勾的理由正是「客戶沒憑證」,釘住模式同時滿足兩邊)。主系統 LDAP 設定頁與 Agent 端都改。
抽套件(D19):ldap_adapter.py 兩百多行混了兩種東西——目錄連線(約 180 行,只靠 ldap3)與主系統帳號對應(約 30 行,查 user_auth_providers/users 表,繼承 BaseRepository)。Agent 沒那兩張表,裝整支 jedi-iam 要拖 Flask-RESTful 全套且 jedi-common 版本線衝突(Agent 釘 0.0.31、jedi-iam 要 ≥1.3.4——jedi-masking 抽成零相依套件的理由相同)。
jedi-ldap(新,零相依只靠 ldap3)
LdapDirectory(config).verify_user(username, pw) → DirectoryUser(uid, name, email, groups)
LdapDirectory(config).test_connect() → 結構化結果(連不到/憑證變了/帳號格式/密碼錯)
LdapConfig dataclass;首次信任釘住(指紋算與比對;存哪由呼叫端給 store)
加密預設 STARTTLS;不丟 Flask 例外
jedi-iam.LdapAdapter → 瘦成 30 行:呼叫 jedi-ldap 拿 DirectoryUser,再查綁定表;失敗計數補 LDAP 路徑
evidence-agent → 裝 jedi-ldap,不裝 jedi-iam
復用性(決策者:「要可以復用抽出來才有意義」):判準是不綁任何一張表、不綁 Flask、只靠 ldap3。現在就有三個使用者——主系統登入(jedi-iam 瘦身後)、Agent 離線登入(本案)、未來任何「用客戶 AD 驗身分」的地方(FR-132 存取管理若做 AD 群組對應角色、License Center 若接客戶目錄)。C11 標的「跳脫寫在兩處」「鎖定不計入」「加密預設無」三個洞抽出來後只修一處。
D17 Agent LDAP 來源三選一(已裁 2026-10-26)
同步(預設)/自設/不接;名單仍由主系統決定,LDAP 只驗密碼;自設的回報主系統清單可見。
D18 LDAP 憑證改首次信任釘住、加密預設 STARTTLS(已裁 2026-10-26,推翻 CM-2239)
拿掉「驗證憑證」勾選框;第一次連自動記指紋、變了就擋並要人「重新信任」;「貼上 CA」留進階。主系統設定頁與 Agent 端同步改。
D19 抽 jedi-ldap 零相依套件(已裁 2026-10-26)
目錄連線段抽出;jedi-iam 瘦身呼叫它;Agent 裝它不裝 jedi-iam。套件異動清單見 §14.3 P0-1~P0-3。