Kerberos实战

1、概要
在Ambari页面启用Kerberos向导成功后,在Kerberos数据库中,就存放着许多Principal,在/etc/security/keytabs目录下也存放着不少keytab。这些principal与keytab是一一对应的,能够理解为锁与钥匙的关系。
若是使用各服务的话,就须要进行Kerberos认证了。python

准确的说,是开启了kerberos认证的组件都必须先kinit后才可使用,具体权限取决于组件自己的受权机制(ACL/Sentry等)shell

2、访问Kerberos数据库查看principal数据库

  1. 在kerberos KDC所在机器而且当前用户是root上操做
    访问Kerberos数据库:

kadmin.localvim

查看Kerberos principal:缓存

第一种方式,在kadmin.local模式,直接输入

listprincsless

第二种模式,是不进入kadmin.local模式,使用-q参数,直接获取principal

kadmin.local -q listprincside

  1. 当前用户是非root用户或在其它机器上操做
    咱们选择一台Kerberos从节点上访问Kerberos数据库,先使用kinit进行身份认证:

kinit admin/adminoop

须要输入密码,密码是你以前建立admin/admin@EXAMPLE.COM这个principal时侯的密码

而后再使用kadmin命令来访问数据库,这里也须要输入你认证admin/admin时候的密码:spa

查看principal就和以前的命令同样了,这里就不贴图和赘述了。命令行

  1. 总结
    在Kerberos KDC所在机器而且当前用户是root操做时,直接可使用kadmin.local进行访问数据库,无需输入密码。

在当前用户是非root用户或在其它机器上操做时,须要先使用kinit命令认证,而后再使用kadmin命令来访问数据库,这里总共须要输入两次密码。

进入Kerberos数据库以后,咱们能够对数据库中的principal进行一些操做,这里先不详细说明,后面会出这块的文章。

3、keytab说明
在Ambari页面启用Kerberos向导成功后,会在/etc/security/keytabs目录下生成不少keytab密钥:

这些keytab密钥与Kerberos数据库中的principal有着一一对应的关系,就像钥匙和锁同样,咱们可使用klist命令来查看keytab内容,好比查看hdfs.headless.keytab内容:

klist -kte /etc/security/keytabs/hdfs.headless.keytab

由上图可见,hdfs.headless.keytab就是hdfs-mycluster@EXAMPLE.COM的密钥,也由此能够得出结论,keytab与principal是一一对应的。
4、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

设置密码

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的密码。

1.1.4 Kerberos认证用户
方式一:使用以前设定的密码来认证principal

kinit lyz

输入lyz@EXAMPLE.COM的密码

方式二:使用keytab来认证principal

kinit -kt /etc/security/keytabs/lyz.keytab lyz
查看认证缓存

klist

这样的话,在该主机上的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 /lyz
sudo -u hdfs hadoop fs -chown lyz:lyz /lyz
关闭HDFS文件权限设置

Web UI --> HDFS配置 --> 搜索dfs.permissions.enabled,将其值改成false,保存配置,并重启HDFS组件才可生效。以下图所示(但不建议在生产环境中这样作)

上面咱们列举了两种解决Permission denied的方案,咱们这里使用第一种。

建立目录:

hadoop fs -mkdir /lyz/test
上传文件:

hadoop fs -put /root/a.log /lyz/test
浏览文件:

[root@xxx ~]# hadoop fs -ls /lyz/test
Found 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 Hadoop
hello big data
hello 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-00000
big 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/lyz
sudo -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://<hostname>:10000/default;principal=hive/<hostname>@EXAMPLE.COM'
select count(*) from employee;

1.5 使用HBase
在1.1里面,咱们讲解了如何对自定义用户进行认证,假设咱们如今已经有了lyz@EXAMPLE.COM的身份,如今咱们来访问操做HBase。

hbase shell
hbase(main):001:0> create 'hbase_110', {NAME=>'cf1'}, {NAME=>'cf2'}
出现错误:

缘由分析:

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 shell

hbase shell

赋予lyz用户全部权限

grant "lyz", "RWXCA"
PS:有时间会写一篇关于HBase服务自身的权限控制的文章。

退出hbase用户:exit

这时候,咱们就可使用lyz用户对HBase进行操做了。

hbase shell
hbase(main):001:0> create 'hbase_110', {NAME=>'cf1'}, {NAME=>'cf2'}
hbase(main):002:0> put'hbase_110', '001','cf1:name','Tom'
hbase(main):003:0> scan "hbase_110"

1.6 使用Spark & Spark2
实验目的

加载hdfs上的一个文件,并实现简单的行数统计及读取第一行。

注意:当在平台中,Spark与Spark2并存时,假如你须要使用Spark2,请更改环境变量,具体操做以下所示:

vim /etc/profile

将Spark2的目录信息添加到环境变量中

export SPARK_HOME=/usr/hdp/2.6.4.0-91/spark2
export PATH=${SPARK_HOME}/bin:${PATH}
source /etc/profile # 从新加载一下全局环境变量,这时候就能够进入Spark2的python模式了
也能够临时export,export SPARK_HOME=/usr/hdp/2.6.4.0-91/spark2

输入pyspark进入spark的python模式:

lines = sc.textFile("/lyz/mptest.txt") #读取hdfs上的文件
lines.count()
3 #返回行数
lines.first()
u'hello hadoop' #输出第一行信息
exit() #退出python模式
1.7 总结
至此,咱们使用了lyz@EXAMPLE.COM这个principal使用了HDFS、Mapreduce、Hive、HBase、Spark等服务,Kerberos至关因而一个单点登录系统,通过Kerberos认证以后,使用服务的用户就变成了principal的主名称部分,即lyz。可是具体权限,还须要由具体服务自己的受权机制(ACL/Sentry等)决定。

  1. 认证各服务自身用户访问集群服务
    在/etc/security/keytabs/目录,存放着咱们的keytab密钥,该密钥和Kerberos数据库的Principal是一一匹配的,咱们能够查看keytab的内容,来寻找对应的Principal,而后使用kinit -kt认证。

2.1 使用hdfs用户来访问操做HDFS服务

查看hdfs.headless.keytab对应的principal

klist -ket /etc/security/keytabs/hdfs.headless.keytab

kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs-xxxtest@EXAMPLE.COM

这样的话,就能够以hdfs用户的身份使用HDFS了。

2.2 使用hive用户来访问HIVE服务

查看hive.service.keytab对应的principal

klist -ket /etc/security/keytabs/hive.service.keytab

kinit -kt /etc/security/keytabs/hive.service.keytab hive/liuyzh3.xdata@EXAMPLE.COM

这样的话,就能够以hive用户的身份使用HIVE了。

2.3 使用hbase用户来访问HBASE服务

查看hbase.service.keytab对应的principal

klist -ket /etc/security/keytabs/hbase.service.keytab

kinit -kt /etc/security/keytabs/hbase.service.keytab hbase/liuyzh3.xdata

这样的话,就能够以hbase用户的身份使用HBASE了。

2.4 使用spark用户访问SPARK服务
klist -ket /etc/security/keytabs/spark.headless.keytab

kinit -kt /etc/security/keytabs/spark.headless.keytab spark-xxxtest@EXAMPLE.COM

这样的话,就能够以spark用户的身份使用SPARK了。

5、总结本篇文章主要讲解了principal与keytab之间的关系,并详细讲解了Kerberos如何认证用户,并使用HDFS、Mapreduce、HBase、Hive、Spark服务。

相关文章
相关标签/搜索