TDH4.X和TDH5.X或TDH6.X之间配置单向或双向互信

  使用配置
内容纲要

概要描述


对于单个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

环境准备

file

file

详细说明


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或选择通配

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。