您的位置:首页 > Web前端 > HTML5

CDH5启用Kerberos和添加Sentry服务

2016-07-08 20:03 429 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tzl610/article/details/51863620 说明:该文档假设你已安装了完整功能的CDH5【参看文档CDH5部署】

一、CDH5添加Kerberos 【参考文档】http://www.cloudera.com/documentation/enterprise/latest/topics/security.html   1、环境说明: host文件:
[root@master yum.repos.d]# cat /etc/hosts
10.16.30.97 master
10.16.30.98 slave1
10.16.30.99 slave2
10.16.30.100 slave3
10.16.30.101 slave4
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[/code] 更改为:删除localhost的解析
10.16.30.97 master
10.16.30.98 slave1
10.16.30.99 slave2
10.16.30.100 slave3
10.16.30.101 slave4
[/code]

2、AES-256加密  选择下面的任何一种方式安装【推荐第二种】 注:这里我没有使用AES-256加密 (1)、查看linux版本命令:
uname -a
cat /proc/version
cat /etc/issue
lsb_release -a  适合所有linux
[/code] 对于使用centos5.6及以上的系统,默认使用AES-256来加密的。这就需要集群中的所有节点和hadoop user machine上安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File 打开上面的链接,在页面的下方,下载jdk对应的文件,jdk1.6.0_22下载下面的文件: 注:如果后面出现login failed的错误,应先检查是否是从官方网站下载的JCE。 下载的文件是一个zip包,解开后,将里面的两个文件放到下面的目录中: /usr/java/jdk1.6.0_22/jre/lib/security
(2)、使用CM安装  可以在cm中点击【主机】--【重新运行升级向导】
一直点击【继续】

选中点击【继续】
配置密码---【继续】
一直【继续】知道【完成】 安装JCE成功
注:也可以不使用AES-256加密。如果没有使用AES-256加密的KDC配置见如下的英文文档,也可以参看 [3、KDC部署] you can configureKerberos to notuse AES-256by removing aes256-cts:normalfrom the supported_enctypes field of the kdc.confor krb5.conf file.Note that after changing the kdc.conf file, you will need to restart both the KDC and the kadmin server for those changes to take affect. You may also need to recreate or change the password of the relevant principals, including potentially the Ticket Granting Ticket principal (krbtgt/REALM@REALM). If AES-256 is still used after all of those steps, it is because the aes256-cts:normal setting existed when the Kerberos database was created.To fix this, create a newKerberos database andthen restart both the KDCand the kadmin server.
3、KDC部署 (1)选择host安装KDC-SERVER(选择任意一台)
yum install krb5-server.x86_64  krb5-devel.x86_64
[/code] (2)其他hosts安装kdc-client
yum install krb5-devel.x86_64
[/code] (3)配置文件 kdc服务器涉及到三个配置文件: /etc/krb5.conf、 /var/kerberos/krb5kdc/kdc.conf、 /var/kerberos/krb5kdc/kadm5.acl
hadoop集群中其他服务器涉及到的kerberos配置文件:/etc/krb5.conf。 将kdc中的/etc/krb5.conf拷贝到集群中其他服务器即可。 集群如果开启selinux了,拷贝后可能需要执行restorecon -R -v /etc/krb5.conf 注:我使用的是ansible
/etc/krb5.conf
[logging]
default = FILE:/var/log/kerberos/krb5libs.log
kdc = FILE:/var/log/kerberos/krb5kdc.log
admin_server = FILE:/var/log/kerberos/kadmind.log
[libdefaults]
default_realm = MSXF.HADOOP
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 86400
renew_lifetime = 604800
max_life = 12h 0m 0s
forwardable = true
renewable = true
udp_preference_limit = 1
[realms]
MSXF.HADOOP = {
kdc = master:88
admin_server = master:749
}
 
[domain_realm]
 
[kdc]
profile=/var/kerberos/krb5kdc/kdc.conf
[/code]

