Kerberos身份驗證在ChunJun中的落地實踐

来源:https://www.cnblogs.com/DTinsight/archive/2022/12/16/16986978.html
-Advertisement-
Play Games

Kerberos,在古希臘神話故事中,指的是一隻三頭犬守護在地獄之門外,禁止任何人類闖入地獄之中。 那麼在現實中,Kerberos指的是什麼呢? 一、Kerberos介紹 01 Kerberos是什麼 根據百度詞條釋義,Kerberos是一種電腦網路授權協議,用來在非安全網路中,對個人通信以安全的 ...


Kerberos,在古希臘神話故事中,指的是一隻三頭犬守護在地獄之門外,禁止任何人類闖入地獄之中。

那麼在現實中,Kerberos指的是什麼呢?

一、Kerberos介紹

01 Kerberos是什麼

根據百度詞條釋義,Kerberos是一種電腦網路授權協議,用來在非安全網路中,對個人通信以安全的手段進行身份認證。Kerberos旨在通過密鑰加密技術為客戶端/伺服器應用程式提供身份驗證,主要用在域環境下的身份驗證。

在此之前,通常只有伺服器的運維管理人員在配置Active Directory之類的東西時才會接觸到Kerberos,但隨著大數據的流行,整個Hadoop生態圈在安全方面對於Kerberos愈發依賴,同時由於Kerberos認證必須入侵式改造代碼的特點,使得越來越多的大數據開發同學開始接觸到Kerberos。

02 Kerberos 解決了什麼問題

目前用於身份密碼的驗證主要面臨兩個問題:首先是人工記憶的密碼混亂且易遺忘,一些比較簡單的密碼又容易被攻擊;其次是技術錯覺,在電腦上的輸入密碼時顯示的是一串星號,大家誤以為很安全,實際上電腦通過網路發送密碼基本是發送“明文”密碼,大部分密碼都處於“裸奔”狀態。

Kerberos的出現很好的解決了這個問題,它減少了每個用戶使用整個網路時必須記住的密碼數量——只需記住 Kerberos 密碼,同時Kerberos結合了加密和消息完整性來確保敏感的身份驗證數據不會在網路上透明地發送。通過提供安全的身份驗證機制,Kerberos為最終用戶和管理員提供了明顯的好處。

03 Kerberos 基本概念

principal 是Kerberos 世界的用戶名,用於標識身份,每個用戶都會有一個 principal,如果 principal 失效或者不正確,那麼這個用戶將無法訪問任何資源。principal 主要由三部分構成:primary,instance(可選) 和 realm。

file

● primary

主體,每個 principal 都會有的組成部分,代表用戶名(username)或服務名(service name)。

● instance

用於服務主體以及用來創建用於管理的特殊主體。instance 用於服務主體時的一般會用於區分同一服務在不同伺服器上的服務實例,因此與 primary 組成的 principal 一般用於 server 端,如:NameNode,HiverServer2,Presto Coordinator等。

instance 用來創建用於管理的特殊主體時,一般來區分同一個用戶的不同身份,如區分擔任管理員角色的 a 用戶與擔任研發的 a 用戶。

● realm

realm 是認證管理功能變數名稱,用來創建認證的邊界,只有在同屬於一個認證服務的邊界內,這個認證服務才有權利認證一個用戶、主機或者服務。每個域都會有一個與之對應的 kdc 服務用於提供域內的所有服務的認證服務。

● keytab

"密碼本",包含了多個 principal 與密碼的文件,用戶可以利用該文件進行身份認證。

● ticket cache

客戶端與 KDC 交互完成後,包含身份認證信息的文件,短期有效,需要不斷renew。

file

04 Kerberos 的認證簡介

file

參與 Kerberos 認證過程中的角色:

  1. 訪問服務的 Client;

  2. 提供服務的 Server;

  3. DC是Domain Controller的縮寫,即域控制器;AD是Active Directory的縮寫,即活動目錄。DC中有一個特殊用戶叫做krbtgt,它是一個無法登錄的賬戶,是在創建域時系統自動創建的,在整個Kerberos認證中會多次用到它的Hash值去做驗證。

  4. KDC(Key Distribution Center)密鑰分發中心。在KDC中又分為兩個部分:Authentication Service(AS,身份驗證服務)和Ticket Granting Service(TGS)

  5. AD會維護一個Account Database(賬戶資料庫), 它存儲了域中所有用戶的密碼Hash和白名單,只有賬戶密碼都在白名單中的Client才能申請到TGT。

05 Kerberos詳細認證流程

1. Client with AS

客戶端(Client)向 AS(Authentication Service)發送請求獲取 TGT(ticket grant ticket)

