hbase kerberos 源码 hbase kerberos认证

hadoop、hbase、zookeeper集成kerberos认证

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

一、环境说明

环境说明

二、生成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服务器的节点是ha01,所以我在ha01节点上使用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服务器节点ha01上执行上面的四条命令几次,因为要生成集群中每个主机对应的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证书的权限为
chmod  /etc/security/keytab/hadoop.keytab

三、Zookeeper配置kerberos认证

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

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

kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true
 
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=

在$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";
};

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

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

重启zookeeper服务即可

zookeeper客户端连接

./zkCli.sh -server 主机名:

四、HDFS配置Kerberos认证

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



	hadoop.security.authentication
	kerberos

 

	hadoop.security.authorization
	true


	hadoop.rpc.protection
	authentication


	hadoop.http.authentication.type
	kerberos

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


	
		dfs.block.access.token.enable
		true
	
	
		dfs.namenode.keytab.file
		/etc/security/keytab/hadoop.keytab
	
	
		dfs.namenode.kerberos.principal
		hadoop/_HOST@HADOOP.COM
	
	
		dfs.web.authentication.kerberos.principal
		HTTP/_HOST@HADOOP.COM
	
	
		dfs.web.authentication.kerberos.keytab
		/etc/security/keytab/hadoop.keytab
	
	
	
	
		dfs.webhdfs.enabled
		true
	
	
		dfs.http.policy
		HTTPS_ONLY
	
	
		dfs.namenode.https-address
		:
	
	
		dfs.permissions.supergroup
		hadoop
		The name of the group of super-users.
	
	
	
	
		dfs.datanode.keytab.file
		/etc/security/keytab/hadoop.keytab
	
	
	
		dfs.datanode.kerberos.principal
		hadoop/_HOST@HADOOP.COM
	
	
	
	  
		dfs.datanode.data.dir.perm  
		  
	
	
	
		dfs.datanode.address
		:
	
	
	
		dfs.datanode.http.address
		:
	
	
	
		dfs.data.transfer.protection
		integrity
	
	
	
	
		dfs.journalnode.keytab.file
		/etc/security/keytab/hadoop.keytab
	
 
	
		dfs.journalnode.kerberos.principal
		hadoop/_HOST@HADOOP.COM
	
 
	
		dfs.journalnode.kerberos.internal.spnego.principal
		${
 dfs.web.authentication.kerberos.principal}
	
	
	
        dfs.journalnode.http-address
        :
    

.Hadoop集群安装HTTPS服务

安装说明:生成CA证书hdfs_ca_key和hdfs_ca_cert只需要在任意一台节点上完成即可,其他每个节点包括生成证书的节点都需要执行第四步以后的操作,且必须使用root用户执行以下操作

1).在ha01节点生成CA证书,需要输入两次密码,其中CN:中国简称;ST:省份;L:城市;O和OU:公司或个人域名;ha01是生成CA证书主机名

openssl req -new -x509 -keyout hdfs_ca_key -out hdfs_ca_cert -days  -subj /C=CN/ST=shanxi/L=xian/O=hlk/OU=hlk/CN=ha01

2).将ha01节点上生成的CA证书hdfs_ca_key、hdfs_ca_cert分发到每个节点上的/tmp目录下

scp hdfs_ca_key hdfs_ca_cert $host:/tmp

3).发送完成后删除ha01节点上CA证书

rm -rf hdfs_ca_key hdfs_ca_cert

4).在每一台机器上生成keystore和trustores(注意:集群中每个节点都需要执行以下命令)

) 生成keystore,这里的keytool需要java环境,否则command not found

name="CN=$HOSTNAME, OU=hlk, O=hlk, L=xian, ST=shanxi, C=CN"
#需要输入第一步输入的密码四次
keytool -keystore keystore -alias localhost -validity  -genkey -keyalg RSA -keysize  -dname "$name"

) 添加CA到truststore,同样需要输入密码

keytool -keystore truststore -alias CARoot -import -file hdfs_ca_cert

) 从keystore中导出cert

keytool -certreq -alias localhost -keystore keystore -file cert

) 用CA对cert签名

openssl x509 -req -CA hdfs_ca_cert -CAkey hdfs_ca_key -in cert -out cert_signed -days  -CAcreateserial

) 将CA的cert和用CA签名之后的cert导入keystore

keytool -keystore keystore -alias CARoot -import -file hdfs_ca_cert
 keytool -keystore keystore -alias localhost -import -file cert_signed

) 将最终keystore,trustores放入合适的目录,并加上后缀jks

mkdir -p /etc/security/https && chmod  /etc/security/https
 cp keystore /etc/security/https/keystore.jks
 cp truststore /etc/security/https/truststore.jks

) 删除/tmp目录下产生的垃圾数据文件

rm -f keystore truststore hdfs_ca_key hdfs_ca_cert.srl hdfs_ca_cert cert_signed cert

5).配置$
HADOOP_HOME/etc/hadoop/ssl-server.xml和ssl-client.xml文件

注:这两个配置文件在一台节点配好,发送到其他节点对应位置下!

) 配置$
HADOOP_HOME/etc/hadoop/ssl-client.xml文件

################################ ssl-client.xml #########################################

    
      ssl.client.truststore.location
      /etc/security/https/truststore.jks
      Truststore to be used by clients like distcp. Must be specified.
    
    
    
      ssl.client.truststore.password
      hadoop
      Optional. Default value is "".
    
 
    
      ssl.client.truststore.type
      jks
      Optional. The keystore file format, default value is "jks".
    
 
    
      ssl.client.truststore.reload.interval
      
      Truststore reload check interval, in milliseconds.Default value is  ( seconds).
    
 
    
      ssl.client.keystore.location
      /etc/security/https/keystore.jks
      Keystore to be used by clients like distcp. Must be specified.
    
 
    
      ssl.client.keystore.password
      hadoop
      Optional. Default value is "".
    
 
    
      ssl.client.keystore.keypassword
      hadoop
      Optional. Default value is "".
    
 
    
      ssl.client.keystore.type
      jks
      Optional. The keystore file format, default value is "jks".
    

) 配置$
HADOOP_HOME/etc/hadoop/ssl-server.xml文件

################################ ssl-server.xml #########################################

 
   ssl.server.truststore.location
   /etc/security/https/truststore.jks
   Truststore to be used by NN and DN. Must be specified.
   
 
 
 
   ssl.server.truststore.password
   hadoop
   Optional. Default value is "".
   
 
 
 
   ssl.server.truststore.type
   jks
   Optional. The keystore file format, default value is "jks".
   
 
 
 
   ssl.server.truststore.reload.interval
   
   Truststore reload check interval, in milliseconds.
   Default value is  ( seconds).
   
 
 
 
   ssl.server.keystore.location
   /etc/security/https/keystore.jks
   Keystore to be used by NN and DN. Must be specified.
   
 
 
 
   ssl.server.keystore.password
   hadoop
   Must be specified.
   
 
 
 
   ssl.server.keystore.keypassword
   hadoop
   Must be specified.
 
 
 
   ssl.server.keystore.type
   jks
   Optional. The keystore file format, default value is "jks".
 

.验证

首先分发各配置文件,

我们需要先使用第一步生成的
/etc/security/keytab/hadoop.keytab 证书对hadoop用户的每个节点进行 kinit 票据初始化,票据初始化的命令如下所示:

kinit -kt /etc/security/keytab/hadoop.keytab $USER/$HOSTNAME (每个节点都执行)

然后使用 klist 命令查看当前是否生成票据,出现有效及过期时间即表示生成票据成功

再次执行hadoop fs -ls / 命令查看hdfs资源正常

