Hadoop安全篇之Kerberos實戰案例


                   Hadoop安全篇之Kerberos實戰案例

                                   作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

  由於幾乎每天都在發生信用卡數據,社會保障號,醫療信息和其他個人數據等關鍵數據的泄露問題,企業對保護數據非常關心。 

 

一.Hadoop安全概述

  眾所周知的Apache Hadoop,是一個開放源代碼軟件平台,用於大容量數據的可擴展和分布式計算。該項目包括了很多獨立開發的模塊,這樣能夠非常方便地為核心模塊添加各種功能。安全模塊是一個相對青澀的模塊,而且Hadoop缺乏一致的安全模式。在默認情況下,假定Hadoop處於可信任的環境中,隨着Hadoop的成熟,公司逐漸開始關心他們存儲在基於Hadoop的環境中越來越多的銘感業務數據的安全性。

  與常規數據庫不同,在Hadoop中沒有中央認真服務器或認證機制。如果用戶可以訪問運行NameNode的服務器,並且具有Hadoop二進制可執行文件的適當權限,則可能會讀取到他們未被授權訪問的數據,甚至刪除該數據。在Hadoop中沒有基於角色的訪問控制(RBAC),對象級或其他粒度認證功能。

  由於數據存儲在多個DataNodes中,因此每個DataNode都是攻擊者的潛在入口點,所以必須保存集群中的所有節點。為了加密在Hadoop客戶端和DataNodes之間傳輸的數據,必須使用Kerberos或Sample認證和安全層(SASL)框架。DataNode和NameNode之間的通信也需要保護。

  加密是保護銘感數據的基本要求。如果未加密靜態和傳輸中的數據,則意味着攻擊者可以攔截節點間通信,並且考科一訪問存儲在磁盤上的私密信息。

  Hadoop安全包括三個主要概念:驗證,授權和審計。

1>.認證

  身份驗證是一個服務器或應用程序能夠通過其准確地知道誰在訪問服務器或應用程序的過程。認證的難點在於訪問系統的用戶提供他們的身份。在Linux系統中,當你登錄時,系統將你的用戶/密碼憑據與"/etc/passwd"文件中的憑據進行比較。如果驗證成功,則認為你通過了身份驗證。

  kerberos是當下IT環境中最流行的安全模式。kerberos是一種開源的網絡身份驗證協議,其允許集群節點相互訪問身份。kerberos是純認證協議,因此它不管文件和目錄權限。

  如果實現了Kerberos,那么希望訪問集群的用戶首先會來聯系中央Kerberos服務器(名為密鑰分發中心,KDC),該服務器上有憑據數據庫。如果用戶提供的憑據正常,則KDC授予對Hadoop集群的訪問權限。總而言之,Kerberos進行身份驗證有以下三個步驟:
    (1)認證服務器授權客戶端要求訪問Hadoop集群的授權票據(TGT);
    (2)客戶端使用他們的憑據解密TGT,並使用TGT從票證授予服務器(TGS)獲取服務票證(TGS授予Hadoop集群的訪問權限);
    (3)客戶端使用TGS授權的服務票據來訪問Hadoop集群;

  溫馨提示:
    kerberos協議通過客戶端,授權服務器和授予服務器之間的一系列協商實現。

2>.授權

  授權是系統確定用戶是否具有使用資源或訪問特定數據的必要權限的過程。授權通常需要用戶成功認證。根據授權類型的不同,在某些情況下可能需要密碼,但在其他情況下可能不需要。

  Hadoop授權非常復雜。由於Hadoop將數據存儲在像Linux系統這樣的文件系統中,而不是關系型數據庫那樣的表中,所以不能通過授予用戶對數據的部分訪問權限來限制用戶。在Hadoop中沒有中央授權系統來幫助你授予對數據文件的部分訪問權限,以限制數據訪問,但是可以使用Apache Sentry進行此操作。

  Apache Sentry和Apache Ranger等服務使我們能夠通過Hive等數據庫以及授權機制在Hadoop中配置部分授權。Sentry允許創建在指定表上可能的操作規則,也可以創建角色,這些角色是一組規則。使用Sentry,可以將部分文件數據指定為Hive表,而且Sentry可以幫助我們配置細粒度權限。

  使用Hadoop的ACL功能可以為特定用戶指定細粒度的讀寫權限,而無需更改用於所有的文件權限。