/var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
MSXF.HADOOP = {
master_key_type = aes128-cts
max_life = 1d
max_renewable_life = 7d
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
 
#[realms]
# EXAMPLE.COM = {
#  #master_key_type = aes256-cts
#  acl_file = /var/kerberos/krb5kdc/kadm5.acl
#  dict_file = /usr/share/dict/words
#  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
#  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
# }
[/code]

/var/kerberos/krb5kdc/kadm5.acl
*/admin@MSXF.HADOOP *
(4)创建数据库 /var/kerberos/krb5kdc
[root@master krb5kdc]# kdb5_util create -r MSXF.HADOOP -s
该命令会在/var/kerberos/krb5kdc/目录下创建principal数据库。

like:
(5)关于kerberos的管理
可以使用kadmin.local或kadmin,至于使用哪个,取决于账户和访问权限: kadmin.local(on the KDC machine)or kadmin (from any machine) 如果有访问kdc服务器的root权限,但是没有kerberos admin账户【KDC本机】,使用kadmin.local 如果没有访问kdc服务器的root权限,但是用kerberos admin账户【其他hosts】,使用kadmin (6)测试 ①创建远程管理的管理员
#kadmin.local:  addprinc root/admin
[/code]
②创建测试用户
#kadmin.local:  addprinc test
[/code]
③添加kerberos自启动及重启服务
chkconfig --level 35 krb5kdc on
chkconfig --level 35 kadmin on
service krb5kdc restart
service kadmin restart
[/code] ④测试 使用之前创建的test用户
# kinit tes
Password for test@for_hadoop:
#
[/code] 输入密码后,没有报错即可。

可以看到,已经以test@for_hadoop登陆成功。

4、在使用CM启用Kerberos前的准备 在所有hosts上安装如下Kerberos Client package
yum install openldap-clients
[/code]
yum install krb5-workstation
[/code]
yum  install krb5-libs
[/code] 注:可以用如下命令查看是否安装成功 可以使用rpm查看有机器都装了这些服务
rpm -qa | grep 服务名
[/code] like:

到此,KDC安装完成 5、登录CM启用Kerberos ①为Cloudera-Manager创建超级账户,CM可以用该账户创建其他账户
#kadmin.local:  addprinc cloudera-scm/admin@MSXF.HADOOP
[/code] like:

②点击启用Kerberos

或者

====>
检查并选中 设置可用的属性:
like: kerberos加密类型:aes128-cts des3-hmac-sha1 arcfour-hmac des-hmac-sha1 des-cbc-md5 des-cbc-crc
【继续】=========>
选择【通过CM管理krb5.conf】并完成成相应配置,配置结束后,会将这些配置写到各个host的krb5.conf 【继续】=====>
填写①创建的CM的账户 【继续】=====>
【继续】====>
【继续】====> 使用默认端口,并选中【需要重启集群以使更改生效】
【继续】=====>
等待重启 ====> 【完成】
6、测试CDH的Kerberos是否正常工作 ①创建hadoop超级用户hdfs
#kadmin.local:  addprinc hdfs
[/code] ②执行 hadoop fs -ls / 未登录执行结果
登录后执行结果:


二、CDH5添加Sentry
1、登录CM
【添加服务】=====>选择Sentry
【继续】====>选择安装Host
【继续】=====> 创建Sentry数据库并在CM配置数据库====>继续 ===>安装完成 2、CDH5开启各个组件的Sentry 以Hive为例开启Hive的Sentry服务 在CM Console上点击Hive tab 进入Hive Console
【配置tab】===>
配置相关服务====>【保存更改】====>【重启服务】===>Hive配置Sentry完成
3、Hive测试 ①准备测试数据
[root@master tmp]# cat /tmp/events.csv
10.1.2.3,US,android,createNote
10.200.88.99,FR,windows,updateNote
10.1.2.3,US,android,updateNote
10.200.88.77,FR,ios,createNote
10.1.4.5,US,windows,updateTag
[/code] ②在hive中运行如下代码
create database sensitive;
 
create table sensitive.events (
ip STRING, country STRING, client STRING, action STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
 
load data local inpath '/tmp/events.csv' overwrite into table sensitive.events;
create database filtered;
create view filtered.events as select country, client, action from sensitive.events;
create view filtered.events_usonly as select * from filtered.events where country = 'US';
[/code] 问题1:没有权限创建数据库
解决办法,以hive/_HOST@YOUR_REALM登录Kerberos  (1) 为什么是hive
<property>
<name>hive.server2.authentication.kerberos.principal</name>
<value>hive/_HOST@YOUR-REALM.COM</value>
</property>
[/code] 属性决定 (2)The _HOST@YOUR-REALM.COM value in the example above is the Kerberos principal for the host where HiveServer2 is running.  The string _HOST in the properties is replaced at run time by the fully qualified domain name (FQDN) of the host machine where  the daemon is running. Reverse DNS must be working on all the hosts configured this way. Replace YOUR-REALM.COM with the name  of the Kerberos realm your Hadoop cluster is in.


a、查看当前Kerberos用户
b、登录Kerberos (以hive/_HOST@YOUR_REALM身份登录) 注:hive/ 需要hive.keytab 查找hive.keytab 进入目录:cd /var/run/cloudera-scm-agent/process/
进入HIVESERVER2最新目录:cd 84-hive-HIVESERVER2/
登录:
kinit -kt hive.keytab hive/slave2@MSXF.HADOOP
[/code]
没有错误,即登录成功 重新运行前面的sql代码
③在slave2上通过beeline连接hiveserver2 注:在执行beeline前应先登录Kerberos,登录办法参照
beeline -u "jdbc:hive2://slave2:10000/default;principal=hive/slave2@MSXF.HADOOP"
[/code] like:
④执行下面的sql语句创建role、group等
create role admin_role;
GRANT ALL ON SERVER server1 TO ROLE admin_role;
GRANT ROLE admin_role TO GROUP admin;
GRANT ROLE admin_role TO GROUP hive;
 
create role test_role;
GRANT ALL ON DATABASE filtered TO ROLE test_role;
GRANT ROLE test_role TO GROUP test;
[/code]
问题2:
解决办法:登录[登录方法参看问题1]-->beeline连接--->重新执行
上面的sql创建了两个角色
  • admin_role,具有管理员权限,可以读写所有数据库,并授权给 admin 和 hive 组(对应操作系统上的组)
  • test_role,只能读写 filtered 数据库,并授权给 test 组。

注: 如果系统上没有test用户和组,需要手动创建(可以自己测试一下,在系统里没有该用户的效果,应该是没有权限查看授权的资源)
# useradd test
[/code]
⑤测试 a、测试admin_role角色 使用hive用户访问beeline:在系统中以hive/slave2@MSXF.HADOOP登录Kerberos:
beeline -u "jdbc:hive2://slave2:10000/default;principal=h
14510
ive/slave2@MSXF.HADOOP"
[/code] 查看当前系统用户:
0: jdbc:hive2://slave2:10000/default>set system:user.name
0: jdbc:hive2://slave2:10000/default>;
+------------------------+--+
|          set           |
+------------------------+--+
| system:user.name=hive  |
+------------------------+--+
1 row selected (0.177 seconds)
0: jdbc:hive2://slave2:10000/default>
[/code] hive属于admin_role组,具有管理员权限,可以查看所有角色:
0: jdbc:hive2://slave2:10000/default>show roles;
INFO  : Compiling command(queryId=hive_20160708141919_d7a60886-7444-41db-9619-eca329a5519c): show roles
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:role, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hive_20160708141919_d7a60886-7444-41db-9619-eca329a5519c); Time taken: 0.121 seconds
INFO  : Executing command(queryId=hive_20160708141919_d7a60886-7444-41db-9619-eca329a5519c): show roles
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hive_20160708141919_d7a60886-7444-41db-9619-eca329a5519c); Time taken: 0.078 seconds
INFO  : OK
+-------------+--+
|    role     |
+-------------+--+
| test_role   |
| admin_role  |
+-------------+--+
2 rows selected (0.226 seconds)
0: jdbc:hive2://slave2:10000/default>
[/code] 查看所有权限:
0: jdbc:hive2://slave2:10000/default>SHOW GRANT ROLE test_role;[code]
[/code]
0: jdbc:hive2://slave2:10000/default>SHOW GRANT ROLE admin_role;
[/code] like:
hive用户可以查看所有数据库、访问所有表:
0: jdbc:hive2://slave2:10000/default>show databases;
[/code] like:
0: jdbc:hive2://cdh1:10000/> show databases;
[/code]
0: jdbc:hive2://cdh1:10000/> use filtered;

