ZOOKEEPER、HDFS、YARN、HBASE配置Kerberos认证

 注:在配置kerberos认证之前,必须先确保成功安装kerberos集群

  安装教程:Centos7安装大数据安全认证组件Kerberos

一、环境说明

环境说明
                   系统环境                                  集群节点分布
      名称        版本          IP地址       主机名     kerberos 服务分布
    JDK版本       1.8  192.168.120.110     hadoop01         server/client
   Linux版本    Centos7  192.168.120.111     hadoop02             client
   操作用户       root  192.168.120.112     hadoop03             client

二、生成HDFS/Zookeeper/Hbase的keytab证书

1.生成Zookeeper的keytab证书

这里需要说明的是,我使用的是自己搭建的基于原生Apache大数据组件的集群,启动和使用集群的普通用户是hadoop,所以在生成keytab时需要添加hadoop用户的凭据,还需要添加HTTP及Zookeeper的凭据,添加HTTP凭据是因为集群网络通讯所需的,而Zookeeper的凭据是因为Zookeeper配置kerberos认证时的jaas.conf中的server端必须指定的,那么下面就来生成对应的凭据吧。保证在启动了kerberos的krb5kdc和kadmin服务后,在安装了kerberos服务器端的节点上,我这里安装kerberos服务器的节点是hadoop01,所以我在hadoop01节点上使用root用户生成相应的keytab证书,命令如下:

#添加HTTP服务的凭据
kadmin.local -q "addprinc -randkey HTTP/$host@HADOOP.COM"
#添加zookeeper的凭据
kadmin.local -q "addprinc -randkey zookeeper/$host@HADOOP.COM"
#添加hadoop用户的凭据
kadmin.local -q "addprinc -randkey hadoop/$host@HADOOP.COM"
#生成包含前三个凭据的keytab证书,hadoop.keytab为最终生成的证书的名称
kadmin.local -q "xst -k hadoop.keytab hadoop/$host HTTP/$host zookeeper/$host"

执行上述命令后,生成的hadoop.keytab就在执行该命令的路径下,我们需要在集群每个节点提前准备一个存放keytab证书的目录,我是将每个节点生成的keytab证书放在每个主机提前创建好的 /etc / security/keytab 目录中,需要注意的是,集群中有几个节点就需要在kerberos服务器节点hadoop01上执行上面的四条命令几次,因为要生成集群中每个主机对应的keytab证书,当要生成某个节点的keytab证书时,需要将上面命令中的 $host 替换成对应节点的主机名,然后将每个节点生成的hadoop.keytab证书远程发送到对应节点的 /etc / security/keytab 目录,因为有了 keytab 相当于有了永久凭证,不需要提供密码(如果修改 kdc 中的 principal 的密码,则该 keytab 就会失效),所以其他用户如果对该文件有读权限,就可以冒充 keytab 中指定的用户身份访问集群中的服务,所以 keytab 文件需要确保只对 owner(我这里的owner是hadoop用户) 有读权限。

#修改keytab存放目录的用户组
chown -R hadoop:hadoop /etc/security/keytab
#修改hadoop.keytab证书的权限为400
chmod 400 /etc/security/keytab/hadoop.keytab

三、Zookeeper配置kerberos认证

 :以下的内容可以在一个节点配置好发送到其他节点相应路径下,其他内容一致但需要修改3.2中的jaas.conf中的host_name为当前节点的主机名!

 3.1 修改$ZOOKEEPER_HOME/conf/目录下创建zoo.cfg配置文件,在原有配置文件的末尾添加如下内容:

kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000

3.2 在$ZOOKEEPER_HOME/conf/目录下创建jaas.conf配置文件,其内容如下:

Server {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/etc/security/keytab/hadoop.keytab" #keytab证书的位置
  storeKey=true
  useTicketCache=false
  principal="zookeeper/host_name@HADOOP.COM"; #这里必须是zookeeper,否则zk的客户端后面启动报错
};

Client {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/etc/security/keytab/hadoop.keytab"
  storeKey=true
  useTicketCache=false
  principal="hadoop/host_name@HADOOP.COM";
};

注意:上面配置文件中的host_name是每个节点对应的主机名,我之前在网上学习别的大牛关于zookeeper配置kerberos的时候,他们配置的是:principal="hadoop/_HOST@HADOOP.COM"; 当我跟着这样配置完所有节点,在启动zookeeper服务时,却发生了让我困扰了两天的问题,QuorumPeerMain 进程死活启动不起来,我去查看zookeeper的log日志,报错如下:

java.io.IOException: Could not configure server because SASL configuration did not allow the  ZooKeeper server to authenticate itself properly: javax.security.auth.login.LoginException: No password provided
	at org.apache.zookeeper.server.ServerCnxnFactory.configureSaslLogin(ServerCnxnFactory.java:211)
	at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:82)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:130)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:111)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)

报错的内容是:无法配置服务器,因为SASL配置不允许ZooKeeper服务器正确地进行身份验证,这到底是什么意思?我去网上查询了这个错,但几乎查不到对症的解决方案和原因,有的说是zookeeper可能配置的伪分布式的,国外的有两篇博客跟我同样的错,但是他们的解答是keytab证书生成的有问题或是未配置 udp_preference_limit = 1 ,即kerberos必须使用tcp协议而不是udp,但是显然这些原因我都已经反复检查过了,没有问题,在反复的查资料和测试的时候,我才忽然发现是因为 _HOST 这个配置在HDFS、YARN及HBASE的xml配置文件中是可以自动解析成对应节点的主机名,而在jaas.conf这里无法解析对应节点的主机名,通过监控KDC的krb5kdc.log文件,发现这里将_HOST 解析成了host,所以导致zookeeper进程无法启动。

3.3 在$ZOOKEEPER_HOME/conf/目录下创建java.env配置文件,添加如下内容:

export JVMFLAGS="-Djava.security.auth.login.config=$ZOOKEEPER_HOME/conf/jaas.conf"

3.4 重启zookeeper服务即可

3.5 zookeeper客户端连接

  在配置完上述步骤后,zookeeper进程所有节点启动正常,但是使用zkCli.sh连接客户端却无法连接,这是什么原因呢?

 

通过查看KDC服务器的日志发现了问题的根源,zkCli.sh连接客户端时默认server为localhost ,本来这里应该是hadoop01才对。

所以解决的办法就是指定sever进行连接:zkCli.sh -server   主机名:2181 。 

四、HDFS配置Kerberos认证

  4.1 配置$HADOOP_HOME/etc/hadoop/core-site.xml文件,在原来文件基础上添加如下内容:

<!-- 配置kerberos认证 -->
<property>
	<name>hadoop.security.authentication</name>
	<value>kerberos</value>
</property>

<property>
	<name>hadoop.security.authorization</name>
	<value>true</value>
</property>
<pr
  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值