环境说明
- Ambari 2.6.1.0
- HDP 2.6.4
- Kerberos 1.14.1
前言
前面的文章介绍了《Kerberos原理——经典对话》、《Kerberos基本概念及原理汇总》、《基于ambari的Kerberos安装配置》、《Windows本地安装配置Kerberos客户端》,已经成功安装了Kerberos KDC server,也在Ambari上启用了Kerberos,接下来我们再来研究一下如何使用Kerberos。
一、概要
在Ambari页面启用Kerberos向导成功后,在Kerberos数据库中,就存放着许多Principal,在/etc/security/keytabs目录下也存放着很多keytab。这些principal与keytab是一一对应的,可以理解为锁与钥匙的关系。
关于Kerberos的一些基础概念,可以戳《Kerberos基本概念及原理汇总》了解。
如果使用各服务的话,就需要进行Kerberos认证了。
准确的说,是开启了kerberos认证的组件都必须先kinit后才可以使用,具体权限取决于组件本身的授权机制(ACL/Sentry等)
二、访问Kerberos数据库查看principal
1. 在kerberos KDC所在机器并且当前用户是root上操作
访问Kerberos数据库:
kadmin.local
![251c240371173d4f2e3ac2f7e4b6ff75.png](https://i-blog.csdnimg.cn/blog_migrate/597ac793097f113b173122a6ac878af9.jpeg)
查看Kerberos principal:
# 第一种方式,在kadmin.local模式,直接输入listprincs# 第二种模式,是不进入kadmin.local模式,使用-q参数,直接获取principalkadmin.local -q listprincs
![f637bed6837195f97e63b4efa9832bf5.png](https://i-blog.csdnimg.cn/blog_migrate/f5de0402acce5d2e4f525521d6f6958b.jpeg)
2. 当前用户是非root用户或在其它机器上操作
我们选择一台Kerberos从节点上访问Kerberos数据库,先使用kinit进行身份认证:
kinit admin/admin# 需要输入密码,密码是你之前创建admin/admin@EXAMPLE.COM这个principal时侯的密码
![7525bf2c20e12a9a64bf2efb280adf0f.png](https://i-blog.csdnimg.cn/blog_migrate/be618ee074fb927cfd7ffc3effc7c1f4.jpeg)
然后再使用kadmin命令来访问数据库,这里也需要输入你认证admin/admin时候的密码:
![8ca1cd7ea2119542819c5649872b2743.png](https://i-blog.csdnimg.cn/blog_migrate/d4cb8427a36fb2fc74910aa1b13d4120.jpeg)
查看principal就和之前的命令一样了,这里就不贴图和赘述了。
3. 总结
在Kerberos KDC所在机器并且当前用户是root操作时,直接可以使用kadmin.local进行访问数据库,无需输入密码。
在当前用户是非root用户或在其它机器上操作时,需要先使用kinit命令认证,然后再使用kadmin命令来访问数据库,这里总共需要输入两次密码。
进入Kerberos数据库之后,我们可以对数据库中的principal进行一些操作,这里先不详细说明,后面会出这块的文章。
三、keytab说明
在Ambari页面启用Kerberos向导成功后,会在/etc/security/keytabs目录下生成很多keytab密钥:
![910c76d3df0800e27a485a4853a64907.png](https://i-blog.csdnimg.cn/blog_migrate/ff7103a506468c801d3e92072460c204.jpeg)
这些keytab密钥与Kerberos数据库中的principal有着一一对应的关系,就像钥匙和锁一样,我们可以使用klist命令来查看keytab内容,比如查看hdfs.headless.keytab内容:
klist -kte /etc/security/keytabs/hdfs.headless.keytab
![fd5a22cd381ef946a2df5468307e21db.png](https://i-blog.csdnimg.cn/blog_migrate/dcbb0b1f19da4a6f27a35bcf03ef7059.jpeg)
由上图可见,hdfs.headless.keytab就是hdfs-mycluster@EXAMPLE.COM的密钥,也由此可以得出结论,keytab与principal是一一对应的。
四、YARN配置修改
众所周知,一些大数据服务的执行,需要yarn资源的调度,所以在使用平台服务之前,需要先检查一下yarn的配置,确保执行任务的时候不会因为资源分配问题导致任务被卡住。
假设有集群由三台机器组成,且三台机器的内存为8G,这里需要调整两处地方:
- Yarn容器分配的内存大小
- 资源调度容量的最大百分比,默认为0.2。
Web UI —> Yarn配置 —> 基本配置 —> Memory allocated for all YARN containers on a node,内存建议调大一些。
![a517ffb05a931e08997dcd8f205e1d40.png](https://i-blog.csdnimg.cn/blog_migrate/b6e8ec262651c3b71655e227e3415ddb.jpeg)
Web UI —> Yarn配置 —> 高级配置 —> Scheduler —> 修改yarn.scheduler.capacity.maximum-am-resource-percent值,百分比建议调高一点,比如0.8(最大值是1)。
![0c0fc38e508ee5f1472793f8031ac366.png](https://i-blog.csdnimg.cn/blog_migrate/e28b7807c53dd7c8a338fa0b54dc0733.jpeg)
如果分配给YARN资源过少,会导致执行集群任务被卡住的问题。
保存修改后的配置,并重启YARN服务。
五、kinit认证
这里采用的是在shell终端上使用命令行进行用户认证的方案。集群内所有的节点均可使用以下命令。
Kinit认证有两种方式,
- 直接认证Kerberos主体,但需要手动输入密码
- 通过密钥(keytab)认证Kerberos主体(Principal),不需要手动输入密码,但前提是密钥要与Kerberos主体相匹配。
在理论上来说,使用kinit的任何一种认证方式,只需要认证成功一种就可以任意访问Hadoop所有服务了。
1. 认证自定义用户访问集群服务
1.1 Kerberos认证自定义用户
1.1.1 创建Linux用户
在Linux主机上创建用户,比如lyz,建议在集群的每个节点上都创建lyz用户,否则跑集群任务的时候,有可能会报lyz用户名不存在的错误。
useradd lyz
1.1.2 创建lyz的Kerberos主体
# 进入kadmin.local模式kadmin.local# 创建principal(lyz@EXAMPLE.COM)addprinc lyz# 设置密码
![1e4847a14f8a7f19a2e12edadcbe8375.png](https://i-blog.csdnimg.cn/blog_migrate/e0f3e9397f298c24da17977acd373b1a.jpeg)
1.1.3 创建keytab文件
使用ktadd命令为lyz@EXAMPLE.COM创建keytab文件
ktadd -norandkey -k /etc/security/keytabs/lyz.keytab lyz@EXAMPLE.COM# 参数说明# -norandkey表示创建keytab时,principal的密码不发生改变。如果不使用该参数,直接ktadd -k则会修改principal的密码。
![0419a4759dee7abbf8fbc458bf4bb018.png](https://i-blog.csdnimg.cn/blog_migrate/7c4a595b8f6467eb86ad5c12ea19e070.jpeg)
1.1.4 Kerberos认证用户
方式一:使用之前设定的密码来认证principal
kinit lyz# 输入lyz@EXAMPLE.COM的密码
![c522dbbf4ec271f606ed590a5c94571f.png](https://i-blog.csdnimg.cn/blog_migrate/83cf03128d66e18ee67a011e095fc915.jpeg)
方式二:使用keytab来认证principal
kinit -kt /etc/security/keytabs/lyz.keytab lyz
查看认证缓存
klist
![e094afe51d3ea63e65adec8dd3de4d14.png](https://i-blog.csdnimg.cn/blog_migrate/6500e01b311c5c0b71651d898c786df9.jpeg)
这样的话,在该主机上的root用户下执行操作,就是使用的lyz用户做代理。从理论上来讲,Kerberos认证通过以后,lyz用户可以访问操作集群内的任何服务,但是有的服务拥有ACL权限,比如HBase就有严格的ACL权限控制,具体如何操作下文具体会讲。
以下对各服务的操作,默认都以认证了lyz@EXAMPLE.COM为前提。
1.2 使用HDFS
HDFS服务组件本身有着严格的文件权限控制,如果操作不当,很容易出现Permission denied的错误。有两种解决方案(建议第一种),如下所示:
使用hdfs用户创建文件,并修改该文件的所属用户,这样可解决权限问题。(建议使用这种方式)
现在我们使用Kerberos认证的lyz用户来操作HDFS shell。
首先使用hdfs超级用户创建一个文件夹,并改变其文件夹的所有者。
sudo -u hdfs hadoop fs -mkdir /lyzsudo -u hdfs hadoop fs -chown lyz:lyz /lyz
关闭HDFS文件权限设置
Web UI —> HDFS配置 —> 搜索dfs.permissions.enabled,将其值改为false,保存配置,并重启HDFS组件才可生效。如下图所示(但不建议在生产环境中这样做)
![3ff6540cfeba9c90f26faeabb9b6018f.png](https://i-blog.csdnimg.cn/blog_migrate/69982786b1470b46add3bc68d78df5e6.jpeg)
上面我们列举了两种解决Permission denied的方案,我们这里使用第一种。
创建目录:
hadoop fs -mkdir /lyz/test
上传文件:
hadoop fs -put /root/a.log /lyz/test
浏览文件:
[root@xxx ~]# hadoop fs -ls /lyz/testFound 1 items-rw-r--r-- 3 lyz lyz 138370 2019-01-09 20:56 /lyz/test/a.log[root@xxx ~]#
上传的文件a.log的所有者为lyz,这也从侧面验证了Kerberos认证通过之后,是由Kerberos用户代理的Linux上的用户操作。
删除test文件夹:
hadoop fs -rm -r /lyz/test
1.3 使用Mapreduce
再次说明:执行mapreduce任务的前提是集群内的每个节点上都必须要有lyz这个本地用户,否则任务会执行失败。
编辑mptest.txt文件,内容为:
hello Hadoophello big datahello world!
上传文件至hdfs并执行mapreduce的计数任务:
hadoop fs -put mptest.txt /lyz hadoop jar /usr/hdp/2.6.4.0-91/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount /lyz/mptest.txt /lyz/output1218
注意:输入路径必须在/lyz目录下,因为lyz用户只拥有操作自己所属文件目录的权限。
任务执行成功:
[root@xxx ~]# hadoop fs -cat /lyz/output1218/part-r-00000big 1 data 1 hadoop 1 hello 3 world! 1
1.4 使用hive
由于连接hive时,需要使用的是lyz用户,所以需要确保在HDFS路径上的/user/目录下有lyz文件夹及确保lyz目录及子目录的所有者是lyz,如果目录不存在,则使用以下代码添加:
sudo -u hdfs hadoop fs -mkdir /user/lyzsudo -u hdfs hadoop fs -chown lyz:lyz /user/lyz
Hive有两种连接方式:分别是cli模式和beeline模式。cli模式是通过metaStroe来访问元数据;beeline模式是通过hiveServer2访问元数据。建议使用beeline模式连接hive执行操作。
再次说明:执行hive操作的前提是集群内的每个节点上都必须要有lyz这个本地用户,因为hive有些复杂操作会调用TEZ和Mapreduce来执行任务。
Hive cli操作 — 创建表:
hive> create table if not exists mytable(sid int ,sname string)> row format delimited fields terminated by ' ' stored as textfile;
Beeline操作 — 查询表:
(确定hiveserver所在主机,并获取所在主机的hive的principal)
beeline -u 'jdbc:hive2://:10000/default;principal=hive/@EXAMPLE.COM'select count(*) from employee;
![b8c69092a60b32022c163fc4c2430080.png](https://i-blog.csdnimg.cn/blog_migrate/eccffd558ef8d1f6871793332f7611f9.jpeg)
1.5 使用HBase
在1.1里面,我们讲解了如何对自定义用户进行认证,假设我们现在已经有了lyz@EXAMPLE.COM的身份,现在我们来访问操作HBase。
hbase shellhbase(main):001:0> create 'hbase_110', {NAME=>'cf1'}, {NAME=>'cf2'}
出现错误:
![39e1b58de4270285767b0f203fe6e70c.png](https://i-blog.csdnimg.cn/blog_migrate/3ed0596629d4c4aceef28dac1fcfe9c1.jpeg)
原因分析:
HBase服务启用Kerberos之后,Ambari也会开启HBase自身的权限控制。这时候lyz用户虽然已被认证,但是由于HBase自身还有权限控制,所以还不能执行hbase shell操作,需要使用grant命令对lyz用户进行授权。
解决方案:
切换用户至hbase用户,在其hbase环境下使用hbase.service.keytab进行kerberos认证,
# 切换用户su hbase# kerberos认证kinit -kt hbase.service.keytab hbase/liuyzh1.xdata@EXAMPLE.COM
这样的话,我们是以HBase超级管理员来访问操作hbase,现在给lyz服赋予相应的权限:
# 进入hbase shellhbase shell# 赋予lyz用户所有权限grant "lyz