解釋 Hadoop Delegation Token 上篇
-
避免未經授權存取儲存在 HDFS 的資料
-
在實現 1 號目標時不增加太多成本。
-
存取叢集的任何用戶端均經驗證,確保他們所宣稱的身份屬實。
-
叢集的任何伺服器均經驗證,確實屬於該叢集。
- 最終使用者 (joe) 可以使用 Kerberos 與 HDFS NameNode 通訊
- 最終使用者 (joe) 提交的所分發的任務可以使用 joe 的 Delega-tion Token 存取 HDFS NameNode。
- HDFS DataNodes 使用 Kerberos 與 HDFS NameNode 通訊
- 最終使用者和所分發的任務可以使用 Block Access Token 存取 HDFS DataNodes。
圖 2:簡圖顯示 Hadoop 的驗證擴展問題
- 用戶端一開始會透過 Kerberos 驗證每個伺服器,並從該伺服器取得一個 Delegation Token。
- 該用戶端使用 Delegation Token 而不是 Kerberos 進行該伺服器的後續驗證。
- 派發 Delegation Token,以及儲存它們供驗證使用。
- 根據請求更新 Delegation Token。
- 移除 Delegation Token,或因為用戶端取消之,或是因為 token 逾時。
- 針對所儲存的 Delegation Token 去審核所提供的 Delegation Token,藉此驗證用戶端。
公開資訊以識別碼物件的形式用於token 識別。它包含:
種類 |
token 種類(HDFS_DELEGATION_TOKEN 或kms-dt)。token 也含有種類,與識別碼種類相符。 |
擁有者 |
擁有token 的使用者。 |
更新者 |
可以更新token 的使用者。 |
真實使用者 |
唯有擁有者是模擬使用者時才相關。若是該token 由模擬的使用者建立,便會識別出那位模擬的使用者。 例如,當oozie 模擬使用者joe 時,擁有者會是joe 而真實使用者是oozie。 |
派發日期 |
派發token 的epoch 時間。 |
最長日期 |
直至token 可更新為止的時間。 |
順序號碼 |
識別token 的UUID。 |
主要金鑰ID |
用來建立和檢驗token 的主要金鑰之ID。 |
表1:Token 識別碼(Delegation Token 的公開部份)
renewDate
|
預計更新token 的epoch 時間。
若是小於目前時間,則表示token 已逾期。
|
password
|
作為Token 識別碼的HMAC 所計算出來的密碼,使用主要金鑰作為HMAC 金鑰。
它用來驗證由用戶端提供給伺服器的Delegation Token。
|
trackingId
|
追蹤識別碼可以橫跨多個用戶端工作階段聯結一個token 的使用率。
它是作為token 識別碼的MD5 進行運算。
|
表2:Delegation Token 資訊(Delegation Token 的私密部份)
- 向伺服器請求新的Delegation Token。請求token 時可以指定更新者。
- 更新Delegation Tokens (若用戶端指定本身為「更新者」,或是要求另一方(指定的「更新者) 更新Delegation Token。
- 請求伺服器取消Delegation Token。
- 交出一個Delegation Token 來驗證伺服器。
識別碼
|
Token 識別碼,與伺服器端的公開資訊相符。
|
密碼
|
密碼,與伺服器端的密碼相符。
|
種類
|
Token 種類(例如HDFS_DELEGATION_TOKEN 或kms-dt),它與識別碼的種類相符。
|
服務
|
服務的名稱(例如HDFS 的是ha-hdfs:
|
更新者
|
可以更新token 的使用者(例如yarn)。
|
$ hadoop jar /opt/cloudera/parcels/CDH/jars/hadoop-mapreduce-examples-2.6.0-cdh5.13.0.jar pi 2 3 Number of Maps = 2 Samples per Map = 3 Wrote input for Map #0 Wrote input for Map #1 Starting Job 17/10/22 20:50:03 INFO client.RMProxy: Connecting to ResourceManager at example.cloudera.com/172.31.113.88:8032 17/10/22 20:50:03 INFO hdfs.DFSClient: Created token for xiao: HDFS_DELEGATION_TOKEN owner=xiao@GCE.CLOUDERA.COM, renewer=yarn, realUser=, issueDate=1508730603423, maxDate=1509335403423, sequenceNumber=4, masterKeyId=39 on ha-hdfs:ns1 17/10/22 20:50:03 INFO security.TokenCache: Got dt for hdfs://ns1; Kind: HDFS_DELEGATION_TOKEN, Service: ha-hdfs:ns1, Ident: (token for xiao: HDFS_DELEGATION_TOKEN owner=xiao@GCE.CLOUDERA.COM, renewer=yarn, realUser=, issueDate=1508730603423, maxDate=1509335403423, sequenceNumber=4, masterKeyId=39) 17/10/22 20:50:03 INFO security.TokenCache: Got dt for hdfs://ns1; Kind: kms-dt, Service: 172.31.113.88:16000, Ident: (kms-dt owner=xiao, renewer=yarn, realUser=, issueDate=1508730603474, maxDate=1509335403474, sequenceNumber=7, masterKeyId=69) … |
圖中顯示一般的 5 個步驟:
-
用戶端要在叢集執行一個工作。它從 HDFS NameNode 取得 HDFS Delegation Token,以及從 KMS 取得 KMS Delegation Token。
- 用戶端把工作提交至 YARN Resource Manager (RM),傳遞它剛取得的 Delegation Token 以及 ApplicationSubmissionContext。
-
YARN RM 會馬上更新 Delegation Token,藉此檢驗它的有效性。然後它啟動 (與 Delegation Token 一起) 分發到叢集的工作節點的工作。
-
每個工作節點在存取 HDFS 資料時會使用 HDFS Delegation Token 對 HDFS 進行驗證,當它們在加密區解密 HDFS 檔案時則使用 KMS Delegation Token 對 KMS 進行驗證。
-
在完成工作後,RM 會取消該工作的 Delegation Token。
…. 17/10/22 20:50:12 INFO mapreduce.Job: Job job_1508730362330_0002 failed with state FAILED due to: Application application_1508730362330_0002 failed 2 times due to AM Container for appattempt_1508730362330_0002_000002 exited with exitCode: -1000 For more detailed output, check application tracking page:https://example.cloudera.com:8090/proxy/application_1508730362330_0002/Then, click on links to logs of each attempt. Diagnostics: org.apache.hadoop.security.authentication.client.AuthenticationException: org.apache.hadoop.security.token.SecretManager$InvalidToken: token (kms-dt owner=xiao, renewer=yarn, realUser=, issueDate=1508730603474, maxDate=1509335403474, sequenceNumber=7, masterKeyId=69) is expired, current time: 2017-10-22 20:50:12,166-0700 expected renewal time: 2017-10-22 20:50:05,518-0700 …. Caused by: org.apache.hadoop.security.authentication.client.AuthenticationException: org.apache.hadoop.security.token.SecretManager$InvalidToken: token (kms-dt owner=xiao, renewer=yarn, realUser=, issueDate=1508730603474, maxDate=1509335403474, sequenceNumber=7, masterKeyId=69) is expired, current time: 2017-10-22 20:50:12,166-0700 expected renewal time: 2017-10-22 20:50:05,518-0700 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) … at org.apache.hadoop.crypto.key.kms.KMSClientProvider.call(KMSClientProvider.java:535) … |