JuiceFS 商業版 v4.8 新功能: 增強 Kerberos 和 Ranger 支援

語言: CN / TW / HK

在企業級 Hadoop 生產環境中,使用者經常會使用到的兩個安全類元件:Kerberos 和 Apache Ranger。 在之前的 JuiceFS 商業版本中,JuiceFS Hadoop SDK 相容了這兩個元件,但使用者沒法使用這些元件提供的功能 。比如,在 Kerberos 環境下,JuiceFS 無法驗證使用者的合法性,只能使用 Kerberos 登入後的使用者名稱;JuiceFS 同樣也無法使用配置在 Apache Ranger 內的許可權管理規則。

JuiceFS 商業版從 v4.8 開始,JuiceFS Hadoop SDK 開始全面支援使用 Kerberos 和Apache Ranger 這兩個元件。 戶可以在 JuiceFS 雲服務中使用該特性,注意:SDK 需要升級到 v4.8 以上版本。

元件1:Kerberos

HDFS 使用 UserGroupInformation.getCurrentUser() 方法獲取客戶端使用者名稱,當沒有啟動 Kerberos 用於身份驗證時,客戶端可以通過 HADOOP_USER_NAME 環境變數指定任意使用者名稱,甚至是 superuser(擁有所有許可權,可以任意刪除修改檔案),這將給叢集的安全帶來極大的隱患。

JuiceFS 的 Hadoop SDK 同樣也是使用  UserGroupInformation.getCurrentUser()  獲得的客戶端使用者名稱,在之前沒有支援 Kerberos 時,也存在上述隱患。

1. Kerberos 簡介

Kerberos 是一種網路身份驗證協議,它旨在通過使用金鑰加密技術為 Client/Server 應用程式提供強身份驗證。網際網路是不安全的,如果 Password 通過網路傳輸,很容易被劫取。因此可以通過 Kerberos 協議實現一個安全的單點登入服務(SSO),整個過程 Password 均沒有通過網路傳輸。

下面大概介紹一下認證流程:

Client 和 Server 均是 KDC 裡的一個使用者(Principal),需要提前在 KDC 裡面新增。

大概流程:

  1. Client 通過自己的 Principal 和 Keytab (password) 登入 KDC 裡面的 AS, AS 會返回一張臨時票據(TGT),此 TGT 會有過期資訊。

  2. Client 通過上一步獲得的臨時票據(TGT)向 KDC 的 TGS 請求需要訪問的 Server Principal 的臨時票據(ST)。

  3. Client 通過上一步獲得的臨時票據(ST)向 Server 發起請求。Server 端使用自己的 Keytab 可以驗證 Client Principal 發來的請求。

整個過程只有第一步涉及到使用者 Password。但其實 Password 並沒有通過網路傳送。而是通過 AS 返回的 TGT 裡面的加密內容 Client 是否能解密來判斷是否登入成功。TGS 和 Server 會根據 Client 端從 KDC 獲得的 TGT 和 ST 驗證 Client 的真實性。

從圖上可以看出,Server 端並不需要和 KDC 直接通訊。

本文重點並不在 Kerberos 上,具體的驗證原理不作過多展開。

2. Kerberos In JuiceFS

相比於直接信任 Client 輸入的使用者名稱,當 JuiceFS Metadata Service 開啟 Kerberos 認證後,Client 在訪問 JuiceFS Metadata Service 前需要先通過 Kerberos 認證。JuiceFS Client 和 JuiceFS Metadata Service 端各自有其 Principal 對應的 Keytab 檔案。

流程圖如下:

  1. 首先客戶端通過 kinit 或者 Keytab 檔案從 KDC 獲得 TGT ,然後在用此 TGT 向 KDC 申請需要訪問的 JuiceFS Metadata Principal 對應的 ST。

  2. 客戶端通過 ST 向 JuiceFS meta 發起驗證請求。JuiceFS meta 根據自己的 Metadata Principal 對應的 Keytab 即可驗證客戶端的身份。

從上圖可以看到, JuiceFS 的 Kerberos 身份認證只涉及 Client 和 Metadata Service 之間的認證 。Client 和物件儲存之間不涉及 Kerberos 身份認證。

3. JuiceFS DelegationToken

在前面的通過 Kerberos 認證的過程中,TGT 是可以快取在本地的,但是用來通過 JuiceFS Metadata Service 認證的 ST 卻無法快取,也就是 Client 每次初始化都需要向 KDC 發起請求。

在 YARN 任務中,通常會同時啟動大量的程序訪問 JuiceFS。如果每個 Client 都需要向 KDC 請求對應 JuiceFS Metadata Service 的 ST,將會給 KDC 帶來極大壓力。為了解決這個問題,JuiceFS 參考 HDFS 實現了 DelegationToken 驗證。