file

2. Client with TGS

客戶端(Client)向 TGS(Ticket Granting Service,)發送請求獲取ST(Service Ticke)

file

客戶端(Client)向服務端(Server)發送認證請求進行認證,如果客戶端(Client)要求進行雙向認證,服務端(Server)額外發送認證請求至客戶端(Client)進行認證。

file

3.Kerberos 與 JAAS可插拔的認證模塊

JAAS jdk 在1.4引入的一種可插拔的認證模塊( Pluggable Authentication Module,PAM )的安全體繫結構,這意味著可以通過改變模塊,支持從一種安全協議組件無縫的切換到另一個協議組件。

同時這種體系架構定義的介面無需修改代碼即可實現加入多種認證技術和授權機制,因為 JAAS API 定義了應用程式代碼與實際驗證邏輯之間的抽象,這個抽象不用重新編譯現有的應用程式代碼就可以作為登錄模塊的運行時替代。

這種實現方式是通過應用程式只調用 LoginContext 介面,而認證技術的實際提供程式則是基於 LoginModule 介面進行開發的,在運行時LoginContext 通過讀取配置文件確定使用哪些認證模塊來對應用程式進行認證。

file

二、ChunJun任務提交中的Kerberos認證

接下來我們來大家介紹下ChunJun任務提交中的 Kerberos 認證,我們可以參考ChunJun的 readme 文檔中的 yarn session 部分:

https://github.com/DTStack/chunjun/blob/master/README_CH.md

file

首先,我們需要啟動一個 yarn session 環境,進入 Flink 的 bin 目錄下執行 yarn-session 腳本啟動 flink session 並使用 -t 參數上傳 ChunJun 的依賴包。

file

當我們執行 yarn-session 時,腳本內部會調用 java 命令運行 FlinkYarnSessionCli 這個類的 main 方法。在 FlinkYarnSessionCli 的 main 方法中,首先需要安裝一個全過程的安全配置,然後獲得一個安裝後的上下文,並且在上下文中運行 run 方法。

file

在 run 方法中我們構建了一個 YarnClusterDescripter 對象,這個對象中封裝了 Flink 所依賴的配置文件和 jar 包等。而後再調用YarnClusterDescripter 對象的 DeploySessionClister 方法將任務提交到 yarn 集群。至此完成了 Flink session 到 Yarn 的一個提交。

file

我們再回顧下整體的提交流程:

file

● Flink => HDFS

Flink 需要將配置文件以及 session 所依賴的 jar 上傳至 HDFS,因此需要與 HDFS 進行通信

● Flink => Yarn

Flink 需要向 Yarn 申請資源,因此需要與 Yarn 進行通信

Flink => Zookeeper

如果 Flink 配置了基於 zookeeper 的高可用,那麼 JobManager 需要在 Zookeeper 註冊 leader 節點,客戶端還需要從 Zookeeper 上的 leader 節點獲取 webMonitorUrl,因此需要與 Zookeeper 通信

1.SecurityUtils.java

file

2.SecurityUtils#install 方法中首先通過 installModules 方法對 Flink 內部的安全模組進行了 install(其中包括Hadoop、Jaas、Zookeeper 模組)

file

3.SecurityUtils#installContext 方法對安全上下文進行初始化(獲得 HadoopSecurityContext,其中包含這 hadoop 的認證憑證 ugi)

file

$Flink_HOME/conf/Flink-conf.yaml

security.Kerberos.login.use-ticket-cache: 是否從你的Kerberos ticket緩存中讀取

security.Kerberos.login.keytab: 包含用戶憑證的Kerberos keytab文件的絕對路徑。

security.Kerberos.login.principal: 與keytab相關的Kerberos principal名稱。

security.Kerberos.krb5-conf.path:指定 krb5.conf 文件的本地位置。如果定義了,這個conf將被掛載到Kubernetes、Yarn和Mesos的JobManager和TaskManager容器/桶上。註意: 需要在容器內部可訪問到定義的 KDC 的地址。

security.Kerberos.login.contexts: 用逗號分隔的登錄上下文列表,以提供Kerberos憑證(例如,Client,KafkaClient用於ZooKeeper認證和Kafka認證的憑證)。

zookeeper.sasl.service-name: 預設為 "zookeeper"。如果ZooKeeper quorum配置了一個不同的服務名稱,那麼可以在這裡提供。

zookeeper.sasl.login-context-name: 預設為 "Client"。該值需要與 "security.Kerberos.login.contexts"中配置的值之一相匹配。

file

04 ChunJun 提交流程中的 Kerberos

