在Hadoop生态中,跨集群安全认证的核心目标是实现不同集群间用户与服务的身份互认,确保跨集群访问的安全性(如数据同步、作业调度、资源共享)。当前主流的实现方式是Kerberos跨域互信,辅以LDAP/AD集成(统一用户管理)和Apache Knox SSO(简化认证流程),形成“身份认证-授权-审计”的完整安全体系。
一、核心机制:Kerberos跨域互信
Kerberos是Hadoop生态的标准认证协议,通过“票据授予票据(TGT)+服务票据(ST)”的交换实现双向身份验证。跨集群场景下,需通过KDC(Key Distribution Center)互信,使一个集群的用户/服务能使用本地Kerberos票据访问另一个集群的资源。
1. 前提条件
- 两个集群均启用Kerberos认证:需先为每个集群配置Kerberos(如生成KDC、创建主体、分发Keytab等)。
- 定义不同的Kerberos Realm:为每个集群分配唯一的Realm(如CLUSTER-A.COM、CLUSTER-B.COM),用于区分不同集群的身份域。
2. 配置步骤
(1)创建跨域信任Principal
在两个集群的KDC中创建相互信任的主体(krbtgt主体),用于跨域票据授予。
- 示例命令(Cluster A的KDC): kadmin.local -q "addprinc -e \"aes128-cts:normal des3-hmac-sha1:normal\" krbtgt/CLUSTER-B.COM@CLUSTER-A.COM" 此命令创建CLUSTER-B.COM领域的票据授予票据,供CLUSTER-A.COM的用户访问CLUSTER-B.COM的服务。
- 示例命令(Cluster B的KDC): kadmin.local -q "addprinc -e \"aes128-cts:normal des3-hmac-sha1:normal\" krbtgt/CLUSTER-A.COM@CLUSTER-B.COM" 此命令创建CLUSTER-A.COM领域的票据授予票据,供CLUSTER-B.COM的用户访问CLUSTER-A.COM的服务。 注意:两个krbtgt主体的加密类型(Encryption Types)和密钥版本号(KVNO)必须一致,否则跨域认证会失败。
(2)配置KDC信任关系
修改两个集群的krb5.conf文件(位于/etc/krb5.conf),添加对方的KDC信息,建立信任路径。
- Cluster A的krb5.conf配置: [libdefaults] default_realm = CLUSTER-A.COM dns_lookup_realm = false dns_lookup_kdc = true ticket_lifetime = 24h renew_lifetime = 7d [realms] CLUSTER-A.COM = { kdc = kdc-a.cluster-a.com admin_server = kdc-a.cluster-a.com } CLUSTER-B.COM = { kdc = kdc-b.cluster-b.com admin_server = kdc-b.cluster-b.com } [domain_realm] .cluster-a.com = CLUSTER-A.COM cluster-a.com = CLUSTER-A.COM .cluster-b.com = CLUSTER-B.COM cluster-b.com = CLUSTER-B.COM
- Cluster B的krb5.conf配置: 类似Cluster A,将CLUSTER-A.COM和CLUSTER-B.COM的信息互换。
(3)配置Hadoop集群的Kerberos参数
修改Hadoop的核心配置文件(core-site.xml、hdfs-site.xml、yarn-site.xml),启用Kerberos认证并指定跨域主体。
- core-site.xml配置: <configuration> <property> <name>hadoop.security.authentication</name> <value>kerberos</value> <!-- 启用Kerberos认证 --> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> <!-- 启用授权 --> </property> <property> <name>hadoop.security.auth_to_local</name> <value>RULE:[2:$1@$0]([ndj]n/.*@CLUSTER-B.COM)s/.*/hdfs/RULE:[2:$1@$0](hdfs/.*@CLUSTER-B.COM)s/.*/hdfs/RULE:[1:$1@$0]([^@]*@CLUSTER-B.COM)s/@.*//</value> <!-- 将跨域主体映射到本地用户(如hdfs) --> </property> </configuration> 说明:hadoop.security.auth_to_local规则用于将Kerberos主体(如hdfs/hadoop-b.cluster-b.com@CLUSTER-B.COM)转换为本地系统用户(如hdfs),确保跨集群服务能正确识别用户身份。
- hdfs-site.xml配置: <configuration> <property> <name>dfs.namenode.kerberos.principal</name> <value>hdfs/hadoop-a.cluster-a.com@CLUSTER-A.COM</value> <!-- NameNode主体 --> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>hdfs/hadoop-a.cluster-a.com@CLUSTER-A.COM</value> <!-- DataNode主体 --> </property> <property> <name>dfs.web.authentication.kerberos.principal</name> <value>HTTP/hadoop-a.cluster-a.com@CLUSTER-A.COM</value> <!-- Web UI主体 --> </property> </configuration> 说明:需为跨集群的服务(如NameNode、DataNode)指定正确的Kerberos主体,确保服务间能相互认证。
(4)分发Keytab文件
将每个集群的Keytab文件(包含主体密钥)分发到其他集群的对应节点,用于自动认证(避免每次输入密码)。
- 示例命令: # 将Cluster A的NameNode Keytab复制到Cluster B scp /etc/security/keytabs/hdfs.headless.keytab user@hadoop-b.cluster-b.com:/etc/security/keytabs/ 注意:Keytab文件的权限需设置为400(仅所有者可读),避免泄露。
(5)测试跨域认证
使用kinit命令获取票据,并测试跨集群访问:
- 在Cluster A上获取票据: kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs/hadoop-a.cluster-a.com@CLUSTER-A.COM
- 访问Cluster B的HDFS: hdfs dfs -ls hdfs://hadoop-b.cluster-b.com:9000/ # 使用Cluster B的HDFS地址 若能成功列出目录,说明跨域认证配置成功。
二、补充机制:LDAP/AD集成
为了简化用户管理,企业通常会将LDAP(Lightweight Directory Access Protocol)或Active Directory(AD)与Hadoop集成,实现统一用户身份存储。跨集群场景下,LDAP/AD可作为“权威用户源”,确保所有集群的用户账号一致。
1. 集成步骤
- 配置Hadoop的LDAP/AD连接:修改core-site.xml,指定LDAP/AD的服务器地址、 base DN(Distinguished Name)、用户搜索过滤器等参数。 示例配置: <configuration> <property> <name>hadoop.security.group.mapping</name> <value>org.apache.hadoop.security.LdapGroupsMapping</value> <!-- 使用LDAP进行组映射 --> </property> <property> <name>hadoop.security.group.mapping.ldap.url</name> <value>ldap://ldap-server:389</value> <!-- LDAP服务器地址 --> </property> <property> <name>hadoop.security.group.mapping.ldap.base.dn</name> <value>dc=example,dc=com</value> <!-- Base DN --> </property> <property> <name>hadoop.security.group.mapping.ldap.user.search.filter</name> <value>(&(objectClass=user)(sAMAccountName={0}))</value> <!-- 用户搜索过滤器 --> </property> </configuration>
- 同步用户到Hadoop:使用hadoop fs -chown或hadoop fs -chmod命令,将LDAP/AD中的用户同步到Hadoop集群,确保跨集群的用户权限一致。
三、优化机制:Apache Knox SSO
Apache Knox是Hadoop的API网关,可实现单点登录(SSO),简化跨集群的认证流程。通过Knox,用户只需登录一次,即可访问多个集群的服务(如HDFS、YARN、Hive)。
1. 集成步骤
- 部署Knox网关:在每个集群的前端部署Knox网关,作为所有REST API和UI的入口。
- 配置Knox的SSO:修改Knox的knoxsso.xml配置文件,指定LDAP/AD或Kerberos作为认证源,启用SSO功能。
- 集成Hadoop集群:将Hadoop集群的服务(如HDFS的NameNode UI)添加到Knox的代理列表,使Knox能代理所有集群的服务请求。