配置两个Hadoop集群Kerberos认证跨域互信

两个Hadoop集群开启Kerberos验证后,集群间不能够相互访问,需要实现Kerberos之间的互信,使用Hadoop集群A的客户端访问Hadoop集群B的服务(实质上是使用Kerberos Realm A上的Ticket实现访问Realm B的服务)。

先决条件:

1)两个集群(IDC.COM和HADOOP.COM)均开启Kerberos认证
2)Kerberos的REALM分别设置为IDC.COM和HADOOP.COM

步骤如下:

1 配置KDC之间的信任ticket

实现DIDC.COM和HADOOP.COM之间的跨域互信,例如使用IDC.COM的客户端访问HADOOP.COM中的服务,两个REALM需要共同拥有名krbtgt/HADOOP.COM@IDC.COM的principal,两个Keys需要保证密码,version number和加密方式一致。
默认情况下互信是单向的, HADOOP.COM的客户端访问IDC.COM的服务,两个REALM需要有krbtgt/IDC.COM@HADOOP.COM的principal。
向两个集群中添加krbtgt principal

 #IDC CLUSTERkadmin.local: addprinc –e “aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal ” krbtgt/HADOOP.COM@IDC.COMkadmin.local: addprinc –e “aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal ”  krbtgt/IDC.COM@HADOOP.COM
  #HADOOP CLUSTERkadmin.local: addprinc –e “aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal ” krbtgt/HADOOP.COM@IDC.COMkadmin.local: addprinc –e “aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal ”  krbtgt/IDC.COM@HADOOP.COM

要验证两个entries具有匹配的kvno和加密type,查看命令使用getprinc