執行 ChunJun-Yarn-session.sh 提交任務,ChunJun-Yarn-session.sh 實際上只是對任務的腳本路徑進行了檢查校驗,然後再執行 submit.sh 腳本啟動任務提交進程。

file

Launcher 的 main 方法中主要對不同的任務執行模式進行區分並交給各個模式具體的任務提交類去提交任務。

file

YarnSessionClusterClientHelper 將任務的配置以及依賴的 jar 進行組裝獲得 YarnClusterDescriptor 對象。再將任務提交到對應的 Flink session 上。

file

三、ChunJun Connector 中的Kerberos 認證

接下來為大家介紹 ChunJun Connector 中的 Kerberos 認證 。

01ChunJun 插件中的 Kerberos

以 ChunJun HDFS Connector 為例:

插件在 openInputFormat 方法中會對任務的目標數據源 HDFS 是否開啟了 Kerberos 進行判斷,如果開啟了 Kerberos,則會根據配置的認證文件進行認證並獲取認證後的 ugi,ugi 可以認為是之後插件與 HDFS 通信的用戶憑證,裡面保存著用戶的認證信息.

file

02 如何進行Kerberos 認證

● OpenInputFormat 方法

OpenInputFormat 方法是 Flink 對運算元的每個實例進行初始化是都會執行的方法,ChunJun 的BaseRichInputFormat 也實現了該方法,我們開發插件也都會去實現該方法。

對於每個運算元實例來說,Kerberos 認證只會進行一次(不包括認證過期後的刷新),因此 Kerberos 認證的代碼應該在該方法中實現.

file

● 開發 hadoop 生態中的數據源組件

一般而言,Hadoop 生態中的數據源組件如:HDFS、HBase、Hive 等都是用 ugi(UserGroupInformation) 進行 Kerberos 認證。

ChunJun 內部也提供了相關的工具類用於獲取登錄後的 ugi:com.dtstack.ChunJun.util.FileSystemUtil#getUGI

● 開發 Zookeeper、Kafka 等組件

這類組件開啟 Kerberos 認證後,用戶需要在插件端配置 jaas.conf 文件,再通過各個組件提供的參數配置項配置組件所選用的 jaas.conf 的 entry,即可完成 Kerberos 配置。

03 如何排查 Kerberos 認證問題

$Flink_HOME/conf/Flink-conf.yaml

jvm 啟動參數中增加 “-Dsun.security.krb5.debug=true”

env.java.opts:用於配置啟動所有Flink進程的JVM 參數

env.java.opts.jobmanager:用來配置啟動 JobManager 的 JVM 參數

env.java.opts.taskmanager:用來配置啟動 TaskManager 的 JVM 參數

env.java.opts.historyserver:用來配置啟動 HistoryServer 的 JVM 參數

env.java.opts.client:用來配置啟動 Flink Client 的 JVM 參數

04 Kerberos 認證常見問題

1.javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

此消息表明一個操作嘗試要求以Kerberos的user/host@realm身份認證的操作,但票據cache中沒有用於user/host@realm的票據。

用戶環境引用的策略/票證緩存文件丟失、不可讀(許可權)、損壞或無效票證續簽壽命設置為零

票證授予票證(TGT)不存在,因為服務A需要將命令作為服務B運行,但尚未正確配置為允許模擬服務B

票證更新尚未執行/未成功。這可能是由於CDH 5.3之前的HBASE或CDH5.2之前的Hive / Sentry缺陷引起的

該用戶的憑據尚未在KDC中生成

執行了手動步驟,例如hadoop fs -ls,但是用戶從未通過Kerberos身份驗證

Oracle JDK 6 Update 26或更早版本無法讀取由MIT Kerberos 1.8.1或更高版本創建的Kerberos憑證高速緩存。

某些版本的Oracle JDK 8可能會遇到此問題

2.javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Fail to create credential. (63) - No service creds)]

由JDK缺陷引起

票證消息對於UDP協議而言太大

主機未正確映射到Kerberos領域

3.Found unsupported keytype(18)

確保正確安裝了與JDK相匹配的無限強度策略文件的正確版本

確保對策略文件(位於jdk目錄中,例如/usr/java/jdk1.7.0_67-cloudera/jre/lib/security/)的許可權能夠被所有用戶讀取。

確保文件已部署到集群軟體正在使用的jdk中

有關詳細信息,使用以下的(鏈接以匹配關鍵字類型號18在該實例中)將其加密類型http://www.iana.org/assignments/Kerberos-parameters/Kerberos-parameters.xml(AES256-CTS-HMAC-此示例為sha1-96)

4.GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)

hostname或要訪問的URL與keytab中列出的主機之間發生主機名不匹配。造成這種情況的原因多種多樣,包括但不限於:

多網卡(NIC)伺服器,以使來自主機的數據包的IP地址與通過主機解析返回的IP不匹配

負載平衡器和後續的主機名解析問題

DNS和主機名解析問題/不一致

反向DNS(必需)主機名解析問題/不一致

在krb5.conf中主機正在映射到參數[domain_realm]的錯誤域,這或者是通過其他的krb5.conf配置,或者是通過KDC配置。預設參數情況下,除非使用[domain_realm]等進行顯式配置,否則主機名(例如:“ crash.EXAMPLE.com ”)將映射到域“ EXAMPLE.com ” 。請參見MIT Kerberos文檔:[domain_realm]

如果嘗試在Cloudera Manager中執行“ Generate Credentials ”步驟(在更高版本中重命名為“ Generate Missing Credentials ”)時發生此錯誤,則可能是由於導入到Cloudera Manager資料庫中的管理員帳戶詳細信息不再與主機匹配,例如Cloudera Manager伺服器的主機名在上一次導入後隨後更改了。

視頻回放&PPT獲取

  • 視頻回看:

https://www.bilibili.com/video/BV1mD4y1h7ce/?spm_id_from=333.999.0.0

  • 課件獲取:

關註公眾號“ChunJun”,後臺私信“課件”獲得直播課件

想瞭解或咨詢更多有關袋鼠雲大數據產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網:https://www.dtstack.com/?src=szbky

同時,歡迎對大數據開源項目有興趣的同學加入「袋鼠雲開源框架釘釘技術qun」,交流最新開源技術信息,qun號碼:30537511,項目地址:https://github.com/DTStack


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

-Advertisement-
Play Games
更多相關文章
  • 當我們在使用MediaElement控制項播放HDR視頻時會遇到顏色發灰、泛黃的情況,難道是因為控制項做的有問題? 其實並不是程式問題,只是我們普通的應用程式工作在8bit色深的環境中,而HDR色深為10bit起步。 HDR視頻色彩空間為BT.2020 10bit色深。 SDR視頻(一般視頻)色彩空間基 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦MCX系列MCU的新品MCXN947。 自 2015 年恩智浦和飛思卡爾合併成新恩智浦之後,關於它們各自的 Arm Cortex-M 內核通用微控制器代表作系列 LPC 和 Kinetis 接下來怎麼發展一直沒有定論(兩個系列都在 ...
  • 文件系統是一種存儲和組織電腦數據的方法,它使得對電腦的訪問和查找變得容易,文件系統使用文件和樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理設備使用數據塊的概念,用戶使用文件系統來保存數據不必關心數據實際保存在硬碟(或者光碟)的地址為多少的數據塊上,只需要記住這個文件所屬目錄和文件名。在寫入新數據之... ...
  • 這是我準備新開的學習記錄系列之一 今天寫一個插件的介紹吧—— Helium —— 視頻懸浮插件 youtube/b站/本地視頻都可以導入 主要功能就是你在看視頻時,要記一些學習筆記,隨著不斷往下寫,視頻會出現被擋住的情況。 這個時候Helium就能幫上大忙!首先點擊右上角三個點點,打開插件市場下載H ...
  • 個人名片: 對人間的熱愛與歌頌,可抵歲月冗長:sun_with_face: Github👨🏻‍💻:念舒_C.ying CSDN主頁✏️:念舒_C.ying 個人博客:earth_asia: :念舒_C.ying Web伺服器也稱為WWW(World Wide Web)伺服器,主要功能是提供網頁 ...
  • 個人名片: 對人間的熱愛與歌頌,可抵歲月冗長:sun_with_face: Github👨🏻‍💻:念舒_C.ying CSDN主頁✏️:念舒_C.ying 個人博客:earth_asia: :念舒_C.ying 1 配置環境 掛載系統ISO,並配置好本地dnf源。(前面的文章講過,這裡就略過. ...
  • TencentOS Tiny AIoT 應用創新大賽是騰訊 TencentOS 團隊聯合恩智浦半導體、安謀科技(Arm China)發起的線上開發者活動,主要面向中小企業嵌入式工程師、廣大嵌入式開發者、物聯網愛好者、創客團隊等,號召廣大開發者能參與到國內開源項目中,通過開源協同,基於 Tencent ...
  • 摘要:openGemini是華為雲面向物聯網和運維監控場景開源的一款雲原生分散式時序資料庫,相容InfluxDB API,具有高性能、高併發、高擴展等特點。 openGemini是華為雲面向物聯網和運維監控場景開源的一款雲原生分散式時序資料庫,相容InfluxDB API,具有高性能、高併發、高擴展 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...