Hadoop多Kerberos冲突
Hadoop使用Kerberos果然问题多多,最近准备使用LDAP和DNS,又碰上了,记录一下吧。
背景
之前为了解决Hadoop的安全问题,仓促之间上了个Kerberos,使用了一个随便起的域名,记为HADOOP.REALM.COM
吧,相关的服务器也没有使用DNS,直接shortname加hosts搞定。
近期准备使用LDAP和DNS,前者使用新域名(记为LDAP.REALM.COM
),后者使得机器全名变成了shortname.ldap.realm.com
,分别引起了一个问题。由于近期没有重启Hadoop的计划,也只能找方法来绕过。
问题及应对
如果不将LDAP.REALM.COM
设置成Kerberos默认域,那么登陆认证就无法完成(也许有地方能配置,最好别改)。/etc/krb5.conf
关键配置如下(Hadoop的Kerberos有冗余):
[libdefaults]
default_realm = LDAP.REALM.COM
[realms]
LDAP.REALM.COM = {
kdc = ldapKrbA.ldap.realm.com:88
}
HADOOP.REALM.COM = {
kdc = hadoopKrbA:88
kdc = hadoopKrbB:88
}
问题一,按照这个配置,在Hadoop客户端服务器上使用principal全名分别获取两个域的TGT是没有问题的,但hadoop命令报错:failure to login
。
由于默认域是LDAP.REALM.COM
,执行hadoop命令时,拿着HADOOP.REALM.COM
的TGT去找LDAP.REALM.COM
,报错也就是理所应当的了,可以通过在hadoop-env.sh
中加上如下的语句来告诉Hadoop去哪找Kerberos:
export HADOOP_OPTS="-Djava.security.krb5.realm=HADOOP.REALM.COM -Djava.security.krb5.kdc=hadoopKrbA:hadoopKrbB $HADOOP_OPTS"
问题二,上述问题解决后,DNS引起的问题又出现了,hadoop命令报错:Fail to create credential. (63) - No service creds
。
Kerberos的认证是由三方完成的,客户端和服务端都要向Kerberos提供有效票据,使用DNS后,NameNode的机器名从shortname
变成了shortname.ldap.realm.com
,HADOOP的Kerberos中只有host/shortname@HADOOP.REALM.COM
,没有host/shortname.ldap.realm.com@HADOOP.REALM.COM
,当然也就无法完成请求服务票流程了。解决方法是在/etc/hosts
里保留原来的NN的解析:
ip shortname
这样在进行反解后仍然去请求host/shortname@HADOOP.REALM.COM
。短名全名、正解反解目前还没理清,涉及认证这一块的东西有条件使用全名的直接使用全名比较好。
其他
上面的两个问题只是Hadoop客户端上的,从这个架势来看,Hadoop集群上想使用LDAP特别是DNS是不可能了,只能等待机会整个迁移到新Kerberos。