五、YARN配置kerberos认证

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



	yarn.http.policy
	HTTPS_ONLY



    yarn.resourcemanager.webapp.address.rm1
    ha01:



    yarn.resourcemanager.webapp.https.address.rm1
    ha01:



    yarn.resourcemanager.webapp.address.rm2
    ha02:



    yarn.resourcemanager.webapp.https.address.rm2
    ha02:



    yarn.log-aggregation-enable
    true



    yarn.log-aggregation.retain-seconds
    
    



	Where to aggregate logs to.
	yarn.nodemanager.remote-app-log-dir
	/tmp/logs/yarn-nodemanager



	yarn.resourcemanager.keytab
	/etc/security/keytab/hadoop.keytab

    
	yarn.resourcemanager.principal
	hadoop/_HOST@HADOOP.COM


	yarn.nodemanager.keytab
	/etc/security/keytab/hadoop.keytab


	yarn.nodemanager.principal
	hadoop/_HOST@HADOOP.COM


    yarn.nodemanager.container-executor.class
    org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor



    yarn.nodemanager.linux-container-executor.group
    hadoop

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



	 mapreduce.jobhistory.keytab
	 /etc/security/keytab/hadoop.keytab


	 mapreduce.jobhistory.principal
	 hadoop/_HOST@HADOOP.COM

分发修改的配置文件至各节点

配置$HADOOP_HOME/etc/hadoop/container-executor.cfg,将以下内容覆盖掉默认的内容:

#configured value of yarn.nodemanager.linux-container-executor.group
yarn.nodemanager.linux-container-executor.group=hadoop
#comma separated list of users who can not run applications
banned.users=root
#Prevent other super-users
min.user.id=
#comma separated list of system users who CAN run applications
allowed.system.users=hadoop

ps:注意:该container-executor.cfg文件内不允许有空格或空行,否则会报错!

配置Yarn使用LinuxContainerExecutor(各节点都需要操作)

1)修改所有节点的container-executor所有者和权限,要求其所有者为root,所有组为hadoop,权限为。其默认路径为?$HADOOP_HOME/bin??

chown root:hadoop /data/hadoop-/bin/container-executor
chmod  /data/hadoop-/bin/container-executor

2)修改所有节点的container-executor.cfg文件的所有者和权限,要求该文件及其所有的上级目录的所有者均为root,所有组为hadoop,权限为。其默认路径为??$HADOOP_HOME/etc/hadoop??

chown root:hadoop /data/hadoop-/etc/hadoop/container-executor.cfg
chown root:hadoop /data/hadoop-/etc/hadoop
chown root:hadoop /data/hadoop-/etc
chown root:hadoop /data/hadoop-
chown root:hadoop /data
chmod  /data/hadoop-/etc/hadoop/container-executor.cfg

启动start-yarn.sh

六、HBASE配置Kerberos认证

配置$HBASE_HOME/conf/hbase-site.xml文件,在原文件上添加如下内容:



	hbase.security.authentication
	kerberos



    hbase.rpc.engine
    org.apache.hadoop.hbase.ipc.SecureRpcEngine


    hbase.coprocessor.region.classes
    org.apache.hadoop.hbase.security.token.TokenProvider



	hbase.master.kerberos.principal
	hadoop/_HOST@HADOOP.COM



	hbase.master.keytab.file
	/etc/security/keytab/hadoop.keytab



	hbase.regionserver.kerberos.principal
	hadoop/_HOST@HADOOP.COM



	hbase.regionserver.keytab.file
	/etc/security/keytab/hadoop.keytab

在$HBASE_HOME/conf/下新建zk-jaas.conf文件,添加如下内容:

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

ps:注意:这里 principal=“hadoop/host_name@HADOOP.COM”; 的 host_name 需要改为每个节点对应的主机名

在$HBASE_HOME/conf/hbase-env.sh文件中添加如下内容:

#修改HBASE_OPTS属性为该内容
export HBASE_OPTS="-XX:+UseConcMarkSweepGC -Djava.security.auth.login.config=$HBASE_HOME/conf/zk-jaas.conf"
#告诉HBASE使用自己安装的zk集群
export HBASE_MANAGES_ZK=false

启动start-hbase.sh 验证

原文链接:,转发请注明来源!