Kerberos認證原理簡介

来源:http://www.cnblogs.com/royfans/archive/2017/08/07/7299464.html
-Advertisement-
Play Games

1.1 What is Kerberos 1.1.1 簡單介紹 Kerberos是一個用於鑒定身份(authentication)的協議, 它採取對稱密鑰加密(symmetric-key cryptography),這意味著密鑰不會在網路上傳輸。在Kerberos中,未加密的密碼(unencrypt ...


1.1 What is Kerberos

1.1.1 簡單介紹
  Kerberos是一個用於鑒定身份(authentication)的協議, 它採取對稱密鑰加密(symmetric-key cryptography),這意味著密鑰不會在網路上傳輸。在Kerberos中,未加密的密碼(unencrypted password)不會在網路上傳輸,因此攻擊者無法通過嗅探網路來偷取用戶的密碼。

  Kerberos利用對稱加密和受信任的第三方(即KDC, key distribution center)來鑒別要求使用網路服務的用戶的身份。所有有KDC和secondary KDC管理的主機構成了一個域(realm)。

  當一個用戶的身份通過了KDC的驗證後,KDC會向該用戶發送一個證書/票據(該證書/票據是與這次會話綁定的),其他kerberized services會在該用戶的主機上搜索該ticket,而不是要求用戶使用密碼來驗證他的身份。
1.1.2 關於Kerberos的一些概念
Principal
一個用戶會以一個獨一無二的身份來被KDC認證,該身份被稱為principal。一個Principal由三個部分組成:primary, instance以及realm,其組成形式為primary/instance@realm。
primary : 可以是OS中的username,也可以是service name;
instance : 用於區分屬於同一個user或者service的多個principals,該項為optional;
realm : 類似於DNS中的domain,定義了一組principals
1.1.3 認證過程
  1、當用戶在一個kerberos-aware網路中登錄到他的workstation之後,authentication server將向KDC發送一個TGT請求(a request for a ticket-granting ticket),而他的principal將作為其中的組成部分。該請求可以由登錄程式來負責發送(這樣該過程對用戶透明),也可以在用戶登錄後通過執行kinit來發送。

  2、KDC在其資料庫中檢查該pricipal。

  3、如果找到了該principal,則KDC將創建一個TGT,並用user key進行加密,然後將加密後的TGT發送給該用戶。這裡,user key並不是用戶的密碼,而是由用戶密碼計算而來(例如hash)。

  4、用戶所在主機的Kerberos client的登錄程式或者kinit程式在收到加密的TGT後,用該用戶的user key進行解密。user key只會在client主機上被使用,絕不會在網路上傳輸。KDC發送的ticket將被保存在一個本地文件中(credentials cache),它可以被kerberized services查驗。

  5、用戶的身份驗證完成後,servers(運行著kerberized applciations & services)可以查驗被識別的principals及其keys(這將被保存在keytab中),而不必用kinit來查驗。

  TGT有一個可設定的失效期(通常為10~24小時),這會被保存在client所在主機的credential cache中。在ticket過期之前,用戶在請求kerberized services的服務時不需要再次輸入用戶密碼,除非他們登出後再登錄。

  每當用戶需要訪問一個network service時,client會利用TGT向TGS(ticket-granting server)請求獲得針對該特定網路服務的一個新的ticket。之後,用戶可以利用該service ticket來向該network service實現authentication。
1.1.4 How Kerberos works
  KDC就是受信任的第三方(trusted third party arbitrator),KDC上運行著2個重要的Kerberos daemons,即 kadmind 和 krb5kdc。
  Kadmind: 這是管理Kerberos server的進程,一個名為kadmin 的程式使用 kadmind 來維護principal database和policy configuration。
  Krb5kdc: 在Kerberos authentication的過程中擔負trusted third party arbitrator的職責。

1.2 認證原理
1.2.1 知識準備
  為了使讀者更加容易理解,在這裡我們先給出兩個重要的概念:
  ▪ Long-term Key/Master Key:在Security的領域中,有的Key可能長期內保持不
變,比如你在密碼,可能幾年都不曾改變,這樣的Key、以及由此派生的Key被稱為Long-term Key。對於Long-term Key的使用有這樣的原則:被Long-term Key加密的數據不應該在網路上傳輸。原因很簡單,一旦這些被Long-term Key加密的數據包被惡意的網路監聽者截獲,在原則上,只要有充足的時間,他是可以通過計算獲得你用於加密的Long-term Key的——任何加密演算法都不可能做到絕對保密。

  在一般情況下,對於一個Account來說,密碼往往僅僅限於該Account的所有者知曉,甚至對於任何Domain的Administrator,密碼仍然應該是保密的。但是密碼卻又是證明身份的憑據,所以必須通過基於你密碼的派生的信息來證明用戶的真實身份,在這種情況下,一般將你的密碼進行Hash運算得到一個Hash code, 我們一般管這樣的Hash Code叫做Master Key。由於Hash Algorithm是不可逆的,同時保證密碼和Master Key是一一對應的,這樣既保證了你密碼的保密性,又同時保證你的Master Key和密碼本身在證明你身份的時候具有相同的效力。
  ▪ Short-term Key/Session Key:由於被Long-term Key加密的數據包不能用於網路傳送,所以我們使用另一種Short-term Key來加密需要進行網路傳輸的數據。由於這種Key只在一段時間內有效,即使被加密的數據包被黑客截獲,等他把Key計算出來的時候,這個Key早就已經過期了。
1.2.2 認證詳細原理
  Kerberos實際上一個基於Ticket的認證方式。Client想要獲取Server端的資源,先得通過Server的認證;而認證的先決條件是Client向Server提供從KDC獲得的一個有Server的Master Key進行加密的Session Ticket(Session Key + Client Info)。可以這麼說,Session Ticket是Client進入Server領域的一張門票。而這張門票必須從一個合法的Ticket頒發機構獲得,這個頒發機構就是Client和Server雙方信任的KDC,同時這張Ticket具有超強的防偽標識:它是被Server的Master Key加密的。對Client來說,獲得Session Ticket是整個認證過程中最為關鍵的部分。
  為了更好的說明整個Ticket Distribution的過程,我在這裡做一個類比。現在的股事很火爆,上海基本上是全民炒股,我就舉一個認股權證的例子。有的上市公司在股票配股、增發、基金擴募、股份減持等情況會向公眾發行認股權證,認股權證的持有人可以憑藉這個權證認購一定數量的該公司股票,認股權證是一種具有看漲期權的金融衍生產品。
而我們今天所講的Client獲得Ticket的過程也和通過認股權證購買股票的過程類似。如果我們把Client提供給Server進行認證的Ticket比作股票的話,那麼Client在從KDC那邊獲得Ticket之前,需要先獲得這個Ticket的認購權證,這個認購權證在Kerberos中被稱為TGT:Ticket Granting Ticket,TGT的分發方仍然是KDC。
我們現在來看看Client是如何從KDC處獲得TGT的:首先Client向KDC發起對TGT的申請,申請的內容大致可以這樣表示:“我需要一張TGT用以申請獲取用以訪問所有Server的Ticket”。KDC在收到該申請請求後,生成一個用於該Client和KDC進行安全通信的Session Key(SKDC-Client)。為了保證該Session Key僅供該Client和自己使用,KDC使用Client的Master Key和自己的Master Key對生成的Session Key進行加密,從而獲得兩個加密的SKDC-Client的Copy。對於後者,隨SKDC-Client一起被加密的還包含以後用於鑒定Client身份的關於Client的一些信息。最後KDC將這兩份Copy一併發送給Client。這裡有一點需要註意的是:為了免去KDC對於基於不同Client的Session Key進行維護的麻煩,就像Server不會保存Session Key(SServer-Client)一樣,KDC也不會去保存這個Session Key(SKDC-Client),而選擇完全靠Client自己提供的方式。

  通過上面的過程,Client實際上獲得了兩組信息:一個通過自己Master Key加密的Session Key,另一個被Sever的Master Key加密的數據包,包含Session Key和關於自己的一些確認信息。

  Client通過自己的Master Key對KDC加密的Session Key進行解密從而獲得Session Key,隨後創建Authenticator(Client Info + Timestamp)並用Session Key對其加密。最後連同從KDC獲得的、被Server的Master Key加密過的數據包(Client Info + Session Key)一併發送到Server端。我們把通過Server的Master Key加密過的數據包稱為Session Ticket。
  當Server接收到這兩組數據後,先使用他自己的Master Key對Session Ticket進行解密,從而獲得Session Key。隨後使用該Session Key解密Authenticator,通過比較Authenticator中的Client Info和Session Ticket中的Client Info從而實現對Client的認證。

1.2.3kafka認證過程
  總結起來也很簡單,Broker啟動時,需要使用配置文件中的身份和密鑰文件向KDC(Kerberos伺服器)認證,認證通過則加入Kafka集群,否則報錯退出。
Producer(或Consumer)啟動後需要經過如下步驟與Broker建立安全的Socket連接:
  1.Producer向KDC認證身份,通過則得到TGT(票證請求票證),否則報錯退出
  2.Producer使用TGT向KDC請求Kafka服務,KDC驗證TGT並向Producer返回SessionKey(會話密鑰)和ServiceTicket(服務票證)
  3.Producer使用SessionKey和ServiceTicket與Broker建立連接,Broker使用自身的密鑰解密ServiceTicket,獲得與Producer通信的SessionKey,然後使用SessionKey驗證Producer的身份,通過則建立連接,否則拒絕連接。

轉載:http://www.cnblogs.com/xiaodf/p/5968086.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n。n 代表一個數字,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推…… 以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 為執行的文件名: #!/bin/bash echo "Shell 傳遞參數 ...
  • sra文件轉換為fastq格式 fastq-dump -h --split-3 也就是說如果SRA文件中只有一個文件,那麼這個參數就會被忽略。如果原文件中有兩個文件,那麼它就會把成對的文件按*_1.fastq,*_2.fastq這樣分開。如果還出現了第三個文件,就意味著這個文件本身是未成配對的部分。 ...
  • rpc.statd程式主要實現NFS鎖相關內容,如普通的文件鎖(NLM、NSM)、文件委托、租約等,但註意,它和sm-notify組合起來才能實現整個NFS鎖機制,具體見下文翻譯文檔中的說明。 以下是NFS相關翻譯篇: 回到系列文章大綱:http://www.cnblogs.com/f-ck-nee ...
  • 以下是NFS相關翻譯篇: 回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7302577.html 註:若您覺得這篇文章還不錯請點擊下右下角 ...
  • LNMP編譯安裝之nginx關聯php--圖文詳解 1、前言 之前已經介紹了nginx,php,mysql的編譯安裝過程,但nginx和php的關聯沒有涉及,導致網頁不能正常使用php功能,所有本編介紹如何將nginx和php進行關聯,使*.php文件可以正常在瀏覽器訪問。 2、準備步驟 2.1、修 ...
  • HAproxy部署配置 拓撲圖 說明: 一 HAProxy主機配置 1 global部分 用來設定全局配置參數,屬於進程級的配置,通常和操作系統配置有關。 2 default部分 預設參數的配置部分。在次部分配置的參數值,預設會自動引用到下麵frontend、backend、listen部分中,因此 ...
  • 文件系統 格式化 使用fdisk命令創建分區後,並不能直接使用,必須先格式化。 在Linux中有兩種方式格式化,分別是命令mke2fs和mkfs 實踐:對磁碟sdb新創建的三個分區執行格式化操作。 查看分區信息 實踐: 日誌 總結:一般都會使用帶日誌的文件系統,比如windows中的NTFS,Lin ...
  • 需要註意的是,掛載點必須是一個已經存在的目錄,這個目錄可以不為空,但掛載後這個目錄下以前的內容將不可用,umount以後會恢復正常。使用多個-o參數的時候,-o 只用一次,參數之間用半形逗號隔開: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...