跳转至

AD、LDAP

AD 與 LDAP 的關係

如果把 企業網路 比喻成一棟辦公大樓

  • AD (Active Directory) 就是這棟大樓的物業管理系統。它負責門禁(誰能進來)、資產清冊(哪台電腦在哪層樓)以及房間權限(誰能進會議室)。

  • LDAP (Lightweight Directory Access Protocol) 就是管理員手中的通訊協定。無論是用對講機、廣播還是填寫申請表,只要是「跟物業系統溝通」的方式,都遵循 LDAP 這個標準格式。

AD 採用樹狀結構,理解這四個層級對設定 LDAP 路徑(Distinguished Name, DN)至關重要:

層級 概念 說明 範例 (DN 格式)
Forest (森林) 邊界 企業的最頂層。包含所有的 Domain。 N/A (邏輯概念)
Domain (網域) 權限邊界 與 DNS 綁定,是物件存放的實體範圍。 DC=corp,DC=local
OU (組織單位) 容器/資料夾 用來分類 User、Computer。可下達群組原則 (GPO)。 OU=Engineering,OU=Users
Object (物件) 最小單位 具體的 User 或 Group。 CN=John Doe

拆解 LDAP 的「座標系統」 (Distinguished Name)

在開發時(如 Java JNDI 或 Spring Security),我們常看到的 CN=User,OU=IT,DC=corp,DC=local 其實就是一個絕對路徑

為什麼要有 DC=corp,DC=local

這與 DNS (Domain Name System) 息息相關。AD 依賴 DNS 來定位伺服器(Domain Controller)。

  • 格式轉換: LDAP 將網域 corp.local 拆解為 Domain Components (DC)。
  • 重要性: 這是路徑的「根部」。沒有 DC,LDAP 就不知道要去哪一個網域樹狀圖中搜尋資料。

常用關鍵字速查

  • CN (Common Name): 物件名稱(人名、群組名)。
  • OU (Organizational Unit): 組織部門。
  • DC (Domain Component): 網域組成。

開發實務:伺服器 vs 網域路徑

在程式碼中,這兩者經常被混淆,但它們扮演的角色完全不同:

1. 伺服器地址 (Provider URL)

// 指向「物理位置」,即 Domain Controller 的 IP 或 FQDN
properties.put(Context.PROVIDER_URL, "ldap://192.168.1.100:389");
  • 目的: 告訴程式「該連線到哪台主機」。
  • 注意: 如果有兩台 DC 做負載平衡,這裡通常會填寫 Domain FQDN (如 ldap://corp.local)。

2. 基本搜尋路徑 (Base DN)

// 指向「邏輯起點」,即從哪裡開始找人
String baseDN = "OU=Users,DC=corp,DC=local";
  • 目的: 告訴程式「從哪個目錄分支出發」。
  • 優化: Base DN 越精確(例如指定到 OU),搜尋速度就越快,且能避免跨網域搜尋的效能損耗。

進階建議:安全與最佳實務

  1. LDAPS (LDAP over SSL): 預設的 LDAP (Port 389) 是明文傳輸。在生產環境中,務必使用 Port 636 (LDAPS) 以保護帳號密碼。

  2. Service Account: 程式連線 AD 時,應使用一個「僅有讀取權限」的專用帳號,而非 Domain Admin。

  3. Global Catalog (Port 3268): 如果你的公司很大,有多個子網域(Multi-domain),搜尋時改用 3268 埠,可以一次搜尋整個森林的資料。