1. 客戶端查找DC過程
1) 用戶在加入域的客戶端計算機上登錄的時候,計算機會向本機的netLogon 服務(wù)發(fā)送RPC請求,請求包括域名,站點,計算機名稱等信息。
2) 本地客戶端上的netlogon服務(wù)使用domainlocator服務(wù)調(diào)用DsGetDcName接口,向其傳遞以下列表中的參數(shù)。
列表中列出的是DsGetDcName API的部分參數(shù),對應(yīng)著DNS服務(wù)器相應(yīng)區(qū)域中的PDC、GC、KDC、LDAP server記錄。Netlogon會調(diào)用DsGetDcName API收集所有可能會需要的信息,比如收集PDC信息是因為當找本地DC做身份驗證失敗時,就會需要找PDC做身份驗證。收集GC信息是因為GC上存儲著林中所有對象的一部分屬性,比如用戶郵箱地址。
登錄過程是需要查找Kerberos記錄來找到提供Kerberos驗證服務(wù)的DC進行驗證。域用戶登錄過程中,Kerberos驗證程序向KDC發(fā)送用戶信息和驗證服務(wù)請求后,就需要通過kerberos記錄來找到Kerberos Key Distribution Center服務(wù)進行驗證。
除了在查找PDC的情況下,DsGetDcName都會使用site參數(shù)。如果使用site參數(shù)的時候,請求得不到DNS服務(wù)器的回應(yīng),那么DsGetDcName會使用不帶site參數(shù)再次請求。舉個例子,在使用DS_KDC_REQUIRED 參數(shù)并且添加了site參數(shù)的時候,如果請求得不到Dns服務(wù)器的響應(yīng),那么DsGetDcName會請求下面的DNS記錄:_kdc._tcp.dc._msdcs.forestrootdomain。site通過子網(wǎng)進行劃分,客戶端通過所在的子網(wǎng)找到本子網(wǎng)的站點。
3) 客戶端上的netlogon服務(wù)收集信息并查找DNS中的SRV記錄,包括上面表中提到的各個SRV記錄。
4) DNS服務(wù)器返回客戶端所請求的記錄列表給客戶端,并且按照優(yōu)先級別和權(quán)重進行排序。然后客戶端使用LDAP協(xié)議連接上返回的第一個服務(wù)器的UDP389端口,請求建立一個LADP連接。當請求包發(fā)送完后,客戶端等待0.1秒后如果沒有收到回應(yīng),那么發(fā)送請求到下一個Domain server地址,直到接到回應(yīng)或者嘗試完所有地址。
5) 當DC向客戶端發(fā)送回應(yīng)后,客戶端檢查Dc是否有其需要的相關(guān)信息。如果有,客戶端開始登陸。哪個DC先響應(yīng)請求,客戶端就找其做身份驗證。
6) 客戶端檢查DC上是否有其需要的相關(guān)信息,即檢查該DC是否包含該用戶的身份驗證信息能否為其做身份驗證。例如由于復(fù)制延遲,某用戶沒有被復(fù)制到該DC上,該DC無法為其做身份驗證,客戶端就會繼續(xù)找下一個DC做身份驗證。
7) 客戶端緩存DC的相關(guān)信息,以便在下次登錄的時候直接使用。
2. AD域用戶身份驗證過程
1) 當客戶端通過上述步驟最終找到可以幫助域用戶做身份驗證的DC后,接下來就會進入與DC間進行驗證身份的過程。
2) 當用戶按下Ctrl+Alt+Del,即SAS。Winlogon檢測到這個動作,就調(diào)用GINA,顯示賬號驗證窗口,以便輸入用戶名和密碼。GINA的全稱為“Graphical Identification and Authentication”——圖形化識別和驗證。它是幾個動態(tài)數(shù)據(jù)庫文件,被winlogon.exe所調(diào)用,為其提供能夠?qū)τ脩羯矸葸M行識別和驗證的函數(shù),并將用戶的賬號和密碼反饋給winlogon.exe。在登錄過程中,“歡迎屏幕”和“登錄對話框”就是GINA顯示的。
3) 用戶輸入域名、賬號和密碼,確定后,GINA把信息發(fā)送給LSA進行驗證。LSA的全稱為“Local Security Authority”——本地安全授權(quán),Windows系統(tǒng)中一個相當重要的服務(wù),所有安全認證相關(guān)的處理都要通過這個服務(wù)。
4) LSA將請求發(fā)送給Kerberos驗證程序包。通過散列算法,根據(jù)用戶信息生成一個密鑰,并將密鑰存儲在證書緩存區(qū)域中。
5) Kerberos驗證程序向KDC(Key Distribution Center)發(fā)送一個包含用戶身份信息和驗證預(yù)處理數(shù)據(jù)的驗證服務(wù)請求(KRB_AS_REQ),其中包含用戶證書和散列算法加密的標記。
KDC(Kerberos Key Distribution Center——Kerberos密鑰發(fā)布中心)服務(wù)主要同Kerberos認證協(xié)議協(xié)同使用,用于在整個活動目錄范圍內(nèi)對用戶的登錄進行驗證。如果你確保整個域中沒有Windows NT計算機,可以只使用Kerberos協(xié)議,以確保最大的安全性。該服務(wù)要在Active Directory服務(wù)啟動后才能啟用。
6) KDC接收到數(shù)據(jù)后,利用自己的密鑰對請求中的標記進行解密,通過解密的標記是否正確,就可以判斷用戶是否有效。
7) 如果用戶有效,KDC將向用戶發(fā)送一個TGT(Ticket Granting Ticket)響應(yīng)用戶請求(KRB_AS_REP)。該TGT將用戶的密鑰進行解密,其中包含會話密鑰,該會話密鑰指向的用戶名稱,該票據(jù)的最大生命期及其他一些可能需要的數(shù)據(jù)和設(shè)置等。在TGT的授權(quán)數(shù)據(jù)部分包含戶賬號的SID以及該用戶所屬的全局組和通用組的SID。
8) LSA向域控制器上的KDC的票據(jù)驗證服務(wù)請求服務(wù)票據(jù)(KRB_TGS_REQ),其中包含要登陸的機器名,域名,用戶的TGT及會話密鑰。
9) KDC返回會話密鑰和會話票據(jù)給LAS(KRB_TGS_REP)。
10) LSA收到票據(jù)信息后,對其進行解密,然后查詢本地SAM數(shù)據(jù)庫(local Security Account Manager database),看該用戶是否隸屬于本地某個安全組及其它用戶權(quán)限,并將其組SID加到從票據(jù)數(shù)據(jù)中得到的列表。
11) 系統(tǒng)通過這個列表生成訪問令牌(access token),并為改用戶創(chuàng)建桌面對象,系統(tǒng)一些列子進程也將繼承這個安全訪問令牌。用戶的身份驗證信息也將會緩存到本地。
3. 總結(jié)
以上是AD域用戶在登錄域的時候,客戶端如何找到域控制器,以及找到之后,與KDC之間進行身份驗證的過程。然后事實上,第二部分介紹的使用kerberos協(xié)議進行驗證身份的過程只是一個大概的過程,具體的要比這復(fù)雜的多,可以參考此鏈接的內(nèi)容:http://blog.csdn.net/chlaws/article/details/8480304。