0: jdbc:hive2://cdh1:10000/> select * from filtered.events;
等等操作都可以试试
b、测试test_role角色: 使用test用户访问beeline:在系统以test@MSXF.HADOOP登录Kerberos
然后:
beeline -u "jdbc:hive2://slave2:10000/default;principal=hive/slave2@MSXF.HADOOP"
[/code]

查看当前系统用户是谁:

0: jdbc:hive2://cdh1:10000/> set system:user.name;+------------------------+--+
|          set           |+------------------------+--+
| system:user.name=hive  |+------------------------+--+
1 row selected (0.188 seconds)

test用户不是管理员,是不能查看所有角色的:

0: jdbc:hive2://cdh1:10000/> show roles;ERROR : Error processing Sentry command: Access denied to test. Server Stacktrace: org.apache.sentry.provider.db.SentryAccessDeniedException: Access denied to test

test用户可以列出所有数据库:

0: jdbc:hive2://cdh1:10000/> show databases;+----------------+--+
| database_name  |+----------------+--+
| default        || filtered       || sensitive      |+----------------+--+
3 rows selected (0.079 seconds)

test用户可以filtered库:

0: jdbc:hive2://cdh1:10000/> use filtered;

0: jdbc:hive2://cdh1:10000/> select * from events;

like:


但是,test用户没有权限访问sensitive库

问题3:不管以hive,还是以test身份登录,查看系统用户 set system:user.name

这是因为我们在用beeline连接:
beeline -u "jdbc:hive2://slave2:10000/default;principal=hive/slave2@MSXF.HADOOP"
[/code] principal都是以hive/slave2@MSXF.HADOOP跟HIVESERVER2服务器交互的
c、登录HUE查看 登录hue
(1) 创建用户hive、test (2) 以hive用户登录:
(3) 以test用户登录:
问题3:Query Editors  Impala无法查看数据库的问题
解决办法: 方法1:以impala/salve2@MSXF.HADOOP登录
#cd /var/run/cloudera-scm-agent/process/90-impala-IMPALAD
[/code]
#ll | grep impala
[/code] 找到最新的impalad服务: like:
#cd 90-impala-IMPALAD/
[/code] 查询impala.keytab并登录
# kinit -kt impala.keytab impala/slave2
[/code] 进入impala-shell
# impala-shell
[/code] like:
执行invalidate metadata;
> invalidate metadata;
[/code] like:
执行成功:show databases一把: like:
方法2: 以admin管理员登录Hue web 创建impala用户,然后用impala登录 like:
Query Editors Tab ----> Impala Tab---->执行invalidate metadata; like:
成功解决问题

练习搞一把,操作系统没有的用户:aaa (1) 以hive/_HOST@YOUR_REALM认证: (2) beeline访问hive (3) 授权 (4) 在系统中创建用户aaa (5) kerberos中创建用户aaa (6) 以aaa@_HOST@YOUR_REALM认证 (7) beeline连接hive (8) 执行相关操作(查看数据库,查看系统用户,使用某库查看表==) (9) Hue创建aaa并登录 (10) 验证
考虑一下:怎样将一个新建的用户加入某个组? 拥有该组的权限? example: 添加用户bbb,拥有和test用户相同的权限 答案: (1) KDC中添加用户bbb
kadmin.local:  addprinc bbb
[/code] (2) 在所有hosts系统中创建bbb,且指定bbb和test同组即可
# useradd -g test -u 1000 bbb
[/code] like:
在hue中添加bbb用户,登录查看跟test组的用户是否看到相同的资源



阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: