Windows安全認證是如何進行的?[Kerberos篇]
最近一段時間都在折騰安全(Security)方面的東西,比如Windows認證、非對稱加密、數字證書、數字簽名、TLS/SSL、WS-Security等。如果時間允許,我很樂意寫一系列的文章與廣大網友分享、交流。對於很多讀者來說,今天討論的可能是一個既熟悉、又陌生的話題——Windows認證。
目錄
一、Kerberos認證簡介
二、如何獲得“認購權證”?
三、如何透過“認購權證”購買“入場券”?
四、憑票入場
一、Kerberos認證簡介
Windows認證協議有兩種NTLM(NT LAN Manager)和Kerberos,前者主要應用於用於Windows NT 和 Windows 2000 Server(or Later) 工作組環境,而後者則主要應用於Windows 2000 Server(or Later) 域(Domain)環境。Kerberos較之NTLM更高效、更安全,同時認證過程也相對複雜。Kerberos這個名字來源於希臘神話,是冥界守護神獸的名字。Kerberos是一個三頭怪獸,之所以用它來命名一種完全認證協議,是因為整個認證過程涉及到三方:客戶端、服務端和KDC(Key Distribution Center)。在Windows域環境中,KDC的角色由DC(Domain Controller)來擔當。
某個使用者採用某個域帳號登入到某臺主機,並遠端訪問處於相同域中另一臺主機時,如何對訪問者和被訪問者進行身份驗證(這是一種雙向的驗證)?這就是Kerberos需要解決的場景。接下來我儘量以比較直白的語言來介紹我所知道的Kerberos認證的整個流程。
Kerberos實際上是一種基於票據(Ticket)的認證方式。客戶端要訪問伺服器的資源,需要首先購買服務端認可的票據。也就是說,客戶端在訪問伺服器之前需要預先買好票,等待服務驗票之後才能入場。在這之前,客戶端需要先買票,但是這張票不能直接購買,需要一張認購權證。客戶端在買票之前需要預先獲得一張認購權證。這張認購權證和進入伺服器的入場券均有KDC發售。右圖(點選看大圖)一張圖基本揭示了Kerberos整個認證的過程。
二、如何獲得“認購權證”?
首先,我們來看看客戶端如何獲得“認購權證”。這裡的認購權證有個專有的名稱——TGT(Ticket Granting Ticket),而TGT的是KDC一個重要的服務——認證服務(KAS:Kerberos Authentication Service)。當某個使用者透過輸入域帳號和密碼試圖登入某臺主機的時候,本機的Kerberos服務會向KDC的認證服務傳送一個認證請求。該請求主要包括兩部分內容,明文形式的使用者名稱和經過加密的用於證明訪問者身份的Authenticator(我實在找不到一個比較貼切的中文翻譯沒,Authenticator在這裡可以理解為僅限於驗證雙反預先知曉的內容,相當於聯絡暗號)。
當KDC接收到請求之後,透過AD獲取該使用者的資訊。透過獲取的密碼資訊生成一個秘鑰對Authenticator進行解密。如果解密後的內容和已知的內容一致,則證明請求著提供的密碼正確,即確定了登入者的真實身份。
KAS成功認證對方的身份之後,會先生成一個用於確保該使用者和KDC之間通訊安全的會話秘鑰——Logon Session Key,並採用該使用者密碼派生的秘鑰進行加密。KAS接著為該使用者建立“認購權證”——TGT。TGT主要包含兩方面的內容:使用者相關資訊和Logon Session Key,而整個TGT則透過KDC自己的金鑰進行加密。最終,被不同金鑰加密的Logon Session Key和TGT返回給客戶端。(以上的內容對應流程圖中的步驟1、2)
三、如何透過“認購權證”購買“入場券”?
經過上面的步驟,客戶端獲取了購買進入同域中其他主機入場券的“認購憑證”——TGT,以及Logon Session Key,它會在本地快取此TGT和Logon Session Key。如果現在它需要訪問某臺伺服器的資源,它就需要憑藉這張TGT向KDC購買相應的入場券。這裡的入場券也有一個專有的名稱——服務票據(ST:Service Ticket)。
具體來說,ST是透過KDC的另一個服務TGS(Ticket Granting Service)出售的。客戶端先向TGS傳送一個ST購買請求,該請求主要包含如下的內容:客戶端使用者名稱;透過Logon Session Key加密的Authenticator;TGT和訪問的伺服器(其實是服務)名。
TGS接收到請求之後,現透過自己的金鑰解密TGT並獲取Logon Session Key,然後透過Logon Session Key解密Authenticator,進而驗證了對方的真實身份。
TGS存在的一個根本的目有兩點:其一是避免讓使用者的密碼客戶端和KDC之間頻繁傳輸而被竊取。其二是因為密碼屬於Long Term Key(我們一般不會頻繁的更新自己的密碼),讓它作為加密金鑰的安全係數肯定小於一個頻繁變換得金鑰(Short Term Key)。而這個Short Term Key就是Logon Session Key,它確保了客戶端和KDC之間的通訊安全。
TGS完成對客戶端的認證之後,會生成一個用於確保客戶端-伺服器之間通訊安全的會話秘鑰——Service Session Key,該會話秘鑰透過Logon Session Key進行加密。然後出售給客戶端需要的入場券——ST。ST主要包含兩方面的內容:客戶端使用者資訊和Service Session Key,整個ST透過伺服器密碼派生的秘鑰進行加密。最終兩個被加密的Service Session Key和ST回覆給客戶端。(以上的內容對應流程圖中的步驟3、4)
四、憑票入場
客戶端接收到TGS回覆後,透過快取的Logon Session Key解密獲取Service Session Key。同時它也得到了進入伺服器的入場券——ST。那麼它在進行服務訪問的時候就可以藉助這張ST憑票入場了。該Serivce Session Key和ST會被客戶端快取。
但是,服務端在接收到ST之後,如何確保它是透過TGS購買,而不是自己偽造的呢?這很好辦,不要忘了ST是透過自己密碼派生的秘鑰進行加密的。具體的操作過程是這樣的,除了ST之外,服務請求還附加一份透過Service Session Key加密的Authenticator。伺服器在接收到請求之後,先透過自己密碼派生的秘鑰解密ST,並從中提取Service Session Key。然後透過提取出來的Service Session Key解密Authenticator,進而驗證了客戶端的真實身份。
實際上,到目前為止,服務端已經完成了對客戶端的驗證,但是,整個認證過程還沒有結束。談到認證,很多人都認為只是伺服器對客戶端的認證,實際上在大部分場合,我們需要的是雙向驗證(Mutual Authentication)——訪問者和被訪問者互相驗證對方的身份。現在伺服器已經可以確保客戶端是它所聲稱的那麼使用者,客戶端還沒有確認它所訪問的不是一個釣魚服務呢。
為了解決客戶端對伺服器的驗證,服務要需要將解密後的Authenticator再次用Service Session Key進行加密,併發揮給客戶端。客戶端再用快取的Service Session Key進行解密,如果和之前的內容完全一樣,則可以證明自己正在訪問的伺服器和自己擁有相同的Service Session Key,而這個會話秘鑰不為外人知曉(以上的內容對應流程圖中的步驟5、6)
以上的內容僅僅講述的是基於Kerberos的Windows認證的大體流程,並不涉及到一些細節的東西,比如如何確保時間的同步,如何抵禦Replay Attack等。此外,由於本文對Windows底層的知識有限,不能確保所有的內容都是完全正確,如有錯誤,還往不吝指正。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4686/viewspace-2805215/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- kerberos 認證流程-理解ROS
- Kerberos認證原理詳解ROS
- Ambari啟用Kerberos認證ROS
- kerberos認證協議愛情故事ROS協議
- 如何進行UEFI簽名認證
- Windows下IIS部署自建CA證書進行雙向認證的過程Windows
- 域滲透之初識Kerberos認證過程ROS
- Java Api Consumer 連線啟用Kerberos認證的KafkaJavaAPIROSKafka
- HTTPS 是如何進行安全傳輸的 ?HTTP
- HDFSRPC安全認證Token篇推廣RPC
- 透過Kerberos認證訪問Oracle11gROSOracle
- 程式碼簽名證書是如何進行驗證工作的
- java通過kerberos認證連線hdfs並寫數JavaROS
- 域滲透 | kerberos認證及過程中產生的攻擊ROS
- VNC客戶端是Windows,VNC客戶端是Windows如何進行操作VNC客戶端Windows
- 500強企業是如何進行資料安全建設的?看這篇就夠了
- 什麼是SSL安全認證閘道器?
- .net core中使用jwt進行認證JWT
- 使用personal access token進行Github認證Github
- golang使用JWX進行認證和加密Golang加密
- OSPF 安全認證
- 企業WiFi認證,如何保證企業WiFi安全?WiFi
- gorm是如何保證協程安全的GoORM
- 什麼是實名域名?域名必須進行實名認證嗎?
- SpringBoot--- 使用SpringSecurity進行授權認證Spring BootGse
- WHQL認證是什麼?如何實現
- SpringBoot安全認證SecuritySpring Boot
- 【大資料安全】ApacheKylin安全配置(Kerberos)大資料ApacheROS
- 解讀Java8中ConcurrentHashMap是如何保證執行緒安全的JavaHashMap執行緒
- Windows 11 WHQL認證的必要性Windows
- KubeSphere 使用 OpenLDAP 進行統一認證完全指南LDA
- 基於Kerberos的大資料安全方案ROS大資料
- 基於kerberos的hadoop安全叢集搭建ROSHadoop
- Redis 中如何保證資料的不丟失,Redis 中的持久化是如何進行的Redis持久化
- Tomcat 容器的安全認證和鑑權Tomcat
- 認證系統之登入認證系統的進階使用 (二)
- 什麼是TOGAF以及如何獲得TOGAF認證
- Go gRPC進階-TLS認證+自定義方法認證(七)GoRPCTLS