概要描述
对于单个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的密码和使用的加密类型必须是相同的
本文将举例如何建立KTDH到TDH集群的单向信任(TDH集群需要访问KTDH集群的资源)
- KTDH outgoing TDH
- 信任的一方是KTDH,被信任的一方是TDH
环境准备
详细说明
Step1: 任意一个集群的Guardian页面添加互信关系,注意密码要填写目标域中管理员的密码
- 这里我们在KTDH集群上添加对TDH集群的OUTGOING信任,代表TDH集群可以单向访问KTDH集群
- KTDH集群添加好之后,在TDH集群上能看到对应的生成了INCOMING的信任关系
- 该步完成之后,会在双方realm下生成 DN: uid=krbtgt/KTDH@TDH,ou=System,ou=People,dc=tdh (krbtgt/TDH-TRUSTING@TDH-TRUSTED)
- Realm一栏需要填写另一个Realm的名称;
- 信任类型可以选择为INCOMMING,OUTGOING,TWO_WAY三种;
- 主机名为另一个Realm中guardian-server的ip地址或者主机名,端口号为其端口号,默认为8380,并且默认开启TLS协议;
- 域管理员为另一个域中具有管理员角色的用户;密码为域管理员的密码
通过后台命令判断是否添加成功:
> ldapsearch -H ldap://localhost:10389 -x -D uid=admin,ou=system -w 123456 -b ou=System,ou=People,dc=tdh | grep 'uid=krbtg'
Step2: 检查两个集群上的时间是否同步,不同步可以通过ntpdate命令或者网络时间协议同步
Step3: 被信任的一方,也就是TDH集群,每个节点修改/etc/hosts,加入对方集群也就是KTDH的hostname和ip信息
Step4: 被信任的一方,也就是TDH集群,修改/etc/krb5.conf
[realms]
TDH = {
kdc = tdh62001:1088
kdc = tdh62002:1088
}
KTDH = {
kdc = tdh62101:1088
kdc = tdh62102:1088
}
[domain_realm]
tdh62001 = TDH
tdh62002 = TDH
tdh62003 = TDH
tdh62101 = KTDH
tdh62102 = KTDH
tdh62103 = KTDH
Step5: 信任的一方,也就是KTDH集群,允许识别对方的principal,在hdfs界面添加自定义参数然后配置服务重启hdfs
- 目的是修改nn和snn节点上的core-site.xml
hadoop.security.auth_to_local
RULE:[1:$1@$0](^.*@.*$)s/^(.*)@.*$/$1/g RULE:[2:$1@$0](^.*@.*$)s/^(.*)@.*$/$1/g DEFAULT
上述表达式几乎通配,因为这里是单向互信,出于安全性考虑可以更狭义一点,在acceptance filter和substitution 阶段只能够识别域为TDH的principal,配置为
hadoop.security.auth_to_local
RULE:[1:$1@$0](^.*@TDH$)s/^(.*)@TDH$/$1/g RULE:[2:$1@$0](^.*@TDH$)s/^(.*)@TDH$/$1/g DEFAULT
测试: 在被信任的一方,也就是TDH集群上测试,看能否访问KTDH集群的服务
[root@tdh62001 ~]# hadoop fs -ls hdfs://172.22.23.7:8020/
Found 8 items
drwx--x--x - hbase hbase 0 2020-03-27 21:43 hdfs://172.22.23.7:8020/hyperbase1
drwx--x--x - hive hive 0 2020-03-26 14:24 hdfs://172.22.23.7:8020/inceptor1
drwx--x--x - hive hive 0 2020-03-26 22:17 hdfs://172.22.23.7:8020/inceptor2
drwx--x--x - hive hive 0 2020-03-26 22:36 hdfs://172.22.23.7:8020/slipstream1
drwx--x--x - hive hive 0 2020-03-26 22:38 hdfs://172.22.23.7:8020/slipstreamstudio1
drwxrwxrwt - hdfs hadoop 0 2020-03-27 19:13 hdfs://172.22.23.7:8020/tmp
drwxrwxrwt - hdfs hadoop 0 2020-03-26 22:31 hdfs://172.22.23.7:8020/user
drwxr-xr-x - hdfs hbase 0 2020-03-26 14:15 hdfs://172.22.23.7:8020/yarn1
注:配置双向互信的方法只需要在双方集群都做配置文件的修改即可,另外hadoop.security.auth_to_local参数正则匹配2个realm或者选择通配