本卡屬 FR-195(Agent 資安修正),第 1 批 F5。修 FR-186 掃描的 I2 F1(3/3 票),嚴重度:中。
主控台的「LDAP 測試連線」會照畫面送來的整組設定(伺服器、埠、帳號、密碼)去連。有 LDAP 設定權限、但不是本機管理員的人,可以拿它叫 Agent 連內網任意機器探路,也能拿來猜 AD 密碼。同一頁其他會改設定的動作都已經限本機管理員,只有這顆漏了。補上。
b8b1158 重核過,仍然有效)guidant_agent/console/api/ldap_routes.py:133-135 test_ldap 只掛 @require_session("ldap.update"),沒有 @local_admin_only;同檔其他改設定的路由(:99、:112、:125、:150)都有。:136-138 收 body["fields"] 整組當設定去連。local_admin_only 就定義在同檔 :28。guidant_agent/console/api/ldap_routes.py
test/test_ldap_source.py
ldap_routes.py:134 @require_session("ldap.update") 下面加一行 @local_admin_only。就這一行。guidant_agent/identity/adapters/ldap_source.py 檔頭與 test/test_ldap_source.py:326 test_openldap_still_uses_sub 都明寫),要不要改由決策者裁,已另開暫緩卡。不要動 ldap_source.py 與 local_auth.py。非本機管理員在主控台按 LDAP「測試連線」會收到 403(AGENT_CONSOLE_LOCAL_ADMIN_REQUIRED)。畫面不用改:同頁其他按鈕對非本機管理員本來就是這個反應。
首腦試做過:加這一行不會讓任何既有測試變紅。在 test/test_ldap_source.py 加一支簡單斷言(該檔已有打 /ldap/test 的測試,grep -n "ldap/test" test/test_ldap_source.py 找到後照同樣寫法):有 ldap.update 但不是本機管理員打 POST /console/api/ops/ldap/test → 403 AGENT_CONSOLE_LOCAL_ADMIN_REQUIRED。既有那幾支打 /ldap/test 的測試若不是用本機管理員身分登入,會變成 403——首腦試做時沒有遇到,若遇到就把登入身分改成 local-admin。
🔴 不要 poetry install、不要動共用環境、不要改 pyproject.toml。Agent 主線釘 jedi-agent-protocol==0.6.1,這版還沒推上 Nexus,共用環境裡是 0.6.0,直接跑會 ImportError(KIND_SCAN_RESULT)。用下面的 PYTHONPATH 指到套件 repo 主資料夾就是對的版本。首腦 2026-11-11 在主線 b8b1158(FR-193 rootless 已合回)用這行跑全量:2554 passed、1 skipped、0 failed,約 3 分鐘;工作區裡跑守衛:109 passed,12 秒。
🔴 這台是 zsh:不要把多個檔名存進變數再傳給 pytest(zsh 不拆變數,整串會被當成一個檔名、報「找不到檔案」)。檔名直接寫在指令列上。
改完先跑這張卡相關的測試:
PYTHONPATH="/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-agent-protocol:/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-common:/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-masking" ~/Library/Caches/pypoetry/virtualenvs/evidence-agent-7jojxvJC-py3.13/bin/python -m pytest test/test_ldap_source.py test/test_fr190_scope_table.py test/test_fr166_guards.py -q -p no:cacheprovider