安全模式下的 Hadoop

簡介

在預設組態中,我們預期您會透過限制所有網路存取,確保攻擊者無法存取您的 Hadoop 叢集。如果您想要限制誰可以遠端存取資料或提交作業,您必須確保 Hadoop 叢集的驗證和存取,如本文所述。

當 Hadoop 組態為在安全模式下執行時,每個 Hadoop 服務和每個使用者都必須由 Kerberos 驗證。

必須正確組態所有服務主機的正向和反向主機查詢,才能讓服務彼此驗證。主機查詢可以使用 DNS 或 /etc/hosts 檔案組態。建議在嘗試以安全模式組態 Hadoop 服務前,先了解 Kerberos 和 DNS 的工作原理。

Hadoop 的安全性功能包括 驗證服務層級授權網頁主控台驗證資料機密性

驗證

最終使用者帳戶

當服務層級驗證開啟時,最終使用者必須在與 Hadoop 服務互動前驗證自己。最簡單的方式是讓使用者使用 Kerberos kinit 命令 進行互動式驗證。如果使用 kinit 進行互動式登入不可行,可以使用 Kerberos keytab 檔案進行程式化驗證。

Hadoop Daemon 的使用者帳戶

確保 HDFS 和 YARN daemon 以不同的 Unix 使用者身分執行,例如 hdfsyarn。此外,確保 MapReduce JobHistory 伺服器以不同的使用者身分執行,例如 mapred

建議讓他們共用一個 Unix 群組,例如 hadoop。另請參閱「從使用者對應到群組」以進行群組管理。

使用者:群組 守護程序
hdfs:hadoop NameNode、Secondary NameNode、JournalNode、DataNode
yarn:hadoop ResourceManager、NodeManager
mapred:hadoop MapReduce JobHistory 伺服器

Hadoop 守護程序的 Kerberos 主體

每個 Hadoop 服務實例都必須設定其 Kerberos 主體和 keytab 檔案位置。

服務主體的一般格式為 ServiceName/_HOST@REALM.TLD。例如:dn/_HOST@EXAMPLE.COM

Hadoop 允許將服務主體的主機名稱元件指定為 _HOST 萬用字元,簡化了設定檔的部署。每個服務實例會在執行階段將 _HOST 替換為自己的完整合格主機名稱。這允許管理員在所有節點上部署同一組設定檔。不過,keytab 檔案會有所不同。

HDFS

每個 NameNode 主機上的 NameNode keytab 檔案應如下所示

$ klist -e -k -t /etc/security/keytab/nn.service.keytab
Keytab name: FILE:/etc/security/keytab/nn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

該主機上的 Secondary NameNode keytab 檔案應如下所示

$ klist -e -k -t /etc/security/keytab/sn.service.keytab
Keytab name: FILE:/etc/security/keytab/sn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

每個主機上的 DataNode keytab 檔案應如下所示

$ klist -e -k -t /etc/security/keytab/dn.service.keytab
Keytab name: FILE:/etc/security/keytab/dn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

YARN

ResourceManager 主機上的 ResourceManager keytab 檔案應如下所示

$ klist -e -k -t /etc/security/keytab/rm.service.keytab
Keytab name: FILE:/etc/security/keytab/rm.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

每個主機上的 NodeManager keytab 檔案應如下所示

$ klist -e -k -t /etc/security/keytab/nm.service.keytab
Keytab name: FILE:/etc/security/keytab/nm.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

MapReduce JobHistory Server

該主機上的 MapReduce JobHistory Server keytab 檔案應如下所示

$ klist -e -k -t /etc/security/keytab/jhs.service.keytab
Keytab name: FILE:/etc/security/keytab/jhs.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

從 Kerberos 主體對應到 OS 使用者帳戶

Hadoop 使用 hadoop.security.auth_to_local 指定的規則將 Kerberos 主體對應到 OS 使用者 (系統) 帳戶。Hadoop 如何評估這些規則是由 hadoop.security.auth_to_local.mechanism 的設定決定的。

在預設的 hadoop 模式中,Kerberos 主體 必須 與將主體轉換為簡單形式的規則相符,亦即沒有「@」或「/」的使用者帳戶名稱,否則主體將不會被授權,且會記錄錯誤。在 MIT 模式中,規則的工作方式與 Kerberos 組態檔 (krb5.conf) 中的 auth_to_local 相同,且 hadoop 模式的限制 適用。如果您使用 MIT 模式,建議使用與 /etc/krb5.conf 中指定的 auth_to_local 規則相同,並將其保持同步。在 hadoopMIT 模式中,規則會套用至 所有 主體(預設值除外),無論其指定的領域為何。此外,請注意您 不應 依賴 auth_to_local 規則作為 ACL,並使用適當的(作業系統)機制。