3>.審計

  審計是安全的第三個概念。因為授權用戶也可能執行(或嘗試執行)未經授權的操作,所以需要以某種方式跟蹤用戶活動。

  Hadoop的審核日志機制可幫助我們跟蹤系統中的特定用戶操作。有趣的是,如果希望使用Hive等工具來來處理大量的Hadoop審核日志,則可以將其存儲在HDFS中。通過HDFS審核日志可跟蹤所有的HDFS訪問活動,通過YARN審核日志可審核提交活動。

 

二.kerberos組件概述

  如下圖所示,Kerberos使用中央服務器。中英服務器的故障會導致所有人無法訪問集群,因此需要設置多個中央服務器,以實現高可用性。密碼是高度安全的,因為kerberos將其保存在中央服務器上,不會發生任何汽提塔地方復制密碼信息的事情。

  一旦用戶登錄到Kerberos(也稱為Kerberized集群)認證系統,該用戶可以繼續訪問所有授權的服務,而不必在該回話期間再次進行身份驗證。這一點類似於我們熟悉的單點登錄概念。

  Kerberos使用一組特定的術語。想要了解Kerberos認證如何工作,掌握這些術語的含義非常重要。它還使用幾個獨特的管理實體來確保安全。了解這些實體對於配置和管理基於Kerberos的安全性至關重要。接下來我們簡要介紹Kerberos主要的術語和管理實體。

 

1>.為什么需要kerberos

  Hadoop集群默認采用基於操作系統賬號的Simple認證,基本沒有安全性保證,用戶只需在客戶端的操作系統上建立一個同名賬號,即可偽裝成任何用戶訪問集群。

  綜上所述,Hadoop急需一套安全認證系統,而目前在大數據領域主流的安全認證模塊就是kerberos。

2>.什么是kerberos

  Kerberos是一個網絡認證的框架協議,它的命名靈感來自於希臘神話中一只三頭犬守護獸,寓意其擁有強大的保護能力。

  Kerberos由麻省理工學院創建,作為解決這些網絡安全問題的解決方案。Kerberos協議使用強加密技術,以便客戶端可以通過不安全的網絡連接向服務器(反之亦然)證明其身份。

  在客戶端和服務器使用Kerberos證明其身份后,他們還可以加密所有通信,以確保在業務開展時的隱私和數據完整性。

  在安全領域,Kerberos以其強大的身份認證機制獲得了聲譽,同時也由於其明顯的復雜性讓許多管理員害怕。但身為一名合格的大數據運維工程師,kerberos基本上已成為必備技能之一。

  官方地址:
    https://web.mit.edu/kerberos/

3>.密鑰分發中心(Key Distribution Centor,簡稱"KDC")

  KDC是包含加密數據庫的Kerberos服務器,存儲與用戶,主機和服務相關的所有主體信息,包括它們的領域信息。

  除了以文件形式存儲的數據庫之外,KDC還包含兩個重要的組件,即認證服務(Authentication Sever,簡稱"AS")和Ticket Granting Server(簡稱"TGS")。

  AS和TGS一起處理受Kerberos保護的Hadoop集群的所有認證和訪問請求。

4>.認證服務(AS)

  一旦用戶成功地向AS進行了身份驗證,則AS向安全集群中的其他服務認證的客戶端授予Ticket Granting Ticket(簡稱"TGT")。這些票據(Ticket)是用於客戶端向服務器進行身份驗證,有一定時效的加密消息。然后,主體使用TGT來請求認證和訪問Hadoop服務。

5>.票證授予服務器(TGS)

  票據驗證服務器(TGS)驗證客戶端傳遞的TGT,然后給客戶端服務授予票據(Ticket),以便它們可以訪問Hadoop集群。服務票據(Ticket)使驗證后的主體能夠使用集群中的服務。

6>.Active Directory域(Relam)

  域是認證用戶的基本管理域,用於建立管理服務器對用戶,主機和服務進行身份驗證的邊界。每個hadoop用戶被分配到一個特定的郁。通常用大寫字母指定一個域,例如YINZHENGJIE.COM。可以有多個KDC,因此在單個網絡中可以有多個域。