DelegationToken流程圖:

  1. Submit client 首先需要通過 Kerberos 認證和 JuiceFS meta 建立連線;

  2. 建立連線後,計算框架(MR,Spark)會呼叫 FileSystem.getDelegationToken 方法從 JuiceFS meta 申請 delegation token;

  3. 計算框架會把 delegation token 一併傳送到 YARN Resourcemanager,Resourcemanager 會負責這些 token 的生命週期管理(renew, cancel);

  4. 具體任務節點啟動後,YARN Resourcemanager 會把 delegation token 傳送給 Task client;

  5. Task client 通過 delegation token 進行身份認證。

DelegationToken 是臨時的, ResourceManager 會維護 ApplicationId 和其對應的 DelegationToken,同時也會定期 renew 這些 token。DelegationToken 生命週期管理由 org.apache.hadoop.yarn.server.resourcemanager.security.DelegationTokenRenewer 負責。

每個 token 都會有一個最大生命週期 maxDate,預設 7 天。如果程式執行時間大於 7 天,需要設定引數 yarn.resourcemanager.proxy-user-privileges.enabled=true,這樣在到期前,DelegationTokenRenewer 會通過代理使用者機制重新為任務使用者重新申請一個新的 DelegationToken。

元件2:Apache Ranger

HDFS 預設使用類似於 POSIX 檔案系統許可權管理的方式管理檔案許可權。另外也提供了對 POSIX ACL 的支援,為特定的指定使用者或指定組提供更細化的規則來增強檔案許可權。Apache Ranger 為 HDFS 提供了類似於 POSIX ACL 的能力,可以更方便使用 RangerAdmin Web UI 統一管理。

1. Ranger In HDFS

HDFS NameNode 服務通過 Ranger HDFS Plugin 定時從 RangerAdmin 服務獲得使用者所配置的規則並存儲在本地磁碟和記憶體中,後續 HDFS 客戶端的請求會通過 Ranger HDFS Plugin 使用這些規則進行驗證。

如果開啟 AuditLog,Ranger HDFS Plugin 則會將它們寫入配置的 AuditLog 儲存,以供使用者通過 RangerAdmin 查詢。

2. Ranger in JuiceFS 

JuiceFS 商業版 v4.8 版本的 Hadoop SDK 同樣也支援使用 Ranger 做許可權管理。

由於 JuiceFS 雲服務是 SaaS 服務,不能直接連線客戶內網所佈置的 RangerAdmin 服務,所以在實現上和 HDFS 有所不同。

JuiceFS 與 RangerAdmin 的通訊是由部署在客戶網路的 JuiceFS Hadoop SDk 客戶端去完成的。JuiceFS 客戶端會定期從 RangerAdmin 讀取最新的規則,並存入 JuiceFS。為了避免很多客戶端同時訪問 RangerAdmin 造成很大壓力,JuiceFS 會任意選出一個客戶端和 RangerAdmin 通訊,其他客戶端只需要從 JuiceFS 讀取更新規則即可。

規則的驗證由 JuiceFS 客戶端去完成。

由於大資料系統可能會同時存在很多 JuiceFS 客戶端,如果每個客戶端都同時寫入 AuditLog 儲存,可能會帶來比較大的壓力。 因此暫時沒有實現 AuditLog 功能。

請注意,如果在 JuiceFS雲服務中使用以上功能,請使用 v4.8 以上版本的 JuiceFS Hadoop SDK。

參考文件:

  1. 在 JuiceFS 使用 Kerberos 實現使用者認證:https://www.juicefs.com/docs/zh/cloud/hadoop/for-kerberos/

  2. 在 JuiceFS 使用 Apache Ranger:

    https://www.juicefs.com/docs/zh/cloud/hadoop/for-ranger/

  3. Hadoop Delegation Tokens Explained - Cloudera Blog:https://blog.cloudera.com/hadoop-delegation-tokens-explained/

關於作者:

湯友棚,6 年大資料從業經驗,負責 JuiceFS 在 Hadoop 生態中的研發工作。

瞭解更多 JuiceFS 商業版

歡迎與我們交流

合夥人 蘇銳全天線上

使用者案例

一面資料 Hadoop 上雲      AI-雲知聲    

AI for Science-深勢科技

   理想汽車 :從Hadoop 到雲上     知乎    

線上設計平臺:稿定科技   

大搜車      環球易購     趣頭條      Shopee

攜程冷資料場景

最佳實踐

關於Juicedata

Juicedata,杭州果汁資料科技有限公司是一家企業級儲存服務供應商,開發了雲原生分散式檔案系統 JuiceFS,致力於在大資料時代下,為客戶打造安全、高效能、自主可控的儲存基礎設施及服務。

2021年,JuiceFS 正式在 GitHub 上開源,已經獲得 6.3 K star,歡迎開發者加入我們。  (github.com/juicedata/juicefs)

:point_down: 訪問官網