kadmin.local:  getprinc  krbtgt/IDC.COM@HADOOP.COM
Principal: krbtgt/IDC.COM@HADOOP.COM
Expiration date: [never]
Last password change: Wed Jul 05 14:18:11 CST 2017
Password expiration date: [none]
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 30 days 00:00:00
Last modified: Wed Jul 05 14:18:11 CST 2017 (admin/admin@IDC.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 7
Key: vno 1, aes128-cts-hmac-sha1-96
Key: vno 1, des3-cbc-sha1
Key: vno 1, arcfour-hmac
Key: vno 1, camellia256-cts-cmac
Key: vno 1, camellia128-cts-cmac
Key: vno 1, des-hmac-sha1
Key: vno 1, des-cbc-md5
MKey: vno 1
Attributes:
Policy: [none]
kadmin.local:  getprinc  addprinc krbtgt/HADOOP.COM@IDC.COM
usage: get_principal [-terse] principal
kadmin.local:  getprinc  krbtgt/HADOOP.COM@IDC.COM
Principal: krbtgt/HADOOP.COM@IDC.COM
Expiration date: [never]
Last password change: Wed Jul 05 14:17:47 CST 2017
Password expiration date: [none]
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 30 days 00:00:00
Last modified: Wed Jul 05 14:17:47 CST 2017 (admin/admin@IDC.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 7
Key: vno 1, aes128-cts-hmac-sha1-96
Key: vno 1, des3-cbc-sha1
Key: vno 1, arcfour-hmac
Key: vno 1, camellia256-cts-cmac
Key: vno 1, camellia128-cts-cmac
Key: vno 1, des-hmac-sha1
Key: vno 1, des-cbc-md5
MKey: vno 1
Attributes:
Policy: [none]

2 在core-site中配置principal和user的映射RULES

设置hadoop.security.auth_to_local参数,该参数用于将principal转变为user,一个需要注意的问题是SASL RPC客户端需要远程Server的Kerberos principal在本身的配置中匹配该principal。
相同的pricipal name需要分配给源和目标cluster的服务,
例如Source Cluster中的NameNode的kerbeors principal name为nn/h@IDC.COM,在Destination cluster中NameNode的pricipal设置为nn/h@HADOOP.COM(不能设置为nn2/h***@HADOOP.COM),
例如:

在IDC Cluster和 HADOOP Cluster的core-site中增加:
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[1:$1@$0](^.*@HADOOP\.COM$)s/^(.*)@HADOOP\.COM$/$1/g
RULE:[2:$1@$0](^.*@HADOOP\.COM$)s/^(.*)@HADOOP\.COM$/$1/g
RULE:[1:$1@$0](^.*@IDC\.COM$)s/^(.*)@IDC\.COM$/$1/g
RULE:[2:$1@$0](^.*@IDC\.COM$)s/^(.*)@IDC\.COM$/$1/g
DEFAULT
</value>
</property>

使用hadoop org.apache.hadoop.security.HadoopKerberosName 来实现验证,例如:

[root@node1a141 ~]#  hadoop org.apache.hadoop.security.HadoopKerberosName hdfs/nodea1a141@IDC.COMName: hdfs/nodea1a141@IDC.COM to hdfs

3 在krb5.conf中配置信任关系

3.1 配置capaths

第一种方式是配置shared hierarchy of names,这个是默认及比较简单的方式,第二种方式是在krb5.conf文件中改变capaths,复杂但是比较灵活,这里采用第二种方式。
在两个集群的节点的/etc/krb5.conf文件配置domain和realm的映射关系,例如:在IDC cluster中配置:

[capaths]IDC.COM = {HADOOP.COM = .}
在HADOOP Cluster中配置:[capaths]HADOOP.COM = {IDC.COM = .}
配置成'.'是表示没有intermediate realms

3.2 配置realms

为了是IDC 可以访问HADOOP的KDC,需要将HADOOP的KDC Server配置到IDC cluster中,如下,反之相同:

 [realms]IDC.COM = {kdc = {host}.IDC.COM:88admin_server = {host}.IDC.COM:749default_domain = IDC.COM}HADOOP.COM = {kdc = {host}.HADOOP.COM:88admin_server = {host}.HADOOP.COM:749default_domain = HADOOP.COM}

3.3 配置domain_realm

在domain_realm中,一般配置成’.IDC.COM’和’IDC.COM’的格式,’.'前缀保证kerberos将所有的IDC.COM的主机均映射到IDC.COM realm。但是如果集群中的主机名不是以IDC.COM为后缀的格式,那么需要在domain_realm中配置主机与realm的映射关系,例IDC.nn.local映射为IDC.COM,需要增加IDC.nn.local = IDC.COM。

[domain_realm]
.hadoop.com=HADOOP.COMhadoop.com=HADOOP.COM.IDC.com=IDC.COMIDC.com=IDC.COMnode1a141 = IDC.COMnode1a143 = IDC.COMnode1a210 = HADOOP.COMnode1a202 = HADOOP.COMnode1a203 = HADOOP.COM
重启kerberos服务

3.4 配置hdfs-site.xml

在hdfs-site.xml,设置允许的realms
在hdfs-site.xml中设置dfs.namenode.kerberos.principal.pattern为"*"

这个是客户端的匹配规则用于控制允许的认证realms,如果该参数不配置,会有下面的异常:

java.io.IOException: Failed on local exception: java.io.IOException:
java.lang.IllegalArgumentException:Server has invalid Kerberosprincipal:nn/ HADOOP.COM@ IDC.COM;Host Details : local host is: "host1.IDC.COM/10.181.22.130";destination host is: "host2.HADOOP.COM":8020;

4 测试

1)使用hdfs命令测试IDC 和HADOOP 集群间的数据访问
例如在IDC Cluster中kinit admin@IDC.COM,然后运行hdfs命令,查看本机群和对方集群得hdfs目录:
如果未开启跨域互信,访问对方hdfs目录时会报认证错误

[root@node1a141 ~]# kdestroy在本机群客户端登陆admin用户,通过kerberos认证
[root@node1a141 ~]# kinit admin
Password for admin@IDC.COM:访问本集群hdfs
[root@node1a141 ~]# hdfs dfs -ls /
Found 3 items
drwxrwxrwx+  - hdfs supergroup          0 2017-06-13 15:13 /tmp
drwxrwxr-x+  - hdfs supergroup          0 2017-06-22 15:55 /user
drwxrwxr-x+  - hdfs supergroup          0 2017-06-14 14:11 /wa访问对方集群hdfs
[root@node1a141 ~]# hdfs dfs -ls hdfs://node1a202:8020/
Found 9 items
drwxr-xr-x   - root  supergroup          0 2017-05-27 18:55 hdfs://node1a202:8020/cdtest
drwx------   - hbase hbase               0 2017-05-22 18:51 hdfs://node1a202:8020/hbase
drwx------   - hbase hbase               0 2017-07-05 19:16 hdfs://node1a202:8020/hbase1
drwxr-xr-x   - hbase hbase               0 2017-05-11 10:46 hdfs://node1a202:8020/hbase2
drwxr-xr-x   - root  supergroup          0 2016-12-01 17:30 hdfs://node1a202:8020/home
drwxr-xr-x   - mdss  supergroup          0 2016-12-13 18:30 hdfs://node1a202:8020/idfs
drwxr-xr-x   - hdfs  supergroup          0 2017-05-22 18:51 hdfs://node1a202:8020/system
drwxrwxrwt   - hdfs  supergroup          0 2017-05-31 17:37 hdfs://node1a202:8020/tmp
drwxrwxr-x+  - hdfs  supergroup          0 2017-05-04 15:48 hdfs://node1a202:8020/user
在HADOOP.COM中进行相同的操作

2)运行distcp程序将IDC的数据复制到HADOOP集群,命令如下:

[root@node1a141 ~]# hadoop distcp hdfs://node1a141:8020/tmp/test.sh  hdfs://node1a202:8020/tmp/

5 附录

两集群的/etc/krb5.conf完整文件内容如下:[root@node1a141 IDC]# cat /etc/krb5.conf
[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[libdefaults]default_realm = IDC.COMdns_lookup_realm = falsedns_lookup_kdc = falseticket_lifetime = 7drenew_lifetime = 30forwardable = truerenewable=true#default_ccache_name = KEYRING:persistent:%{uid}[realms]HADOOP.COM = {kdc = node1a198admin_server = node1a198default_realm = HADOOP.COMsupported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal}IDC.COM = {kdc = node1a141admin_server = node1a141default_realm = IDC.COMsupported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal}[domain_realm].hadoop.com=HADOOP.COMhadoop.com=HADOOP.COM.IDC.com=IDC.COMIDC.com=IDC.COMnode1a141 = IDC.COMnode1a143 = IDC.COMnode1a210 = HADOOP.COMnode1a202 = HADOOP.COMnode1a203 = HADOOP.COM[capaths]
IDC.COM = {HADOOP.COM = .
}

原文地址 配置两个Hadoop集群Kerberos认证跨域互信

配置两个Hadoop集群Kerberos认证跨域互信(两个集群互通)相关推荐

  1. hadoop生态的kerberos认证系列2-hadoop

    hadoop生态的kerberos认证系列2-hadoop 一.准备工作 二.配置 1.hdfs配置kerberos认证 1.1所有节点安装autoconf 1.2所有节点安装gcc 1.3安装jsv ...

  2. vb跨域访问ajax,解决AJAX的跨域访问-两种有效示例

    这篇文章主要为大家详细介绍了解决AJAX的跨域访问-两种有效示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!新的W3C策略实现了HTTP跨域访问,还 ...

  3. Kerberos安装以及使用ambari开启HDP集群Kerberos认证

    文章目录 环境准备 安装KDC MASTER 安装KDC SLAVER 安装客户端: 使用ambari 环境准备 安装jdk 下载Cryptography Extension (JCE) Unlimi ...

  4. hadoop KerberosUtil 做Kerberos认证

    网上找了一下,自己写了个KerberosUtil工具类,测试过可以用. 注意这个不是 org.apache.hadoop.security.authentication.util.KerberosUt ...

  5. 踩坑Gateway服务搭建、配置网关路由、路径重写和解决跨域问题(java类实现跨域)

    由于项目需要,需要使用Gateway,话不多说直接干 引入依赖 <dependency><groupId>org.springframework.cloud</group ...

  6. yii2 跨域请求配置_如何在SpringBoot应用中实现跨域访问资源和消息通信?

    允许跨域访问 CORS ( Cross Origin Resource Sharing,跨域资源共享)机制允许Web应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行.浏览器支持在API容器中 ...

  7. 全局配置axios、axios 拦截器 和 proxy 跨域代理

    目录 一.全局配置axios 1. 为什么要全局配置 axios 2. 如何全局配置 axios 3. 在 vue3 的项目中全局配置axios ​ 4. 在 vue2 的项目中全局配置 axios ...

  8. filter java 继承_zuul实现Cors跨域的两种方式:corsFilter、继承ZuulFilter

    大家都知道spring boot 可以通过@CrossOrigin实现跨域.但是在spring cloud 里,如果要粒度那么细的去控制跨域,这个就太繁琐了,所以一般来说,会在路由zuul里实现. 第 ...

  9. SpringMVC解决跨域的两种方案

    1. 什么是跨域 2. 跨域的应用情景 3. 通过注解的方式允许跨域 4. 通过配置文件的方式允许跨域 1. 什么是跨域 跨域,即跨站HTTP请求(Cross-site HTTP request),指 ...

最新文章

  1. typora最好用的主题_谁是我心中最好的写作工具?
  2. -webkit-font-smoothing
  3. 【错误记录】编译 Android 版本的 ijkplayer 报错 ( You must define ANDROID_NDK before starting. | 下载指定版本 NDK )
  4. Wireshark的入门使用
  5. eval?python顺序列表模拟栈实现计算器
  6. LeetCode(90):子集 II
  7. vue 父组件与子组件之间的传值(主动传值)
  8. MyBatis之查询缓存
  9. ECMAScript
  10. Tumblr 架构设计
  11. 数据库系统的主要组成部分
  12. 使用 JDBC 进行 MySQL 编程
  13. 逃出你的肖申克(二):仁者见仁智者见智?从视觉错觉到偏见
  14. Mysql—索引③:优化篇(不仅仅是索引)
  15. TensorFlow Estimator 官方文档之----内置Estimator
  16. Activiti6--入门学习--结束事件
  17. 计算机三级数据库知识点整理
  18. 导电滑环工作原理及部件解析
  19. Excel禁用右键后的惊恐
  20. mapper接口原理

热门文章

  1. type=xhr的500错误
  2. 用 Servlet 进行上载的原理和实现
  3. 数据库中的完整性约束及实例
  4. MongoDB学习笔记一:MongoDB的下载和安装
  5. android 联系人中,在超大字体下,加入至联系人界面(ConfirmAddDetailActivity)上有字体显示不全的问题...
  6. 预算执行审计计算机审计方法,预算执行审计中计算机审计思路和SQL语句运用.doc...
  7. 【JAVA基础知识总结】JAVA对象转型之上转型对象与下转型对象
  8. Linux gtk开发教程,使用GTK+和Glade快速开发Linux图形界面
  9. Android程序对不同手机屏幕分辨率自适应的总结
  10. 社保基金入市规模或达3000亿元