本卡屬 FR-195(Agent 資安修正),第 1 批 F13。修 FR-186 掃描的 I2 F2(3/3 票),嚴重度:中。改的是 jedi-ldap 套件(Repo 欄:jedi-packages)。
客戶用 OpenLDAP 登入時,系統拿使用者輸入的帳號名去目錄裡找人。現在的寫法是:找到幾筆都沒關係,直接拿第一筆、用它去驗密碼。如果目錄裡剛好有另一個人的名字欄位跟這個帳號名一樣,而且排在前面,他用自己的密碼就能登成別人。
改成:找到超過一筆就拒絕登入。正常情況下一個帳號名只會對到一個人,不受影響;只有目錄裡真的有重名時才會被擋,這時本來就不該讓系統亂猜是哪一個。
這個套件主系統登入與 Agent 主控台登入共用,改一處兩邊都修到。客戶的登入帳號、設定都不用變。
jedi-ldap/jedi_ldap/infra/directory.py:220-252 get_open_ldap_user_info::224 用 (cn=<帳號>) 搜尋,:241-242 沒找到就 raise LdapAuthError(Reason.USER_NOT_FOUND),:244 entry = conn.entries[0] 直接拿第一筆。jedi-ldap/jedi_ldap/domain/types.py:11 class Reason(StrEnum)。directory.py:187-190 的查人函式把 USER_NOT_FOUND 轉成回 None;:211 verify_user 的 OpenLDAP 分支直接讓例外往上拋。Agent 端 evidence-agent/guidant_agent/identity/adapters/ldap_source.py:255-262 只對 CERT_CHANGED/CERT_INVALID 特別處理,其餘原因一律當登入失敗。jedi-ldap/jedi_ldap/infra/directory.py
jedi-ldap/tests/test_directory.py
jedi-ldap/pyproject.toml(版號)
directory.py:241-244:在「沒找到」的檢查後面加一段——if len(conn.entries) > 1: raise LdapAuthError(Reason.USER_NOT_FOUND),上面一行註解寫為什麼(「同名多筆時不猜是哪一個:拿第一筆等於讓目錄裡排在前面的同名者登成別人」)。Reason.USER_NOT_FOUND,不要新增列舉值。理由::189 的查人函式已經把這個原因處理成「查無此人」,沿用它所有呼叫端(主系統、Agent)都不用改;新增一個原因的話,每個呼叫端都要補處理,而且登入頁本來就規定帳密類原因要收成同一句、不能讓人分辨(列舉的 docstring 寫了 SR-01.1)。logger.warning 記一行讓維運查得到(只記帳號與筆數,不記密碼):開工先看 directory.py 檔頭有沒有現成的 logger,有就用,沒有就不記,不要為這一行引入新的 logging 設定。get_ad_user_info,:254 起,用 sAMAccountName 搜尋)不用改:sAMAccountName 在一個網域內由 AD 保證唯一。jedi-ldap/pyproject.toml 的 version 從 0.1.0 改成 0.1.1。🔴 這張卡不發版(不跑 publish.sh、不推 Nexus),發版屬收尾。Agent 與 jedi-iam 釘的都是 jedi-ldap (>=0.1.0,<0.2.0),0.1.1 發版後兩邊重裝就會吃到,不用改它們的 pyproject。OpenLDAP 目錄裡若有兩筆以上條目的 cn 等於使用者輸入的帳號,這個帳號會登入失敗(訊息與帳密錯誤相同)。目錄管理員要把重名的條目處理掉。一般情況不受影響。要等這個套件發版、Agent 與主系統升到新版才生效(收尾待辦)。