auth_to_local 的可能值為

  • RULE:exp 本機名稱將根據 exp 制定。exp 的格式為 [n:string](regexp)s/pattern/replacement/g。整數 n 表示目標主體應有的組成部分數目。如果符合,則會從 string 形成一個字串,將主體的領域替換為 $0,並將主體的第 n 個組成部分替換為 $n(例如,如果主體是 johndoe/admin,則 [2:$2$1foo] 會產生字串 adminjohndoefoo)。如果這個字串符合 regexp,則會在字串上執行 s//[g] 替換指令。選用的 g 會導致替換在字串上全面進行,而不是只替換字串中的第一個符合項。作為 MIT 的延伸,Hadoop auth_to_local 對應支援 /L 旗標,用於將傳回的名稱轉換為小寫。

  • DEFAULT 如果領域與 default_realm 相符(通常在 /etc/krb5.conf 中定義),則選取主體名稱的第一個組成部分作為系統使用者名稱。例如,預設規則會將主體 host/full.qualified.domain.name@MYREALM.TLD 對應到系統使用者 host(如果預設領域是 MYREALM.TLD)。

如果未指定任何規則,Hadoop 預設會使用 DEFAULT,這可能 不適合 大多數叢集。

請注意,Hadoop 不支援多個預設領域(例如 Heimdal 所支援)。此外,Hadoop 不會驗證對應的本地系統帳戶是否存在。

範例規則

在典型的叢集中,HDFS 和 YARN 服務將分別以系統 hdfsyarn 使用者身分啟動。hadoop.security.auth_to_local 可設定如下

<property>
  <name>hadoop.security.auth_to_local</name>
  <value>
    RULE:[2:$1/$2@$0]([ndj]n/.*@REALM.\TLD)s/.*/hdfs/
    RULE:[2:$1/$2@$0]([rn]m/.*@REALM\.TLD)s/.*/yarn/
    RULE:[2:$1/$2@$0](jhs/.*@REALM\.TLD)s/.*/mapred/
    DEFAULT
  </value>
</property>

這會將領域 REALM.TLD 中任何 host 上的任何主體 nn, dn, jn 對應到本地系統帳戶 hdfs。其次,它會將 REALM.TLD 中任何 host 上的任何主體 rm, nm 對應到本地系統帳戶 yarn。第三,它會將領域 REALM.TLD 中任何 host 上的主體 jhs 對應到本地系統帳戶 mapred。最後,預設領域中任何主機上的任何主體都將對應到該主體的使用者組成部分。

可以使用 hadoop kerbname 指令測試自訂規則。此指令允許指定主體並套用 Hadoop 目前的 auth_to_local 規則集。

從使用者對應到群組

系統使用者對應到系統群組的對應機制可透過 hadoop.security.group.mapping 進行設定。詳細資訊請參閱 Hadoop 群組對應

實際上,您需要使用 Kerberos 搭配 LDAP 管理 Hadoop 在安全模式下的 SSO 環境。

代理使用者

某些產品(例如 Apache Oozie)會代表最終使用者存取 Hadoop 的服務,因此需要能夠假冒最終使用者。詳細資訊請參閱 代理使用者的文件

安全資料節點

由於資料節點資料傳輸協定不使用 Hadoop RPC 架構,因此資料節點必須使用由 dfs.datanode.addressdfs.datanode.http.address 指定的特權埠進行驗證。此驗證基於攻擊者無法在資料節點主機上取得 root 權限的假設。

當您以 root 身分執行 hdfs datanode 指令時,伺服器程序會先繫結特權埠,然後放棄權限並以 HDFS_DATANODE_SECURE_USER 指定的使用者帳戶執行。此啟動程序會使用安裝到 JSVC_HOMEjsvc 程式。您必須在啟動時指定 HDFS_DATANODE_SECURE_USERJSVC_HOME 作為環境變數(在 hadoop-env.sh 中)。

從 2.6.0 版開始,SASL 可用於驗證資料傳輸協定。在此組態中,安全叢集不再需要使用 jsvc 以 root 身分啟動資料節點並繫結到特權埠。若要對資料傳輸協定啟用 SASL,請在 hdfs-site.xml 中設定 dfs.data.transfer.protection。啟用 SASL 的資料節點可以在安全模式下透過下列兩種方式啟動:1. 為 dfs.datanode.address 設定非特權埠。1. 將 dfs.http.policy 設定為 HTTPS_ONLY 或將 dfs.datanode.http.address 設定為特權埠,並確保在啟動時正確指定 HDFS_DATANODE_SECURE_USERJSVC_HOME 環境變數(在 hadoop-env.sh 中)。

若要將使用 root 驗證的現有叢集移轉為改用 SASL,請先確保已將版本 2.6.0 或更新版本部署到所有叢集節點,以及任何需要連線到叢集的外部應用程式。只有 HDFS 2.6.0 及更新版本以上的用戶端才能連線到使用 SASL 驗證資料傳輸協定的 DataNode,因此在移轉之前,所有呼叫者都必須擁有正確的版本至關重要。在所有位置都部署版本 2.6.0 或更新版本後,請更新任何外部應用程式的組態以啟用 SASL。如果已為 HDFS 用戶端啟用 SASL,則它可以成功連線到執行 root 驗證或 SASL 驗證的 DataNode。變更所有用戶端的組態可確保 DataNode 上後續的組態變更不會中斷應用程式。最後,可以透過變更組態並重新啟動來移轉每個個別 DataNode。在此移轉期間,暫時讓部分 DataNode 執行 root 驗證,部分 DataNode 執行 SASL 驗證是可以接受的,因為已為 SASL 啟用的 HDFS 用戶端可以連線到兩者。

資料機密性

RPC 上的資料加密

在 Hadoop 服務和用戶端之間傳輸的資料可以在網路上加密。在 core-site.xml 中將 hadoop.rpc.protection 設定為 privacy 會啟動資料加密。

區塊資料傳輸上的資料加密

您需要在 hdfs-site.xml 中將 dfs.encrypt.data.transfer 設定為 true,才能為 DataNode 的資料傳輸協定啟動資料加密。

您也可以選擇將 dfs.encrypt.data.transfer.algorithm 設定為 3desrc4,以選擇特定的加密演算法。如果未指定,則會使用系統上已組態的 JCE 預設值,通常為 3DES。

dfs.encrypt.data.transfer.cipher.suites 設定為 AES/CTR/NoPadding 會啟動 AES 加密。預設情況下,此項未指定,因此不會使用 AES。使用 AES 時,在初始金鑰交換期間仍會使用 dfs.encrypt.data.transfer.algorithm 中指定的演算法。可以透過將 dfs.encrypt.data.transfer.cipher.key.bitlength 設定為 128、192 或 256 來組態 AES 金鑰位元長度。預設值為 128。

AES 提供最強大的密碼強度和最佳效能。目前,3DES 和 RC4 已在 Hadoop 叢集中更常使用。

HTTP 上的資料加密

Web 主控台和用戶端之間的資料傳輸會使用 SSL(HTTPS) 保護。建議進行 SSL 組態,但不是組態 Hadoop 安全性與 Kerberos 的必要條件。

若要為 HDFS 程式精靈的 Web 主控台啟用 SSL,請在 hdfs-site.xml 中將 dfs.http.policy 設定為 HTTPS_ONLYHTTP_AND_HTTPS。請注意,KMS 和 HttpFS 都不會遵守此參數。請參閱 Hadoop KMSHadoop HDFS over HTTP - Server Setup,了解如何分別透過 HTTPS 啟用 KMS 和透過 HTTPS 啟用 HttpFS 的說明。

若要為 YARN 守護程序的網路主控台啟用 SSL,請在 yarn-site.xml 中將 yarn.http.policy 設為 HTTPS_ONLY

若要為 MapReduce JobHistory 伺服器的網路主控台啟用 SSL,請在 mapred-site.xml 中將 mapreduce.jobhistory.http.policy 設為 HTTPS_ONLY

組態

HDFS 和本機 fileSystem 路徑的權限

下表列出 HDFS 和本機檔案系統 (在所有節點上) 的各種路徑和建議的權限

檔案系統 路徑 使用者:群組 權限
本機 dfs.namenode.name.dir hdfs:hadoop drwx------
本機 dfs.datanode.data.dir hdfs:hadoop drwx------
本機 $HADOOP_LOG_DIR hdfs:hadoop drwxrwxr-x
本機 $YARN_LOG_DIR yarn:hadoop drwxrwxr-x
本機 yarn.nodemanager.local-dirs yarn:hadoop drwxr-xr-x
本機 yarn.nodemanager.log-dirs yarn:hadoop drwxr-xr-x
本機 container-executor root:hadoop --Sr-s--*
本機 conf/container-executor.cfg root:hadoop r-------*
hdfs / hdfs:hadoop drwxr-xr-x
hdfs /tmp hdfs:hadoop drwxrwxrwxt
hdfs /user hdfs:hadoop drwxr-xr-x
hdfs yarn.nodemanager.remote-app-log-dir yarn:hadoop drwxrwxrwxt
hdfs mapreduce.jobhistory.intermediate-done-dir mapred:hadoop drwxrwxrwxt
hdfs mapreduce.jobhistory.done-dir mapred:hadoop drwxr-x---

常見組態

若要在 Hadoop 中開啟 RPC 驗證,請將 hadoop.security.authentication 屬性的值設為 "kerberos",並適當地設定下列安全性相關設定。

下列屬性應位於叢集中所有節點的 core-site.xml 中。

參數 備註
hadoop.security.authentication kerberos simple:無驗證。(預設)  kerberos:透過 Kerberos 啟用驗證。
hadoop.security.authorization true 啟用 RPC 服務層級授權
hadoop.rpc.protection authentication authentication:僅驗證 (預設);integrity:除了驗證之外還進行完整性檢查; privacy:除了完整性之外還進行資料加密
hadoop.security.auth_to_local RULE:exp1 RULE:exp2  DEFAULT 此值是包含新行字元的字串。請參閱 Kerberos 文件,以了解 exp 的格式。
hadoop.proxyuser.superuser.hosts 允許 superuser 存取假冒身分的逗號分隔主機。* 表示萬用字元。
hadoop.proxyuser.superuser.groups superuser 冒充的使用者所屬的逗號分隔群組。* 表示萬用字元。

NameNode

參數 備註
dfs.block.access.token.enable true 為安全操作啟用 HDFS 區塊存取權杖。
dfs.namenode.kerberos.principal nn/_HOST@REALM.TLD NameNode 的 Kerberos 主體名稱。
dfs.namenode.keytab.file /etc/security/keytab/nn.service.keytab NameNode 的 Kerberos keytab 檔案。
dfs.namenode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD NameNode 用於 Web UI SPNEGO 驗證的伺服器主體。依慣例,SPNEGO 伺服器主體以字首 HTTP/ 開頭。如果值為 '*',Web 伺服器將嘗試使用 keytab 檔案 dfs.web.authentication.kerberos.keytab 中指定的每一個主體登入。對於大多數的部署,這可以設定為 ${dfs.web.authentication.kerberos.principal},亦即使用 dfs.web.authentication.kerberos.principal 的值。
dfs.web.authentication.kerberos.keytab /etc/security/keytab/spnego.service.keytab NameNode 的 SPNEGO keytab 檔案。在 HA 群集中,此設定與 Journal Nodes 共享。

下列設定允許設定對 NameNode Web UI 的 SSL 存取(選用)。

參數 備註
dfs.http.policy HTTP_ONLYHTTPS_ONLYHTTP_AND_HTTPS HTTPS_ONLY 關閉 http 存取。如果使用 SASL 驗證資料傳輸協定,而不是以 root 身分執行 DataNode 並使用特權埠,則此屬性必須設定為 HTTPS_ONLY,以保證 HTTP 伺服器的驗證。(請參閱 dfs.data.transfer.protection。)
dfs.namenode.https-address 0.0.0.0:9871 此參數用於非 HA 模式且不使用聯合。有關詳細資訊,請參閱 HDFS 高可用性HDFS 聯合

Secondary NameNode

參數 備註
dfs.namenode.secondary.http-address 0.0.0.0:9868 Secondary NameNode 的 HTTP Web UI 位址。
dfs.namenode.secondary.https-address 0.0.0.0:9869 Secondary NameNode 的 HTTPS Web UI 位址。
dfs.secondary.namenode.keytab.file /etc/security/keytab/sn.service.keytab Secondary NameNode 的 Kerberos keytab 檔案。
dfs.secondary.namenode.kerberos.principal sn/_HOST@REALM.TLD Secondary NameNode 的 Kerberos 主體名稱。
dfs.secondary.namenode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD Secondary NameNode 用於 Web UI SPNEGO 驗證的伺服器主體。依慣例,SPNEGO 伺服器主體以字首 HTTP/ 開頭。如果值為 '*',Web 伺服器將嘗試使用 keytab 檔案 dfs.web.authentication.kerberos.keytab 中指定的每一個主體登入。對於大多數的部署,這可以設定為 ${dfs.web.authentication.kerberos.principal},亦即使用 dfs.web.authentication.kerberos.principal 的值。

JournalNode

參數 備註
dfs.journalnode.kerberos.principal jn/_HOST@REALM.TLD JournalNode 的 Kerberos 主體名稱。
dfs.journalnode.keytab.file /etc/security/keytab/jn.service.keytab JournalNode 的 Kerberos keytab 檔案。
dfs.journalnode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD 當啟用 Kerberos 安全性時,JournalNode 用於 Web UI SPNEGO 驗證的伺服器主體。依慣例,SPNEGO 伺服器主體以 HTTP/ 字首開頭。如果值為 '*',Web 伺服器會嘗試使用 keytab 檔案 dfs.web.authentication.kerberos.keytab 中指定的每個主體登入。對於大多數部署,這可以設定為 ${dfs.web.authentication.kerberos.principal},即使用 dfs.web.authentication.kerberos.principal 的值。
dfs.web.authentication.kerberos.keytab /etc/security/keytab/spnego.service.keytab JournalNode 的 SPNEGO keytab 檔案。在 HA 群集中,此設定與 Name Nodes 共用。
dfs.journalnode.https-address 0.0.0.0:8481 JournalNode 的 HTTPS Web UI 位址。

DataNode

參數 備註
dfs.datanode.data.dir.perm 700
dfs.datanode.address 0.0.0.0:1004 安全的 DataNode 必須使用特權埠,才能確保伺服器安全啟動。這表示伺服器必須透過 jsvc 啟動。或者,如果使用 SASL 驗證資料傳輸協定,則必須將此設定為非特權埠。(請參閱 dfs.data.transfer.protection。)
dfs.datanode.http.address 0.0.0.0:1006 安全的 DataNode 必須使用特權埠,才能確保伺服器安全啟動。這表示伺服器必須透過 jsvc 啟動。
dfs.datanode.https.address 0.0.0.0:9865 Data Node 的 HTTPS Web UI 位址。
dfs.datanode.kerberos.principal dn/_HOST@REALM.TLD DataNode 的 Kerberos 主體名稱。
dfs.datanode.keytab.file /etc/security/keytab/dn.service.keytab DataNode 的 Kerberos keytab 檔案。
dfs.encrypt.data.transfer false 使用資料加密時設定為 true
dfs.encrypt.data.transfer.algorithm 使用資料加密時,可選擇設定為 3desrc4,以控制加密演算法
dfs.encrypt.data.transfer.cipher.suites 使用資料加密時,可選擇設定為 AES/CTR/NoPadding,以啟用 AES 加密
dfs.encrypt.data.transfer.cipher.key.bitlength 使用資料加密時,可選擇設定為 128192256,以控制使用 AES 的金鑰位元長度
dfs.data.transfer.protection 驗證:僅驗證;完整性:驗證完整性,並驗證;隱私:加密資料,並驗證完整性。此屬性預設未指定。設定此屬性可啟用 SASL 驗證資料傳輸協定。如果已啟用,則 dfs.datanode.address 必須使用非特權埠,dfs.http.policy 必須設定為 HTTPS_ONLY,且在啟動 DataNode 程序時,HDFS_DATANODE_SECURE_USER 環境變數必須未定義。

WebHDFS

參數 備註
dfs.web.authentication.kerberos.principal http/_HOST@REALM.TLD WebHDFS 的 Kerberos 主體名稱。在 HA 群集中,此設定通常由 JournalNodes 使用,以透過 SPNEGO 保護對 JournalNode HTTP 伺服器的存取。
dfs.web.authentication.kerberos.keytab /etc/security/keytab/http.service.keytab WebHDFS 的 Kerberos keytab 檔案。在 HA 群集中,此設定通常由 JournalNodes 使用,以透過 SPNEGO 保護對 JournalNode HTTP 伺服器的存取。

ResourceManager

參數 備註
yarn.resourcemanager.principal rm/_HOST@REALM.TLD ResourceManager 的 Kerberos 主體名稱。
yarn.resourcemanager.keytab /etc/security/keytab/rm.service.keytab ResourceManager 的 Kerberos keytab 檔案。
yarn.resourcemanager.webapp.https.address ${yarn.resourcemanager.hostname}:8090 非 HA 的 RM 網路應用程式的 https 位址。在 HA 群集中,請為每個 ResourceManager 使用 yarn.resourcemanager.webapp.https.address.rm-id。有關詳細資訊,請參閱 ResourceManager 高可用性

NodeManager

參數 備註
yarn.nodemanager.principal nm/_HOST@REALM.TLD NodeManager 的 Kerberos 主體名稱。
yarn.nodemanager.keytab /etc/security/keytab/nm.service.keytab NodeManager 的 Kerberos keytab 檔案。
yarn.nodemanager.container-executor.class org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor 使用 LinuxContainerExecutor。
yarn.nodemanager.linux-container-executor.group hadoop NodeManager 的 Unix 群組。
yarn.nodemanager.linux-container-executor.path /path/to/bin/container-executor Linux container executor 可執行檔的路徑。
yarn.nodemanager.webapp.https.address 0.0.0.0:8044 NM 網路應用程式的 https 位址。

WebAppProxy 組態

WebAppProxy 提供一個代理,在應用程式匯出的網頁應用程式和最終使用者之間。如果啟用安全性,在存取有潛在風險的網頁應用程式之前,它會警告使用者。使用代理進行驗證和授權的處理方式,就像處理任何其他特權網頁應用程式一樣。

參數 備註
yarn.web-proxy.address WebAppProxy 主機:埠,用於代理至 AM 網頁應用程式。 host:port 如果這與 yarn.resourcemanager.webapp.address 相同,或未定義,則 ResourceManager 會執行代理,否則需要啟動獨立代理伺服器。
yarn.web-proxy.keytab /etc/security/keytab/web-app.service.keytab WebAppProxy 的 Kerberos keytab 檔案。
yarn.web-proxy.principal wap/_HOST@REALM.TLD WebAppProxy 的 Kerberos 主體名稱。

LinuxContainerExecutor

YARN 架構使用的 ContainerExecutor,定義如何啟動和控制任何 容器

Hadoop YARN 中提供下列功能

ContainerExecutor 說明
DefaultContainerExecutor YARN 用來管理容器執行的預設執行器。容器程序具有與 NodeManager 相同的 Unix 使用者。
LinuxContainerExecutor 僅支援 GNU/Linux,此執行器以 YARN 使用者(在啟用完整安全性時)或專用使用者(在未啟用完整安全性時,預設為 nobody)身分執行容器。在啟用完整安全性時,此執行器需要在啟動容器的叢集節點上建立所有使用者帳戶。它使用 Hadoop 發行版中包含的 setuid 可執行檔。NodeManager 使用此可執行檔來啟動和終止容器。setuid 可執行檔會切換到提交應用程式的使用者,並啟動或終止容器。為了達到最大的安全性,此執行器會設定容器使用的本機檔案和目錄(例如共享物件、jar 檔、中間檔案、記錄檔等)的受限權限和使用者/群組擁有權。特別注意,由於這個原因,除了應用程式擁有者和 NodeManager 之外,沒有其他使用者可以存取任何本機檔案/目錄,包括那些作為分散式快取一部分而本地化的檔案/目錄。

若要建立 LinuxContainerExecutor 可執行檔,請執行

 $ mvn package -Dcontainer-executor.conf.dir=/etc/hadoop/

傳遞給 -Dcontainer-executor.conf.dir 的路徑應該是叢集節點上的路徑,setuid 可執行檔的組態檔應該位於該路徑。可執行檔應該安裝在 $HADOOP_YARN_HOME/bin 中。

可執行檔必須具有特定權限:6050 或 --Sr-s--- 權限,使用者擁有者為 root(超級使用者),群組擁有者為 NodeManager Unix 使用者為群組成員且沒有普通應用程式使用者為群組成員的特殊群組(例如 hadoop)。如果任何應用程式使用者屬於此特殊群組,安全性將受到危害。此特殊群組名稱應該為組態屬性 yarn.nodemanager.linux-container-executor.group 指定在 conf/yarn-site.xmlconf/container-executor.cfg 中。

例如,假設 NodeManager 以使用者 yarn 身分執行,而使用者 yarn 是群組 usershadoop 的成員,其中任何一個都是主要群組。假設 usersyarn 和另一個使用者(應用程式提交者)alice 為其成員,而 alice 不屬於 hadoop。根據上述說明,setuid/setgid 可執行檔應該設定為 6050 或 --Sr-s---,使用者擁有者為 yarn,群組擁有者為 hadoop,其成員為 yarn(而不是 users,除了 yarn 之外,它還有 alice 為其成員)。

LinuxTaskController 要求包括在 yarn.nodemanager.local-dirsyarn.nodemanager.log-dirs 中指定的目錄及其上層目錄的路徑設定為 755 權限,如上表中目錄權限所述。

  • conf/container-executor.cfg

可執行檔需要一個名為 container-executor.cfg 的組態檔,該組態檔必須存在於傳遞給上述 mvn 目標的組態目錄中。

組態檔必須由執行 NodeManager 的使用者擁有(如上例中的使用者 yarn),由任何人擁有群組,並且應具有 0400 或 r-------- 權限。

可執行檔需要在 conf/container-executor.cfg 檔中存在下列組態項目。這些項目應提及為簡單的 key=value 成對,每行一對

參數 備註
yarn.nodemanager.linux-container-executor.group hadoop NodeManager 的 Unix 群組。container-executor 二進位檔案的群組擁有者應為此群組。應與 NodeManager 設定為相同的值。此組態是驗證 container-executor 二進位檔案的安全存取所必需的。
banned.users hdfs,yarn,mapred,bin 禁止的使用者。
allowed.system.users foo,bar 允許的系統使用者。
min.user.id 1000 防止其他超級使用者。

總之,以下是 LinuxContainerExecutor 相關的各種路徑所需的本地檔案系統權限

檔案系統 路徑 使用者:群組 權限
本機 container-executor root:hadoop --Sr-s--*
本機 conf/container-executor.cfg root:hadoop r-------*
本機 yarn.nodemanager.local-dirs yarn:hadoop drwxr-xr-x
本機 yarn.nodemanager.log-dirs yarn:hadoop drwxr-xr-x

MapReduce JobHistory Server

參數 備註
mapreduce.jobhistory.address MapReduce JobHistory Server host:port 預設埠為 10020。
mapreduce.jobhistory.keytab /etc/security/keytab/jhs.service.keytab MapReduce JobHistory Server 的 Kerberos keytab 檔案。
mapreduce.jobhistory.principal jhs/_HOST@REALM.TLD MapReduce JobHistory Server 的 Kerberos 主體名稱。

多重歸屬

每個主機在 DNS 中有多個主機名的多重歸屬設定(例如對應於公用和私人網路介面的不同主機名)可能需要額外的組態才能讓 Kerberos 驗證正常運作。請參閱 HDFS 對多重歸屬網路的支援

疑難排解

Kerberos 難以設定,而且更難除錯。常見問題包括

  1. 網路和 DNS 組態。
  2. 主機上的 Kerberos 組態(/etc/krb5.conf)。
  3. 金鑰表建立與維護。
  4. 環境設定:JVM、使用者登入、系統時鐘等。

JVM 的錯誤訊息基本上沒有意義,這對診斷和修正此類問題沒有幫助。

可以為用戶端和任何服務啟用額外的偵錯資訊

將環境變數 HADOOP_JAAS_DEBUG 設定為 true

export HADOOP_JAAS_DEBUG=true

編輯 log4j.properties 檔案,將 Hadoop 的安全性套件記錄在 DEBUG 層級。

log4j.logger.org.apache.hadoop.security=DEBUG

透過設定一些系統屬性來啟用 JVM 層級的偵錯。

export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Dsun.security.krb5.debug=true -Dsun.security.spnego.debug"

使用 KDiag 進行疑難排解

Hadoop 有個工具可以協助驗證設定:KDiag

它包含一系列用於 JVM 組態和環境的探測,會傾印出一些系統檔案(/etc/krb5.conf/etc/ntp.conf),印出一些系統狀態,然後嘗試以目前使用者或已命名金鑰表中的特定主體登入 Kerberos。

指令的輸出可用於本機診斷,或轉送給支援叢集的人員。

KDiag 指令有自己的進入點;它透過將 kdiag 傳遞給 bin/hadoop 指令來呼叫。因此,它會顯示用於呼叫它的指令的 Kerberos 用戶端狀態。

hadoop kdiag

如果診斷執行成功,指令會傳回狀態碼 0。這並不表示 Kerberos 正在運作,而只是表示 KDiag 指令並未從其有限的探測中找出任何問題。特別是,由於它不會嘗試連線到任何遠端服務,因此它不會驗證用戶端是否受到任何服務信任。

如果失敗,結束代碼為

  • -1:指令因不明原因失敗
  • 41:未授權(== HTTP 的 401)。KDiag 偵測到導致 Kerberos 無法運作的狀況。檢查輸出以找出問題。

用法

KDiag: Diagnose Kerberos Problems
  [-D key=value] : Define a configuration option.
  [--jaas] : Require a JAAS file to be defined in java.security.auth.login.config.
  [--keylen <keylen>] : Require a minimum size for encryption keys supported by the JVM. Default value : 256.
  [--keytab <keytab> --principal <principal>] : Login from a keytab as a specific principal.
  [--nofail] : Do not fail on the first problem.
  [--nologin] : Do not attempt to log in.
  [--out <file>] : Write output to a file.
  [--resource <resource>] : Load an XML configuration resource.
  [--secure] : Require the hadoop configuration to be secure.
  [--verifyshortname <principal>]: Verify the short name of the specific principal does not contain '@' or '/'

--jaas:需要在 java.security.auth.login.config 中定義 JAAS 檔案。

如果設定 --jaas,Java 系統屬性 java.security.auth.login.config 必須設定為 JAAS 檔案;此檔案必須存在,是非零位元組的簡單檔案,而且目前使用者可以讀取。不會執行更詳細的驗證。

Hadoop 本身不需要 JAAS 檔案,但某些服務(例如 Zookeeper)需要 JAAS 檔案才能安全運作。

--keylen <length>:需要 JVM 支援的加密金鑰的最小大小。

如果 JVM 不支援此長度,指令會失敗。

預設值為 256,這是 AES256 加密方案所需要的。未安裝 Java 加密擴充功能的 JVM 不支援此類金鑰長度。除非將 Kerberos 組態為使用金鑰長度較短的加密方案,否則 Kerberos 無法運作。

--keytab <keytab> --principal <principal>:從金鑰表登入。

從 keytab 以特定主體身分登入。

  1. 檔案必須包含特定主體,包括任何命名主機。也就是說,_HOST 與目前主機名稱之間沒有對應。
  2. KDiag 會登出並嘗試再次登入。這會找出過去存在的 JVM 相容性問題。(Hadoop 的 Kerberos 支援需要使用/內省 JVM 特定類別)。

--nofail : 發生第一個問題時不要失敗

KDiag 會盡力診斷所有 Kerberos 問題,而不是在第一個問題時停止。

這有點受限;會依問題浮現的順序進行檢查(例如,會先檢查金鑰長度),因此早期失敗可能會觸發更多問題。但它會產生更詳細的報告。

--nologin: 不要嘗試登入。

略過嘗試登入。這會優先於 --keytab 選項,也會停用嘗試以目前已初始化的使用者身分登入 kerberos。

當 KDiag 指令在應用程式內呼叫時,這很有用,因為它不會設定 Hadoop 的靜態安全性狀態,只會檢查一些基本的 Kerberos 前置條件。

--out outfile: 將輸出寫入檔案。

hadoop kdiag --out out.txt

大部分的診斷資訊來自 JRE(到 stderr)和 Log4j(到 stdout)。若要取得所有輸出,最好將這兩個輸出串流重新導向到同一個檔案,並省略 --out 選項。

hadoop kdiag --keytab zk.service.keytab --principal zookeeper/devix.example.org@REALM > out.txt 2>&1

即使如此,兩個串流的輸出在多個執行緒中發出,可能會有點混亂。練習後會越來越容易。在 Log4j 輸出中查看執行緒名稱,以區分背景執行緒和主執行緒,這有助於 hadoop 層級,但無法協助 JVM 層級的記錄。

--resource <resource> : 要載入的 XML 組態資源。

若要載入 XML 組態檔案,可以使用這個選項。預設情況下,只會載入 core-defaultcore-site XML 資源。當其他組態檔案有任何與 Kerberos 相關的組態時,這會有幫助。

hadoop kdiag --resource hbase-default.xml --resource hbase-site.xml

若要在操作期間進行額外記錄,請將記錄和 HADOOP_JAAS_DEBUG 環境變數設定為「疑難排解」中列出的值。JVM 選項會在 KDiag 中自動設定。

--secure: 如果指令未在安全叢集中執行,則失敗。

也就是說:如果叢集的驗證機制明示或暗示地設定為「簡單」

<property>
  <name>hadoop.security.authentication</name>
  <value>simple</value>
</property>

不用說,如此組態的應用程式無法與安全的 Hadoop 叢集通訊。

--verifyshortname <principal>: 驗證主體的簡短名稱

這會驗證主體的簡短名稱不包含 "@""/" 字元。

範例

hadoop kdiag \
  --nofail \
  --resource hdfs-site.xml --resource yarn-site.xml \
  --keylen 1024 \
  --keytab zk.service.keytab --principal zookeeper/devix.example.org@REALM

這會嘗試執行所有診斷而不會提早失敗,載入 HDFS 和 YARN XML 資源,需要至少 1024 位元的金鑰長度,並以主體 zookeeper/devix.example.org@REALM 登入,其金鑰必須在 keytab zk.service.keytab

參考資料

  1. O’Malley O 等人 Hadoop 安全設計
  2. O’Malley O,Hadoop 安全架構
  3. Java 7 上的 Kerberos 疑難排解
  4. Java 8 上的 Kerberos 疑難排解
  5. Java 7 Kerberos 需求
  6. Java 8 Kerberos 需求
  7. Loughran S.,Hadoop 和 Kerberos:門後的瘋狂