7>.主體(Principal)

  主體(Principal)用於驗證一個用戶或者一個Service的唯一標識,相當於一個賬號,需要為其設置密碼。主體(Principal)是指定域的一部分用戶,宿主或服務。用戶主體和服務主體它通常是比較常見的。

  UNP表示普通用戶(例如:"jason@YINZHENGJIE.COM"或"jason/admin@YINZHENGJIE.COM"),SPN是運行Hadoop服務后台進程所必須的登錄名(例如:"yarn/hadoop101.yinzhengjie.com@YINZHENGJIE.COM"),包括HDFS和YARN等Hadoop服務。

8>.票據(Ticket)

  當用戶想要對Kerberos支持的集群進行身份驗證時,管理服務生成票據。該票據包含用戶名(通常與用戶主體相同),服務主體,客戶端的IP地址和時間戳等信息。票據具有一個可配置的最長生命周期和一個會話密鑰。用戶還可以在特定時間內對票據續期。

9>.keytab文件

  keytab文件是一個安全文件,其中包含領域所有服務主體的密碼。每個Hadoop服務都要求在所有主機上放置一個keytab文件。當kerberos需要更新服務TGT時,它會查找keytab文件。

10>.其他相關術語

  Kerberos KDC Server:
    KDC所在的服務器,即KDC服務的提供者。存儲與用戶,主機和服務相關的所有主體信息,包括它們的領域信息。

  Kerberos Client:
    任何一個需要通過KDC認證的機器(或模塊)。比如客戶端,需要做Kerberos 認證的機器。

  KDC Admin Account:
    KDC中擁有管理權限的用戶(例如添加,修改,刪除Principal)。即KDC管理員帳戶,有權添加其他Principal 

 

三.kerberos認證過程

  Kerberos認證過程非常簡單,涉及三個關鍵步驟:客戶端登錄到從AS獲取TGT的集群,TGS授權服務票據,用戶得到服務的認證。

  為了說明認證過程,我們使用以下組件:
    域:
      YINZHENGJIE.COM
    用戶主體:
      jason@YINZHENGJIE.COM
    服務主體:
      hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM
    KDC:
      kdc.yinzhengjie.com

  名為jason的用戶,具有jason@YINZHENGJIE.COM的UPN,其會按照以下過程對Kerberized Hadoop集群進行身份驗證,並訪問hdfs服務。
    (1)當用戶登錄到集群時,使用UPN(例如"jason@YINZHENGJIE.COM")與kdc.yinzhengjie.com聯系;
    (2)認證服務器(AS)向用戶授權TGT,TGT是用戶可以自己認證的令牌。TGT使用與用戶jason密碼相同的密鑰進行加密。對於服務主體,將存儲在主機上的keytab文件中的憑證傳遞給認證服務器;
    (3)用戶使用主體jason@YINZHENGJIE.COM的密碼解密TGT。在我們的示例中,用戶jason將TGT提供給kdc.yinzhengjie.com的TGS,以請求hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM服務。有了此服務票據客戶端能夠訪問安全集群。客戶端繼續使用相同的TGT對TGS進行多次請求,直到TGT到期;
    (4)TGS驗證了用戶sam提交的TGT后,它將他提供使用hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM的UPN密鑰加密的服務票據;
    (5)用戶jason接受到服務票據后,對安全集群中的特定服務進行身份驗證。一旦用戶jason向hdfs服務提供了服務票據,則該服務會使用UPN(hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM)的密鑰進行解密以驗證服務票據;
    (6)現在jason成功通過認證,hdfs服務運行用戶jason使用該服務。

 

四.Kerberos互信概述

  在現實生活中,一個企業可能會使用多個域來分離企業的不同部分,或由於其他原因使用多個域。這些域中的每一個域都擁有自己的KDC,每個KDC都認識屬於自己域的主體。

