在預設組態中,我們預期您會透過限制所有網路存取,確保攻擊者無法存取您的 Hadoop 叢集。如果您想要限制誰可以遠端存取資料或提交作業,您必須確保 Hadoop 叢集的驗證和存取,如本文所述。
當 Hadoop 組態為在安全模式下執行時,每個 Hadoop 服務和每個使用者都必須由 Kerberos 驗證。
必須正確組態所有服務主機的正向和反向主機查詢,才能讓服務彼此驗證。主機查詢可以使用 DNS 或 /etc/hosts
檔案組態。建議在嘗試以安全模式組態 Hadoop 服務前,先了解 Kerberos 和 DNS 的工作原理。
當服務層級驗證開啟時,最終使用者必須在與 Hadoop 服務互動前驗證自己。最簡單的方式是讓使用者使用 Kerberos kinit
命令 進行互動式驗證。如果使用 kinit
進行互動式登入不可行,可以使用 Kerberos keytab 檔案進行程式化驗證。
確保 HDFS 和 YARN daemon 以不同的 Unix 使用者身分執行,例如 hdfs
和 yarn
。此外,確保 MapReduce JobHistory 伺服器以不同的使用者身分執行,例如 mapred
。
建議讓他們共用一個 Unix 群組,例如 hadoop
。另請參閱「從使用者對應到群組」以進行群組管理。
使用者:群組 | 守護程序 |
---|---|
hdfs:hadoop | NameNode、Secondary NameNode、JournalNode、DataNode |
yarn:hadoop | ResourceManager、NodeManager |
mapred:hadoop | MapReduce JobHistory 伺服器 |
每個 Hadoop 服務實例都必須設定其 Kerberos 主體和 keytab 檔案位置。
服務主體的一般格式為 ServiceName/_HOST@REALM.TLD
。例如:dn/_HOST@EXAMPLE.COM
。
Hadoop 允許將服務主體的主機名稱元件指定為 _HOST
萬用字元,簡化了設定檔的部署。每個服務實例會在執行階段將 _HOST
替換為自己的完整合格主機名稱。這允許管理員在所有節點上部署同一組設定檔。不過,keytab 檔案會有所不同。
每個 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)
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 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)
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
規則相同,並將其保持同步。在 hadoop
和 MIT
模式中,規則會套用至 所有 主體(預設值除外),無論其指定的領域為何。此外,請注意您 不應 依賴 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 服務將分別以系統 hdfs
和 yarn
使用者身分啟動。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.address
和 dfs.datanode.http.address
指定的特權埠進行驗證。此驗證基於攻擊者無法在資料節點主機上取得 root 權限的假設。
當您以 root 身分執行 hdfs datanode
指令時,伺服器程序會先繫結特權埠,然後放棄權限並以 HDFS_DATANODE_SECURE_USER
指定的使用者帳戶執行。此啟動程序會使用安裝到 JSVC_HOME
的 jsvc 程式。您必須在啟動時指定 HDFS_DATANODE_SECURE_USER
和 JSVC_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_USER
和 JSVC_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 用戶端可以連線到兩者。
在 Hadoop 服務和用戶端之間傳輸的資料可以在網路上加密。在 core-site.xml
中將 hadoop.rpc.protection
設定為 privacy
會啟動資料加密。
您需要在 hdfs-site.xml 中將 dfs.encrypt.data.transfer
設定為 true
,才能為 DataNode 的資料傳輸協定啟動資料加密。
您也可以選擇將 dfs.encrypt.data.transfer.algorithm
設定為 3des
或 rc4
,以選擇特定的加密演算法。如果未指定,則會使用系統上已組態的 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 叢集中更常使用。
Web 主控台和用戶端之間的資料傳輸會使用 SSL(HTTPS) 保護。建議進行 SSL 組態,但不是組態 Hadoop 安全性與 Kerberos 的必要條件。
若要為 HDFS 程式精靈的 Web 主控台啟用 SSL,請在 hdfs-site.xml 中將 dfs.http.policy
設定為 HTTPS_ONLY
或 HTTP_AND_HTTPS
。請注意,KMS 和 HttpFS 都不會遵守此參數。請參閱 Hadoop KMS 和 Hadoop 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 和本機檔案系統 (在所有節點上) 的各種路徑和建議的權限
檔案系統 | 路徑 | 使用者:群組 | 權限 |
---|---|---|---|
本機 | 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 冒充的使用者所屬的逗號分隔群組。* 表示萬用字元。 |
參數 | 值 | 備註 |
---|---|---|
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_ONLY 或 HTTPS_ONLY 或 HTTP_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 聯合。 |
參數 | 值 | 備註 |
---|---|---|
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 的值。 |
參數 | 值 | 備註 |
---|---|---|
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 位址。 |
參數 | 值 | 備註 |
---|---|---|
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 |
使用資料加密時,可選擇設定為 3des 或 rc4 ,以控制加密演算法 | |
dfs.encrypt.data.transfer.cipher.suites |
使用資料加密時,可選擇設定為 AES/CTR/NoPadding ,以啟用 AES 加密 | |
dfs.encrypt.data.transfer.cipher.key.bitlength |
使用資料加密時,可選擇設定為 128 、192 或 256 ,以控制使用 AES 的金鑰位元長度 | |
dfs.data.transfer.protection |
驗證 :僅驗證;完整性 :驗證完整性,並驗證;隱私 :加密資料,並驗證完整性。此屬性預設未指定。設定此屬性可啟用 SASL 驗證資料傳輸協定。如果已啟用,則 dfs.datanode.address 必須使用非特權埠,dfs.http.policy 必須設定為 HTTPS_ONLY ,且在啟動 DataNode 程序時,HDFS_DATANODE_SECURE_USER 環境變數必須未定義。 |
參數 | 值 | 備註 |
---|---|---|
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 伺服器的存取。 |
參數 | 值 | 備註 |
---|---|---|
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 高可用性。 |
參數 | 值 | 備註 |
---|---|---|
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
提供一個代理,在應用程式匯出的網頁應用程式和最終使用者之間。如果啟用安全性,在存取有潛在風險的網頁應用程式之前,它會警告使用者。使用代理進行驗證和授權的處理方式,就像處理任何其他特權網頁應用程式一樣。
參數 | 值 | 備註 |
---|---|---|
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 主體名稱。 |
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.xml
和 conf/container-executor.cfg
中。
例如,假設 NodeManager 以使用者 yarn
身分執行,而使用者 yarn
是群組 users
和 hadoop
的成員,其中任何一個都是主要群組。假設 users
有 yarn
和另一個使用者(應用程式提交者)alice
為其成員,而 alice
不屬於 hadoop
。根據上述說明,setuid/setgid 可執行檔應該設定為 6050 或 --Sr-s---
,使用者擁有者為 yarn
,群組擁有者為 hadoop
,其成員為 yarn
(而不是 users
,除了 yarn
之外,它還有 alice
為其成員)。
LinuxTaskController 要求包括在 yarn.nodemanager.local-dirs
和 yarn.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.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 難以設定,而且更難除錯。常見問題包括
/etc/krb5.conf
)。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 指令並未從其有限的探測中找出任何問題。特別是,由於它不會嘗試連線到任何遠端服務,因此它不會驗證用戶端是否受到任何服務信任。
如果失敗,結束代碼為
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 以特定主體身分登入。
_HOST
與目前主機名稱之間沒有對應。--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-default
和 core-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
中