上一篇結尾提到,SAML、OIDC 這類協定負責把「使用者已經通過身分驗證」這件事傳遞給 SP;但在很多企業環境中,背後真正保存帳號、群組、部門等身分資料,並負責使用者登入驗證的,仍然是 LDAP 與 Kerberos 這兩套更早出現的技術,尤其常見於 AD(Active Directory) 環境中。這篇就專門展開這兩個技術的分工,以及為什麼即使現在雲端 SaaS 應用程式盛行,許多企業仍然離不開 AD。
今天內容涵蓋:
LDAP(Lightweight Directory Access Protocol,輕量級目錄存取協定),是一種用來存取「目錄服務(Directory Service)」的應用層協定,1993 年發布,運作在 TCP/UDP 389 埠(加密版本 LDAPS 用 636 埠)。
目錄服務可以想成是一種專門拿來查詢的「資料庫」,裡面存放組織內的使用者、群組、電腦、印表機等資源的資訊,功能上很像電話簿——給一個名字,查出對應的號碼(或帳密、部門、Email 等屬性)。LDAP 的前身是 X.500 標準底下的 DAP(Directory Access Protocol),但 DAP 建立在複雜的 OSI 通訊協定堆疊上,對當時剛興起的 TCP/IP 網路來說太重,所以 Tim Howes 等人在密西根大學做出一套更輕量、直接跑在 TCP/IP 上的替代方案,也就是 LDAP,因此有時也被稱為「X.500 Lite」。
LDAP 最常見的用途,就是提供一個中央位置存放帳號、群組與部門等資料,讓不同應用程式都能查詢同一份集中管理的身分資料,而不用各自維護一套帳號資料庫。這也補上了前幾天較少深入的部分:IdP 或系統本身,實際查詢使用者帳密與屬性時,可能就是透過 LDAP 這類目錄服務完成。
LDAP 把資料組織成一棵樹狀目錄,樹上的每一個節點稱為一筆 Entry(項目)。核心概念如下:
cn(Common Name,姓名)、mail(Email)、telephoneNumber(電話)。屬性的可用範圍由 Schema(綱要) 定義,不同用途的目錄(例如 Linux 帳號、Windows 帳號)會需要不同的 Schema。一筆 Entry 常用 LDIF(LDAP Data Interchange Format) 這種純文字格式表示,例如:
dn: cn=Gloria Chen,dc=example,dc=com
cn: Gloria Chen
givenName: Gloria
sn: Chen
mail: gloria@example.com
telephoneNumber: +1 888 555 6789
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
上面這筆 Entry 可以這樣拆開來看:
dn: cn=Gloria Chen,dc=example,dc=com 是這筆 Entry 的識別名稱(DN),也就是它在整棵目錄樹上的完整位置。cn=Gloria Chen 是這筆 Entry 自己的 RDN(說明「這一節點叫什麼名字」);dc=example,dc=com 則是它父節點的 DN(這裡 dc 代表 Domain Component,對應到 example.com 這個網域)。就像檔案的完整路徑是「文件夹路徑 + 檔名」,這裡的 DN 就是「父節點的 DN + 自己的 RDN」。dn 這一行以外,其他每一行(cn、givenName、sn、mail 等)都是這筆 Entry 的屬性(Attribute),用來描述這個人的實际資料。LDAP 定義了一套用戶端可以對目錄伺服器發出的操作,其中跟身份驗證最相關的是:
其中 Bind 是最常被拿來當「登入驗證」用的操作:應用程式收到使用者輸入的帳密後,直接拿去對 LDAP 伺服器發一個 Bind 請求,如果 Bind 成功,就代表帳密正確。這也是 Day04 提過的「LDAP 只負責核對帳密」的具體實作方式。
LDAP 本身只是一套協定,規範怎麼「跟目錄服務講話」,實際的目錄服務伺服器有很多種實作,企業環境最常見的就是 Microsoft 的 Active Directory(AD)——AD 就是一套以 LDAP 為基礎打造出來的目錄服務,這也是為什麼 LDAP 常常跟 AD 被放在一起講。除了 AD,Linux 陣營也有 OpenLDAP、389 Directory Server、FreeIPA 等實作。
AD 用一套分層的組織模型描述整個企業的身份資料,由大到小分別是:

以下面這個例子來說明,一間公司(Forest)在法國、美國分別有據點(Tree),美國據點底下又分成紐約、芝加哥兩個 Domain,芝加哥 Domain 底下再依部門分成 Marketing、Human Resources 兩個 OU,個別放著該部門的使用者:

對照回第二節提過的 Entry、DN、Attribute,AD 裡面每一個 Domain、OU、使用者、電腦,本質上都是 LDAP 目錄樹上的一筆 Entry;Forest、Tree、Domain、OU 這層層包含的關係,則透過 DN 路徑呈現。以下面芝加哥 Domain 底下的 Marketing OU 為例,James 這個使用者的 DN 可能長得像 cn=James,ou=Marketing,dc=chicago,dc=corp,dc=com:從右到左依序是公司網域(dc=corp,dc=com)、城市 Domain(dc=chicago)、部門 OU(ou=Marketing),最後才是使用者自己的 RDN(cn=James)。
OU 除了用來分類,還有一個很重要的用途:掛載 GPO(Group Policy Object,群組原則物件)。管理員可以把一組原則(例如密碼複雜度規則、桌面鎖定時間、可安裝的軟體)套用在某個 OU 上,OU 底下的使用者、電腦就會自動套用這些原則,不用一台一台手動設定:

這一整套 Forest、Tree、Domain、OU 的分層結構,還有掛在上面的 GPO 原則,就是企業在 AD 上投入多年、累積下來的組織資產——這也是後面第七節要談的「為什麼企業離不開 AD」的重要原因之一。
Kerberos 是 MIT 在 1988 年設計的網路驗證協定,名字來自希臘神話中守護地獄之門的三頭犬,預設使用 88 埠與 KDC 溝通。跟 LDAP 直接拿帳密去 Bind 不一樣,Kerberos 用「票證(Ticket)」來證明身份,好處是使用者只要在一開始輸入一次密碼,之後存取各種服務都不需要重複輸入,而且密碼本身完全不會被傳到網路上。
Kerberos 的核心角色是 KDC(Key Distribution Center,金鑰分發中心),底下又分成兩個服務:

流程大致如下:
整個過程中,使用者的密碼只在第一步用過一次,後面存取服務都是拿票證交換,不會重複傳送密碼,也不需要使用者重複輸入。這跟 Day03 介紹過的 Token 概念有點像:服務只要能驗證 TGT 或 Service Ticket 有效,就能相信使用者身分,不用自己保存或反覆核對密碼。
AD 環境底下的 Domain Controller(網域控制站) 本身就同時扮演 KDC 的角色,直接使用 AD DS 資料庫作為安全帳戶資料庫,Kerberos 也因此成為 AD 環境裡預設的驗證協定;只有在用戶端或伺服器不屬於同一個(或互信的)網域時,Windows 才會退回使用較舊的 NTLM 協定。也就是說,同一台 Domain Controller 其實同時扮演目錄服務(LDAP)與驗證服務(KDC)兩種角色,下一節會更完整拆解這兩者怎麼分工。
同一個 Domain Controller,其實同時在做兩件不同的事:
實務上使用者登入網域電腦時,用戶端走的是 Kerberos 流程:向 AS 換 TGT,再向 TGS 換各種服務的 Service Ticket,全程不會直接把密碼傳給 AD 資料庫比對;但如果是一些比較舊、只支援 LDAP 的應用程式(例如 Day04 提過的 VPN 伺服器、部分內部系統),就會走LDAP Bind 這條路:應用程式直接拿使用者輸入的帳密向 AD 發 Bind 請求,AD 內部核對通過就回覆成功。
換句話說,LDAP 查的是「這個人是誰、有什麼屬性」,Kerberos 管的是「這次要怎麼證明是這個人」。兩者都以 AD 這份目錄資料為底,但對外提供的能力不同;同一套帳號密碼,可能同時被這兩種協定使用。至於 Authorization(授權),則是應用程式自己的邏輯,用來決定「這個已驗證身分的人可以做什麼」。關於 Authorization 的細節,會在後面的文章再另外展開說明。
雖然現在多數企業都已經導入不少 SaaS 應用程式,也可能用 Day04 介紹過的 IdP 做雲端 SSO,但 AD 往往還是留在架構裡繼續運作,原因通常包括:
因為如此,企業與雲端服務商並沒有選擇「整個丟棄 AD」,而是發展出各種橋接方案,讓 AD 可以繼續運作,同時把身份資訊延伸到雲端:
這些方案的共通邏輯都是:讓 AD(或它管理的身份資料)繼續存在,同時想辦法讓雲端與新系統也能用到這份身份資料,而不是強迫企業一次性把所有系統都改寫成支援 SAML、OIDC。
LDAP 與 Kerberos 經常一起出現在 AD 環境裡,但兩者處理的是不同層次的問題:LDAP 負責目錄資料的儲存與查詢,Kerberos 則透過 TGT 與 Service Ticket,讓使用者在不反覆傳送密碼的情況下向不同服務證明自己的身分。
Active Directory 把這兩種能力整合在同一套企業身分基礎設施中,再加上 Forest、Domain、OU、GPO 等組織與裝置管理能力,AD 管理的早已不只是帳號,而是一整套企業內部的身分、權限與管理結構。
以下整理出三個重點:
下一篇會把視角從企業內部網路轉向 Web 應用程式,介紹 OAuth 1.0 如何讓第三方應用程式在不取得使用者密碼的前提下存取受保護資源,以及它為什麼最終被重新設計的 OAuth 2.0 取代。