Kerberos 是一種身份認(rèn)證協(xié)議,被廣泛運(yùn)用在大數(shù)據(jù)生態(tài)中,甚至可以說是大數(shù)據(jù)身份認(rèn)證的事實(shí)標(biāo)準(zhǔn)。本文將詳細(xì)說明 Kerberos 原理。
1.什么是 Kerberos ?
Kerberos 一詞來源于古希臘神話中的 Cerberus —— 守護(hù)地獄之門的三頭犬。下圖是 Kerberos 的 LOGO。
一句話來說,Kerberos 是一種基于加密 Ticket 的身份認(rèn)證協(xié)議。Kerberos 主要由三個(gè)部分組成:Key Distribution Center(KDC)、Client 和 Service。 大致關(guān)系如下圖所示:
客戶端會(huì)先訪問兩次 KDC,然后再訪問目標(biāo) Service,如:HTTP 服務(wù)。
2.Kerberos 基本概念
2.1 基本概念
(1)Principal:大致可以認(rèn)為是 Kerberos 世界的用戶名,用于標(biāo)識(shí)身份。Principal
主要由三部分構(gòu)成:primary
,instance
(可選)和 realm
。
- 包含
instance
的Principal
,一般會(huì)作為Server
端的Principal
,如:NameNode,HiverServer2,Presto Coordinator 等。 - 不含有
instance
的Principal
,一般會(huì)作為Client
端的Principal
,用于身份認(rèn)證。
(2)Keytab:密碼本。包含了多個(gè) principal
與密碼的文件,用戶可以利用該文件進(jìn)行身份認(rèn)證。
(3)Ticket Cache:客戶端與 KDC 交互完成后,包含身份認(rèn)證信息的文件,短期有效,需要不斷 renew
。
(4)Realm:Kerberos 系統(tǒng)中的一個(gè) namespace
。不同 Kerberos 環(huán)境,可以通過 realm
進(jìn)行區(qū)分。
2.2 KDC
Key Distribution Center(KDC),是 Kerberos 的核心組件,主要由三個(gè)部分組成:
- Kerberos Database:包含了一個(gè) Realm 中所有的 Principal、密碼與其他信息。(默認(rèn):Berkeley DB)
-
Authentication Service(AS):進(jìn)行用戶信息認(rèn)證,為客戶端提供
Ticket Granting Tickets
(TGT
)。 -
Ticket Granting Service(TGS):驗(yàn)證 TGT 與 Authenticator,為客戶端提供
Service Tickets
。
3.Kerberos 原理
在深入了解 Kerberos 原理之前,先介紹一下 Kerberos 協(xié)議的幾個(gè)大前提,幫助大家理解:
- Kerberos 基于 Ticket 實(shí)現(xiàn)身份認(rèn)證,而非密碼。如果客戶端無法利用本地密鑰,解密出 KDC 返回的加密 Ticket,認(rèn)證將無法通過。
- 客戶端將依次與 Authentication Service,Ticket Granting Service 以及目標(biāo) Service 進(jìn)行交互,共三次交互。
- 客戶端與其他組件交互都將獲取到兩條信息,其中一條可以通過本地密鑰解密出,另外一條將無法解密出。
- 戶端想要訪問的目標(biāo)服務(wù),將不會(huì)直接與 KDC 交互,而是通過能否正確解密出客戶端的請(qǐng)求來進(jìn)行認(rèn)證。
- KDC Database 包含有所有 Principal 對(duì)應(yīng)的密碼。
- Kerberos 中信息加密方式一般是對(duì)稱加密(可配置成非對(duì)稱加密)。
下面,我們將以客戶端訪問 HTTP
服務(wù)為例,解釋整個(gè)認(rèn)證過程。
3.1 客戶端與 Authentication Service
第一步,客戶端通過 kinit USERNAME
或其他方式,將 客戶端 ID,目標(biāo) HTTP 服務(wù) ID,網(wǎng)絡(luò)地址(可能是多個(gè)機(jī)器的 IP 地址列表,如果想在任何機(jī)器上使用,則可能為空),以及 TGT 有效期的壽命 等信息發(fā)送給 Authentication Service。
第二步,Authentication Server 將檢查客戶端 ID 是否在 KDC 數(shù)據(jù)庫中。
如果 Authentication Server 檢查操作沒有異常,那么 KDC 將隨機(jī)生成一個(gè) Key,用于客戶端與 Ticket Granting Service(TGS)通信。這個(gè) Key,一般被稱為 TGS Session Key。隨后 Authentication Server 將發(fā)送 兩條信息 給客戶端。示意圖如下:
其中一條信息被稱為 TGT,由 TGS 的密鑰加密,客戶端無法解密,包含 客戶端 ID,TGS Session Key 等信息。
另一條信息由客戶端密鑰加密,客戶端可以正常解密,包含 目標(biāo) HTTP 服務(wù) ID,TGS Session Key 等信息。
第三步,客戶端利用本地的密鑰解密出第二條信息。如果本地密鑰無法解密出信息,那么認(rèn)證失敗。示意圖如下:
3.2 客戶端與 Ticket Granting Service
這時(shí)候,客戶端有了 TGT(由于本地沒有 TGS 的密鑰,導(dǎo)致無法解密出其數(shù)據(jù))與 TGS Session Key。
第四步,客戶端將:
- 將 AS 發(fā)送過來的 TGT(由 TGS 密鑰加密)轉(zhuǎn)發(fā)給 TGS。
- 將包含自身信息的 Authenticator (由 TGS Session Key 加密)發(fā)送給 TGS。
第五步,TGS 將利用自身的密鑰從 TGT 中解密出 TGS Session Key,然后利用 TGS Session Key 從 Authenticator 中解密出客戶端的信息。
TGS 解密出所有信息后,將進(jìn)行身份檢查,進(jìn)行認(rèn)證:
- 將客戶端 ID 與 TGT 的客戶端 ID 進(jìn)行比較。
- 比較來自 Authenticator 的時(shí)間戳和 TGT 的時(shí)間戳(典型的 Kerberos 系統(tǒng)的容忍度是 2 2 2 分鐘,但也可以另行配置)。
- 檢查 TGT 是否過期。
- 檢查 Authenticator 是否已經(jīng)在 TGS 的緩存中(為了避免重放攻擊)。
當(dāng)所有檢查都通過后, TGS 隨機(jī)生成一個(gè) Key 用于后續(xù)客戶端與 HTTP 服務(wù)交互時(shí)進(jìn)行通信加密使用,即 HTTP Session Key。同樣地,TGS 將發(fā)送 兩條信息 給客戶端:其中一條是 HTTP Ticket,由 HTTP 服務(wù)的密鑰進(jìn)行加密;另一條則由 TGS Session Key 加密,包含了客戶端信息與時(shí)間戳。
第六步,客戶端將利用 TGS Session Key 解密出其中一條信息,另一條信息由于是由目標(biāo) HTTP 服務(wù)加密,無法解密。
3.3 客戶端與 HTTP Service
這時(shí)候,客戶端有了 HTTP Ticket(由于本地沒有 HTTP 服務(wù)的密鑰,導(dǎo)致無法解密出其數(shù)據(jù))與 HTTP Service Session Key。
第七步,客戶端將:
- 將 TGS 發(fā)送過來的 HTTP Ticket(由 HTTP 密鑰加密)轉(zhuǎn)發(fā)給目標(biāo) HTTP 服務(wù)。
- 將包含自身信息的 Authenticator(由 HTTP Service Session Key 加密)發(fā)送給 HTTP 服務(wù)。
注:上圖中 Ticket for HTTP Service 中裝的應(yīng)該是 HTTP Service Session Key,而不是 TGS Session Key,有一點(diǎn)小錯(cuò)誤,注意甄別。
第八步,HTTP 服務(wù)首先利用自身的密鑰解密出 HTTP Ticket 的信息,得到 HTTP Service Session Key;隨后,利用 HTTP Service Session Key 解密出用戶的 Authenticator 信息。
信息解密完成后,HTTP 服務(wù)同樣需要做一些信息檢查:
- 將 Authenticator 中的客戶端 ID 與 HTTP Ticket 中的客戶端 ID 進(jìn)行比較。
- 比較來自 Authenticator 的時(shí)間戳和 HTTP Ticket 的時(shí)間戳(典型的 Kerberos 系統(tǒng)對(duì)差異的容忍度是 2 2 2 分鐘,但也可以另行配置)。
- 檢查 Ticket 是否過期。
- 檢查 Authenticator 是否已經(jīng)在 HTTP 服務(wù)器的緩存中(為了避免重放攻擊)。
然后,HTTP 服務(wù)會(huì)發(fā)送包含其 ID 和時(shí)間戳的身份驗(yàn)證器消息,以便向您確認(rèn)其身份,并使用 HTTP Service Session Key 進(jìn)行加密。
您的機(jī)器通過使用緩存的 HTTP Service Session Key 解密來讀取身份驗(yàn)證器消息,并知道它必須接收帶有 HTTP 服務(wù) ID 和時(shí)間戳的消息。
現(xiàn)在,您已通過身份驗(yàn)證,可以使用 HTTP 服務(wù)。未來的請(qǐng)求將使用緩存的 HTTP Service Ticket,只要它沒有按照生命周期屬性中的定義過期即可。
文章來源:http://www.zghlxwxcb.cn/news/detail-735610.html
參考如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-735610.html
- Explain like I’m 5: Kerberos
- Introduction To Kerberos
- 一文搞定 Kerberos
到了這里,關(guān)于【網(wǎng)絡(luò)安全】圖解 Kerberos:身份認(rèn)證的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!