概要描述
对于单个TDH集群,所有用户和服务都包含在一个Kerberos realm中。虽然这对于简单使用很有效,但是考虑到大型企业的工作方式,这通常是不现实的。随着时间的推移,大型企业最终会使用多个Kerberos域,比如合并、收购,或者只是想隔离企业的不同部分。
但是,在默认情况下,KDC只知道自己的realm和自己kdc database中的principal。如果来自一个域的用户希望使用由另一个域控制的服务,该怎么办? 为了实现这一点,需要在两个域之间建立Kerberos信任。
例如,假设一个非常大的公司,它决定创建多个域来识别不同的业务线,包括HR和MARKETING。因为两个域中的用户可能都需要从两个域访问服务,例如HR的KDC需要相信来自MARKETING的信息。反之亦然。从表面上看,这似乎很简单,但实际上存在两种不同类型的信任: 单向信任和双向信任(或完全信任)。上述例子代表了一种双向信任。
如果有另外一个DEV域,其中的研发部门有需要去访问DEV域和MARKETING域。但是市场部用户不应该访问DEV域,此场景需要单向信任
那么如何建立Kerberos信任呢? AS和TGS内部使用了一个特殊的principal,它的形式是krbtgt/{REALM}@{REALM},这一原则对于建立信任非常重要。对于信任,principal采用krbtgt/{TRUSTING_REALM}@{TRUSTED_REALM}的形式。这个原则的一个关键是它在两个realm都存在,并且和principal的密码和使用的加密类型必须是相同的
本文将举例如何建立HDT到KTDH集群的单向信任(KTDH集群需要访问HDT集群的资源)
- HDT outgoing KTDH
- 信任的一方是HDT,被信任的一方是KTDH
环境准备
详细说明
Step1: HDT集群通过TDH4.x集成的kadmin.local管理命令在4.X集群中新增krbtgt/HDT@KTDH
- 注意:密码必须保持一致,并且建议使用强密码,MIT推荐密码至少由26位随机的ASCII码组成 可通过获取时间戳获取26位强密码
[root@tdh48401 conf]# date +%s|sha256sum|base64|head -c 26;echo
NWY3M2ZhOGYyMjFlNGVmM2I2Nz
- 下面这步完成之后,会在双方realm下生成 DN: uid=krbtgt/HDT@KTDH,ou=System,ou=People,dc=tdh (krbtgt/TDH-TRUSTING@TDH-TRUSTED)
[root@tdh48401 conf]# sudo kadmin.local
Authenticating as principal hdfs/admin@HDT with password.
kadmin.local: addprinc -requires_preauth krbtgt/HDT@KTDH
NOTICE: no policy specified for krbtgt/HDT@KTDH; assigning "default"
#注意,这里输入上述的26位密码
Enter password for principal "krbtgt/HDT@KTDH":
Re-enter password for principal "krbtgt/HDT@KTDH":
Principal "krbtgt/HDT@KTDH" created.
检查是否新增成功:
[root@tdh48401 hdfs1]# sudo kadmin.local
Authenticating as principal root/admin@HDT with password.
kadmin.local: listprincs krbtgt*
krbtgt/HDT@HDT
krbtgt/HDT@KTDH
Step2: KTDH集群通过在guardian-server容器中使用kadmin.guardian新增krbtgt/HDT@KTDH
#注意这里使用上述的26位密码,和TDH集群的密码保持一致
[root@tdh62101 ~]# /var/log/guardian/kadmin.guardian -b admin -w 123456 -r KTDH -q "addprinc -pw NWY3M2ZhOGYyMjFlNGVmM2I2Nz krbtgt/HDT"
检查是否新增成功:
[root@tdh62101 ~]# /var/log/guardian/kadmin.guardian -b admin -w 123456 -r KTDH -q "listprincs" |grep krbtgt
krbtgt/KTDH@KTDH
krbtgt/HDT@KTDH
Step3: 检查两个集群上的时间是否同步,不同步可以通过ntpdate命令或者网络时间协议同步
Step4: 被信任的一方,也就是KTDH集群,每个节点修改/etc/hosts,加入对方集群也就是HDT集群的hostname和ip信息
[root@tdh62101~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.22.23.6 tdh62101
172.22.23.7 tdh62102
172.22.23.8 tdh62103
#以下为新增部分
172.22.23.51 tdh48401
172.22.23.52 tdh48402
172.22.23.53 tdh48403
Step5: 被信任的一方,也就是KTDH集群,修改/etc/krb5.conf
- 4.x的kdc端口为88,无需显式配置,5.x的kdc的端口为1088,需要显式配置
[realms]
KTDH = {
kdc = tdh62101:1088
kdc = tdh62102:1088
}
#以下为新增部分
HDT = {
kdc = tdh48401:88
kdc = tdh48402:88
admin_server = tdh48402
admin_server = tdh48401
}
[domain_realm]
tdh48401 = HDT
tdh48402 = HDT
tdh62101 = KTDH
tdh62102 = KTDH
Step6: 信任的一方,也就是HDT集群,允许识别对方的principal,在每个节点hdfs-site.xml文件新增参数,然后重启hdfs
hadoop.security.auth_to_local
RULE:[1:$1@$0](^.*@.*$)s/^(.*)@.*$/$1/g RULE:[2:$1@$0](^.*@.*$)s/^(.*)@.*$/$1/g DEFAULT
上述表达式几乎通配,因为这里是单向互信,出于安全性考虑可以更狭义一点,在acceptance filter和substitution 阶段只能够识别域为KTDH的principal,配置为
hadoop.security.auth_to_local
RULE:[1:$1@$0](^.*@KTDH$)s/^(.*)@KTDH$/$1/g RULE:[2:$1@$0](^.*@KTDH$)s/^(.*)@KTDH$/$1/g DEFAULT
测试: 在被信任的一方,也就是KTDH集群上测试,看能否访问HDT集群的服务
#这里kinit任意realm的principal都可以,并无强制要求
[root@tdh62101~]$ kinit hdfs/tdh48401@HDT -kt hdfs-23.51.keytab
[root@tdh62101~]$ hadoop fs -ls hdfs://172.22.23.51:8020/
2020-03-31 10:17:27,190 INFO util.KerberosUtil: Using principal pattern: HTTP/_HOST
2020-03-31 10:17:27,366 INFO util.KerberosName: No auth_to_local rules applied to hdfs/tdh48401@HDT
Found 5 items
drwxr-xr-x - hdfs hbase 0 2020-01-09 11:47 hdfs://172.22.23.51:8020/inceptorsql1
drwxrwxrwx - hdfs hadoop 0 2020-01-09 11:44 hdfs://172.22.23.51:8020/tmp
drwxr-xr-x - hdfs hbase 0 2020-03-31 10:13 hdfs://172.22.23.51:8020/transwarp-health-check-dir
drwxrwxrwx - hdfs hadoop 0 2020-01-09 11:48 hdfs://172.22.23.51:8020/user
drwxr-xr-x - hdfs hbase 0 2020-01-09 11:44 hdfs://172.22.23.51:8020/yarn1
注:配置双向互信的方法只需要在双方集群都做配置文件的修改、然后双方的kdc database中都新增krbtgt/TDH-TRUSED@TDH-TRUSTING即可,另外hadoop.security.auth_to_local参数正则匹配2个realm或选择通配