前言
大數(shù)據(jù)Hadoop集群啟用Kerberos認(rèn)證之后,訪問返回會被限制到單個集群內(nèi)部。如果有需要訪問另一個開啟Kerberos集群的需求(例如跨集群數(shù)據(jù)導(dǎo)入導(dǎo)出),需要配置Kerberos集群互信。
前提條件
- 兩個集群的Kerberos Realm不能相同。
- 兩個集群的FQDN二級域名不能相同。
- 兩個集群的網(wǎng)絡(luò)互通。
配置方法
環(huán)境信息
假定兩個集群分別為BEIJING集群和SHANGHAI集群。
對于/etc/krb5.conf配置文件的[realms]片段,BEIJING集群的配置為:
[realms]
BEIJING = {
admin_server = host1.beijing.com
kdc = host1.beijing.com
}
SHANGHAI集群的配置為:
[realms]
SHANGHAI = {
admin_server = host1.shanghai.com
kdc = host1.shanghai.com
}
對于/et/hosts,BEIJING集群的配置為:
100.0.0.1 host1.beijing.com
100.0.0.2 host2.beijing.com
100.0.0.3 host3.beijing.com
SHANGHAI集群的配置為:
120.0.0.1 host1.shanghai.com
120.0.0.2 host2.shanghai.com
120.0.0.3 host3.shanghai.com
下面為互信的配置步驟。
修改/etc/krb5.conf文件
確保雙方的集群都具有對方的realms配置。domain_realm和capaths按照下面的例子配置。
BEIJING集群的配置修改為:
[realms]
BEIJING = {
admin_server = host1.beijing.com
kdc = host1.beijing.com
}
SHANGHAI = {
admin_server = host1.shanghai.com
kdc = host1.shanghai.com
}
[domain_realm]
.beijing.com = BEIJING
beijing.com = BEIJING
.shanghai.com = SHANGHAI
shanghai.com = SHANGHAI
[capaths]
BEIJING = {
SHANGHAI = .
}
SHANGHAI集群的配置修改為:
[realms]
SHANGHAI = {
admin_server = host1.shanghai.com
kdc = host1.shanghai.com
}
BEIJING = {
admin_server = host1.beijing.com
kdc = host1.beijing.com
}
[domain_realm]
.shanghai.com = SHANGHAI
shanghai.com = SHANGHAI
.beijing.com = BEIJING
beijing.com = BEIJING
[capaths]
SHANGHAI = {
BEIJING = .
}
需要注意的是,如果存在有二級域名不是shanghai.com或者beijing.com的節(jié)點,需要在[domain_realm]片段中單獨指定所屬realm。例如:
[domain_realm]
.shanghai.com = SHANGHAI
shanghai.com = SHANGHAI
.beijing.com = BEIJING
beijing.com = BEIJING
testnode1 = BEIJING
配置完畢之后需要重啟兩個集群的Kerberos服務(wù):
systemctl restart krb5kdc.service
systemctl restart kadmin.service
修改/etc/hosts文件
確保雙方集群都具有對方的hosts信息。
BEIJING集群的配置修改為:
100.0.0.1 host1.beijing.com
100.0.0.2 host2.beijing.com
100.0.0.3 host3.beijing.com
120.0.0.1 host1.shanghai.com
120.0.0.2 host2.shanghai.com
120.0.0.3 host3.shanghai.com
SHANGHAI集群的配置修改為:
120.0.0.1 host1.shanghai.com
120.0.0.2 host2.shanghai.com
120.0.0.3 host3.shanghai.com
100.0.0.1 host1.beijing.com
100.0.0.2 host2.beijing.com
100.0.0.3 host3.beijing.com
配置krbtgt
在BEIJING集群添加krbtgt:
kadmin.local: addprinc -pw admin krbtgt/BEIJING@SHANGHAI
kadmin.local: addprinc -pw admin krbtgt/SHANGHAI@BEIJING
同樣也需要在SHANGHAI集群添加krbtgt:
kadmin.local: addprinc -pw admin krbtgt/BEIJING@SHANGHAI
kadmin.local: addprinc -pw admin krbtgt/SHANGHAI@BEIJING
配置core-site.xml的hadoop.security.auth_to_local
hadoop.security.auth_to_local配置項的作用是定義將principal名稱轉(zhuǎn)化為user的規(guī)則。因此對于BEIJING和集群來說,需要得知SHANGHAI集群的轉(zhuǎn)換規(guī)則,可以將SHANGHAI集群的hadoop.security.auth_to_local復(fù)制追加到本集群配置的后面(DEFAULT除外)。反過來也一樣。
BEIJING集群的hadoop.security.auth_to_local配置修改為:
RULE:[1:$1@$0](^.*@BEIJING$)s/^(.*)@BEIJING$/$1/g
RULE:[2:$1@$0](^.*@BEIJING$)s/^(.*)@BEIJING$/$1/g
...省略BEIJING集群的其余配置
RULE:[1:$1@$0](^.*@SHANGHAI$)s/^(.*)@SHANGHAI$/$1/g
RULE:[2:$1@$0](^.*@SHANGHAI$)s/^(.*)@SHANGHAI$/$1/g
...省略SHANGHAI集群的其余配置
DEFAULT
SHANGHAI集群的hadoop.security.auth_to_local配置修改為:
RULE:[1:$1@$0](^.*@SHANGHAI$)s/^(.*)@SHANGHAI$/$1/g
RULE:[2:$1@$0](^.*@SHANGHAI$)s/^(.*)@SHANGHAI$/$1/g
...省略SHANGHAI集群的其余配置
RULE:[1:$1@$0](^.*@BEIJING$)s/^(.*)@BEIJING$/$1/g
RULE:[2:$1@$0](^.*@BEIJING$)s/^(.*)@BEIJING$/$1/g
...省略BEIJING集群的其余配置
DEFAULT
以上配置僅為示例,實際使用已真實環(huán)境配置為準(zhǔn),不要擅自修改以防止用戶名解析出現(xiàn)問題。
配置完畢之后需要重啟HDFS等相關(guān)組件才能生效。
結(jié)果驗證
驗證principal轉(zhuǎn)用戶名是否正常
兩個集群的HDFS等相關(guān)組件重啟完畢后。以hdfs/host1.shanghai.com轉(zhuǎn)換為用戶名為例,在BEIJING集群執(zhí)行:
hadoop org.apache.hadoop.security.HadoopKerberosName hdfs/host1.shanghai.com@SHANGHAI
Name: hdfs/host1.shanghai.com@SHANGHAI to hdfs
如果顯示類似上面的輸出,說明BEIJING能夠?qū)HANGHAI集群的hdfs/host1.shanghai.com@SHANGHAI轉(zhuǎn)換為hdfs用戶,配置是正確的。
假如這里遇到問題,需要檢查BEIJING集群的core-site.xml中hadoop.security.auth_to_local配置是否正確。
驗證是否可以訪問對方集群的數(shù)據(jù)
在BEIJING集群執(zhí)行:
kinit hdfs/host1.beijing.com
# 假定SHANGHAI集群的namenode安裝在host1.shanghai.com上
# 訪問SHANGHAI集群的數(shù)據(jù)
hdfs dfs -ls hdfs://host1.shanghai.com:8020/
如果互信配置正確,認(rèn)證之后可以訪問到對方集群HDFS的數(shù)據(jù)。