集群互信配置
更新时间:2025-01-21
工作准备
注意事项:
- 进行互信配置的两个集群的 nameservice 需要不同,BMR 默认 nameservice 为 bmr-cluster
- 本文以 BMR 跨域访问 CDH 集群中的服务为例。配置完成后,BMR 在获取到本集群 KDC 授予的TGT(Ticket Granting Ticket)后,能够跨域访问 CDH 中的服务。
- 本文配置的跨域互信是单向的,即 CDH 无法跨域访问 BMR 上的服务,如果需要实现双向跨域互信,按照同样的方法交换配置即可。
- 如需配置外部集群(即CDH集群)与BMR集群间的互信,除本文说明操作外还需要修改 BMR 安全组规则使外部集群可访问 BMR 集群 Kerberos 服务。
在进行配置前,需获知集群 hostname 或 ip 以及 realm 信息,以 master 节点获取 hostname 和 realm 为例,具体操作步骤如下。
- 登录 BMR 集群的 master 节点;
- 执行
hostname
命令获取 hostname;或通过接口可直接获取集群hostname列表,参考 实例操作接口; - 在 master 节点的 /etc/krb5.conf 文件中获取 realm,执行,其中 default_realm 即为所需的集群 realm。
cat /etc/krb5.conf
为方便表述实际使用方式,在本文中,规定所使用的 BMR 集群与 CDH 集群信息如下:
集群 | hostname | realm |
---|---|---|
BMR | master-8932187 | BAIDU.COM |
CDH | test-cdh5-1 | CDHTEST.COM |
添加跨域认证 Principal
注意事项
- 实现 BMR 集群和 CDH 集群之间的跨域互信,例如使用 BMR 集群的客户端访问 CDH 集群中的服务,两个集群 realm 需要同时拥有名为 krbtgt/CDHTEST.COM.COM@BAIDU.COM的 principal。
- 默认情况下互信是单向的,CDH集群的客户端如需访问BMR集群的服务,两个REALM则需要有krbtgt/BAIDU.COM@CDHTEST.COM的principal。两个两次操作需要保证密码,version number和加密方式一致。
具体操作步骤如下:
- 使用 root 用户,SSH 登录 BMR 集群的 master 节点;
- 执行以下命令,添加 princ,其中 krbtgt/CDHTEST.COM@BAIDU.COM 为跨域访问的共同 principal;
kadmin.local -q 'add_principal -e "aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal" krbtgt/CDHTEST.COM@BAIDU.COM'
- 按照提示输入两次密码(建议为集群密码),在两个集群中添加Principal时使用的密码必须一致;
- 登录 CDH 集群,重复上述步骤1~2。
配置principal和user的映射关系
- SSH 登录 BMR 集群的 master 节点;
- 执行以下命令,获取 HDFS 配置文件 core-site 中的hadoop.security.auth_to_local值:
cat /etc/hadoop/conf/core-site.xml
- 将步骤2中获取的值,追加到 CDH 集群的 HDFS 配置文件 hadoop.security.auth_to_local 值末尾;
- 配置完毕后,重启 CDH 集群的HDFS;
- 配置完成后,在 CDH 集群节点上执行 hadoop org.apache.hadoop.security.HadoopKerberosName princ查看是否能成功解析用户。
配置krb5.conf
- SSH 登录 BMR 集群的 master 节点;
- 执行以下命令,修改 BMR 集群上krb5.conf的配置信息。注:一个集群中所有节点的 krb5.conf 配置一致:
vim /etc/krb5.conf
- 修改krb5.conf中的[domain_realm],将 CDH 及BMR集群的节点 hostname 和realm做映射
修改前格式如下:
[domain_realm]
baidu.com = BAIDU.COM
修改后示例如下:
[domain_realm]
baidu.com = BAIDU.COM
core-8932187-3 = BAIDU.COM
core-8932187-2 = BAIDU.COM
core-8932187-1 = BAIDU.COM
master-8932187 = BAIDU.COM
test-cdh5-1.baidu.com = CDHTEST.COM
test-cdh5-2.baidu.com = CDHTEST.COM
test-cdh5-3.baidu.com = CDHTEST.COM
- 修改 krb5.conf 中的 [realms] ,将 CDH的 KDC Server(配置在 CDH 集群的 krb5.conf 中)配置到 BMR 的 realms 中
修改前格式如下:
[realms]
BAIDU.COM = {
#kadmin instance_name
admin_server = master-8932187
#kdc instance_name
kdc = master-8932187
database_module = openldap_ldapconf
}
修改后格式如下:
[realms]
BAIDU.COM = {
#kadmin instance_name
admin_server = master-8932187
#kdc instance_name
kdc = master-8932187
database_module = openldap_ldapconf
}
HWLPOC.COM = {
kdc = test-cdh5-1.baidu.com
admin_server = test-cdh5-1.baidu.com
}
- krb5.conf中新增[capaths],krb5.conf 中 默认没有 [capaths] 相关配置。需新增配置,示例如下:
[capaths]
CDHTEST.COM = {
BAIDU.COM = .
}
-
同步修改好的krb5.conf配置信息复制到BMR集群所有节点
a.SSH 登录 BMR 集群master节点
b.执行如下命令:
vim instance
#把BMR集群所有节点(除了当前)hostname写入文件中,保存
ansible -i instance all -m copy -a "src=/etc/krb5.conf dest=/etc/krb5.conf"
- 重启Kerberos服务
a.在master节点上执行如下命令
systemctl restart krb5kdc.service
systemctl restart kadmin.service
b.在master节点上执行如下命令
[libdefaults]
kdc_timeout = 3000
max_retries = 3
udp_preference_limit = 1
renew_lifetime = 7d
forwardable = true
#cluster realm
default_realm = BAIDU.COM
ticket_lifetime = 24h
dns_lookup_realm = false
dns_lookup_kdc = false
default_ccache_name = /tmp/krb5cc_%{uid}
#default_tgs_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
#default_tkt_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
[domain_realm]
#cluster realm
baidu.com = BAIDU.COM
core-8932187-3 = BAIDU.COM
core-8932187-2 = BAIDU.COM
core-8932187-1 = BAIDU.COM
master-8932187 = BAIDU.COM
test-cdh5-1.baidu.com = CDHTEST.COM
test-cdh5-2.baidu.com = CDHTEST.COM
test-cdh5-3.baidu.com = CDHTEST.COM
[logging]
default = FILE:/mnt/bmr/log/kerberos/krb5kdc.log
admin_server = FILE:/mnt/bmr/log/kerberos/kadmind.log
kdc = FILE:/mnt/bmr/log/kerberos/krb5kdc.log
[realms]
BAIDU.COM = {
#kadmin instance_name
admin_server = master-8932187
#kdc instance_name
kdc = master-8932187
database_module = openldap_ldapconf
}
CDHTEST.COM = {
kdc = test-cdh5-1.baidu.com
admin_server = test-cdh5-1.baidu.com
}
[dbdefaults]
ldap_kerberos_container_dn = cn=krbcontainer,dc=bmr.sh,dc=com
[dbmodules]
openldap_ldapconf = {
db_library = kldap
#openldap ip
ldap_servers = ldap://172.18.0.33
ldap_kerberos_container_dn = cn=krbcontainer,dc=bmr.sh,dc=com
ldap_kdc_dn = uid=krb5kdc,ou=People,dc=bmr.sh,dc=com
ldap_kadmind_dn = uid=kadmind,ou=People,dc=bmr.sh,dc=com
#kerberos-ldap key file
ldap_service_password_file = /etc/krb5.ldap
ldap_conns_per_server = 5
}
[capaths]
CDHTEST.COM = {
BAIDU.COM = .
}
修改BMR集群的/etc/hosts
- SSH 登录 BMR 集群的 master 节点;
- 复制 CDH 集群节点 /etc/hosts 中的 CDH 集群节点信息,追加到 BMR 当前节点的 /etc/hosts 文件中。
vim instance
#把 BMR 所有节点(除了当前)hostname写入文件中,保存
ansible -i cores all -m copy -a "src=/etc/hosts dest=/etc/hosts"
互信验证
BMR 集群访问 CDH 集群的 HDFS 文件,示例如下:
#查看本集群hdfs
hdfs dfs -ls /
#查看CDH集群hdfs
#test-cdh5-1.baidu.com为CDH集群的namenode所在节点
hdfs dfs -ls hdfs://test-cdh5-1.baidu.com:8020/