1>.一個特殊的主體(Principal

  每個kerberos數據庫中都有一個特殊的主體,其在建立兩個域之間的信任關系方面發揮了關鍵作用。該主體遵循krbgt/<REALM>@<REALM>格式,供AS和TGS內部使用。
    
  對於YINZHENGJIE.COM域,該主題為krbgt/YINZHENGJIE.COM@YINZHENGJIE.COM。kerberos使用這個特殊主體的密鑰對其發布的TGT進行加密。這是為了確保AS發布的TGT只能由TGS驗證。
    
  當在域之間建立單向或雙向信任時,特殊主體必須存在於兩個域中。這個主體的密碼在另兩個域中也需要保持一致。

2>.為什么需要Kerberos互信?

  如果來自域A的用戶要使用域B中的服務,顯然,必須為兩個域設置一個一起工作的方法。Kerberos互信是兩個域之間建立信任關系的方式,這使得來自一個域的主體可以訪問另一個域的服務。

  假設組織內有兩個不同的Kerberos域,可以將它們分別命名為"SALES.YINZHENGJIE.COM"和"HR.YINZHENGJIE.COM"。

  可以配置這兩個域之間的信任關系,使"SALES.YINZHENGJIE.COM"的用戶能夠信任來自"HR.YINZHENGJIE.COM"域的信息。當然,建立這種關系后第二個域也能夠信任來自第一個域的信息。

3>.什么是單向信任和雙向信任

  單向信任:
    單向信任允許域A的主體訪問域B,但不允許存儲在域B中的用戶訪問域A。單向信任是兩個域之間最常見的信任關系。
    一個公司通常希望允許存儲在公司Active Dirctory中的終端用戶訪問Hadoop集群。在這種情況下,在Hadoop集群中設置一個KDC來保存所有的SPN信息,UPN信息存放在Active Directory中。
    在單向信任下,用戶主體只存在於一個域中。例如,你有兩個域,分別命名為"SALES.YINZHENGJIE.COM"和"HR.YINZHENGJIE.COM",要他們建立單向信任關系。
    為此,必須在這兩個域中設置特殊主體krbgt。也就是說,HR域信任SALES域,必須在兩個域中設置主體"krbgt/HR.YINZHENGJIE.COM@SALES.YINZHENGJIE.COM"。

  雙向信任:
    在雙向信任下,兩個域的主體都可以訪問另一個域。這要求用戶主體在兩個域中都存在。
    因此,必須在兩個域中創建主體"krbgt/HR.YINZHENGJIE.COM@SALES.YINZHENGJIE.COM"和"krbgt/SALES.YINZHENGJIE.COM@HR.YINZHENGJIE.COM"。這將建立域HR和域SALES之間的完全信任關系。

 

五.Kerberos如何驗證用戶和服務

  配置Kerberos后,所有Hadoop服務獎通過Kerberos進行身份驗證,客戶端也需要向KDC進行身份驗證。

  用戶可以通過Hadoop RPC調用使用簡單認證和安全層(SASL)框架對NameNode和ResourceManager進行身份驗證。

  在SASL中,Kerberos充當身份驗證協議,驗證需要訪問到Hadoop服務的用戶。在此過程中涉及到三種類型的授權令牌:代理令牌,作業令牌和塊訪問令牌。下面對這幾個令牌做出解釋:
    代理令牌:
      代理令牌用於向NameNode驗證用戶。用戶通過Kerberos向NameNode驗證后,NameNode就向用戶提供代理令牌。
      用戶被驗證后,ResourceManager共享代理令牌,ResourceManager使用該令牌代表用戶訪問HDFS資源,它還會為長時間運行的作業創建令牌。
    作業令牌:
      當用戶向ResourceManager提交作業時,它創建一個與運行此MapReduce作業的所有DataNodes共享的密鑰。
      作業令牌確保經過身份驗證的用戶能夠訪問DataNode的本地文件系統中的授權作業和授權目錄。DataNodes還使用作業令牌進行安全的通信。
    塊訪問令牌:
      塊訪問令牌確保只有授權用戶訪問DataNodes上的HDFS數據。客戶端從NameNode接受到塊ID后,將從DataNodes中檢索數據。
      NameNode還發放客戶端發送到DataNode的塊訪問令牌以及數據塊訪問請求,用於數據訪問。

 

六.博主推薦閱讀

  部署Kerberos實戰案例:
    https://www.cnblogs.com/yinzhengjie2020/p/13543893.html

  配置Kerberos實戰案例:
    https://www.cnblogs.com/yinzhengjie2020/p/13580601.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM