1.在CDH上安装、配置sentry

ranger hive 权限对应 hive sentry 授权_hdfs

sentry配置

想要给其他用户授权,这个用户要拥有sentry的管理员 + hive表的权限。如果是在hue中,还要有hue的管理员。

{1} 配置sentry的管理员组,管理员组中的用户都可以对其他用户授权(hue左侧导航栏有security选项)。在hue中通过sentry给其他用户授权时,使用的用户要有sentry的管理员角色,所以要在sentry中给hue的用户授权。这里创建了dcdcdc超级用户,这个用户可以给其他用户设置hive表权限,生产上一般都会用专门的用户,而不是用hive用户,这样更专业。

在Sentry的配置项中搜索“管理员组”,其中包括hive、impala、hue,只有当某用户所属组位于其中时,才可为其他用户授予权限。注意,这里面的是组,不是用户。下面还有个管理员的选项。

ranger hive 权限对应 hive sentry 授权_ranger hive 权限对应_02

ranger hive 权限对应 hive sentry 授权_ranger hive 权限对应_03

2. 同Hive整合

{1} hive开启sentry

ranger hive 权限对应 hive sentry 授权_大数据_04

{2} hive取消HiveServer2用户模拟

在hive配置项中搜索“HiveServer2 启用模拟”,取消勾选

模拟的意思是CDH用beeline连接hive时,用-n告诉HiveServer用户是谁,告诉HS是谁,HS就认为是谁,这个功能跟sentry有冲突。取消后,HiveServer对于所有客户端连接都认为是默认用户hive。

ranger hive 权限对应 hive sentry 授权_linux_05

{3} 搜sentry-site,添加如下记录

ranger hive 权限对应 hive sentry 授权_大数据_06

{4} hive启动数据库的存储通知

每次修改元数据(CRUD表)都会写入到日志,这个日志sentry需要

ranger hive 权限对应 hive sentry 授权_linux_07

{5} 绕过sentry的授权用户

添加dcdcdc

ranger hive 权限对应 hive sentry 授权_linux_08

{5} yarn添加hive为允许用户(默认)

取消用户模拟后,hive的所有mr任务都以hive用户运行,yarn要有hive用户对接

ranger hive 权限对应 hive sentry 授权_大数据_09

3. 同Impala整合,直接启用

ranger hive 权限对应 hive sentry 授权_hive_10

4. hdfs中

  • sentry权限和hdfs中权限同步

{1} 在HDFS配置项中搜索“启用访问控制列表”、启用 Sentry 同步,勾选。

  • 默认hdfs1个文件只有1个组,这个配置能加强hdfs的权限模型,1个文件可以有多个组

ranger hive 权限对应 hive sentry 授权_大数据_11

{2} 同步路径前缀(默认)

地址就写hive的warehouse

ranger hive 权限对应 hive sentry 授权_hive_12

5.hue

{1} 启用:在HUE配置项中搜索“Sentry”,勾选Sentry。否则hue的左侧导航栏不会有security选项

ranger hive 权限对应 hive sentry 授权_大数据_13

重启

配置超级用户

1. 先创建hdfs的princ和系统用户,用来创建超级用户dcdcdc的相关目录

addprinc hdfs
hdfs用户一般cdh给创建好了,不用创建系统用户

2. 创建超级用户dcdcdc的相关对象

addprinc dcdcdc

ranger hive 权限对应 hive sentry 授权_linux_14


在每个节点创建dcdcdc系统用户

useradd dcdcdc

ranger hive 权限对应 hive sentry 授权_大数据_15


kinit hdfs

hadoop fs -mkdir /user/dcdcdc

hadoop fs -chown dcdcdc:dcdcdc /user/dcdcdc

hadoop fs -chmod 700 /user/dcdcdc

ranger hive 权限对应 hive sentry 授权_大数据_16

3. sentry下给dcdcdc授权

beeline -u “jdbc:hive2://n1:10000/;principal=hive/node101@XYYH.COM”

注意:url的主机和principal的主机要相同,10000后面要带个 / ,要用hive的principal来认证。 地址要写hiveserver2所在地址

ranger hive 权限对应 hive sentry 授权_ranger hive 权限对应_17


create role admin_role;

grant all on SERVER server1 to role admin_role;

grant role admin_role to group dcdcdc;

grant role admin_role to group hive;

dcdcdc用户默认是dcdcdc组的。sentry把role赋给组,这个组就是指的linux里的用户组或者是ldap的组

ranger hive 权限对应 hive sentry 授权_hdfs_18


ranger hive 权限对应 hive sentry 授权_hdfs_19


此时dcdcdc既是sentry的超级管理员(能创建sentry的role、能给role授权),又是hive的超级管理员(能创建库、表)。

给别的用户授权使用这个用户即可,不用使用之前不合理的hive用户。

四、使用

须知

  • 使用了sentry之后,原来组件中的权限将不可用,全被sentry接管,比如hive组件的hive用户,原来有全部权限,使用sentry后,要给hive用户授权,否则默认无权限。
  • 大数据组件有很多,包括linux系统本身,每个组件都有自己的用户,kerberos只认名字

使用Sentry进行授权管理,需要使用Sentry的管理员用户对其他用户进行授权,授权的方式有两种。

1.通过HUE进行可视化操作

须知:

  1. 使用hue时,hue下创建的用户登录hue后自动完成kerberos认证,因为CDH会自动完成组件间的认证。如果是命令行,创建用户后要手动认证
  2. hadoop、os、hue 3个系统都有自己的用户和用户组,sentry使用hadoop的用户组,而hadoop又使用OS的用户组。但不会自动导入,sentry虽然使用hadoop的用户组,但也要在sentry中创建同名的用户组。
    hue中的role和group操作最终都映射到hive中,因此os、hue的用户和用户组要统一。
    比如:hue中创建了一个role,把这个role分配给了1个os中不存在但hue中存在的group,那hive不会自动创建这个group。对应的用户也不会有role权限。
    ==》Hue和Sentry集成后,要求用户和用户组同时在Hue和OS里都要创建。
  3. sentry是hadoop的权限系统,hadoop跟OS其实也就是linux不可分。hadoop跟linux的用户系统是一体的,
    比如os是哪个用户,访问hdfs时就是哪个用户。加了kerberos后,linux中认证哪个用户,访问hdfs就是哪个用户。显然,sentry想要控制hdfs,就要建立sentry同hdfs的权限系统的映射。即:
    sentry的role - sentry的group - hadoop(hdfs、hive)的group - linux的group - linux用户
    也就是建立了linux用户和sentry的映射,用过sentry可以控制linux用户或者kerberos主体的权限。

1.1 进入hue的sentry管理界面。使用在sentry中管理员组中的用户登录hue,否则无法操作sentry

ranger hive 权限对应 hive sentry 授权_大数据_20


ranger hive 权限对应 hive sentry 授权_hdfs_21

1.2 此时hue用户没有访问hive的权限,刚好可以演示下

须知:

3列:

选表时,第3列可以选,选hdfs时,第3列禁用

ranger hive 权限对应 hive sentry 授权_大数据_22


ranger hive 权限对应 hive sentry 授权_ranger hive 权限对应_23


创建role的时候可以顺便授予给group,group显示optional

ranger hive 权限对应 hive sentry 授权_大数据_24

{1} 只能看见默认的default库,里面的表也看不到。

ranger hive 权限对应 hive sentry 授权_hive_25

{2} 点击roles,发现无法编辑,点击右边的问号进入官方文档,发现原来想要在hue编辑权限,当前登录的用户必须既属于hue服务中的一个组,还要属于sentry中的1个管理组。并且无论sentry使用哪个组,hue中都要用跟这个组同名的组

ranger hive 权限对应 hive sentry 授权_大数据_26


ranger hive 权限对应 hive sentry 授权_大数据_27

{3} 创建hive_role,这个role包含hive的所有权限,将hive_role赋给hue的组hue。
给hue组赋予hive的权限,否则无法操作将hive的权限给别的角色

此时发现选权限时只有default库且里面没表,这是因为当前用户hue的组hue没有hive的任何权限,此时可以创建1个角色hive_role,给这个hive_role赋予hive的所有权限,然后把hive_role赋给hue组,这样hue就可以访问hive了,然后就可以用hue用户创建hive相关的角色了。权限不选就是所有权限

ranger hive 权限对应 hive sentry 授权_大数据_28


此时左边的hive栏刷新后就可以看到原来看不到的库和表了,这说明hue用户已经有了访问hive的权限。创建时可以不会有新的库和表的提示,手动输入即可。

ranger hive 权限对应 hive sentry 授权_hive_29

2.使用Hive中的授权语句进行操作,类似mysql中的grant

须知:

先在linux中创建用户,默认会有同名用户组。hive中可以直接给linux的group授role。而hue需要在hue中创建用户和组???
使用sentry管理员用户登录hive,比如hive、hue。然后创建role,给role授权,

  1. 在node105创建两个用户reader_cmd,writer_cmd
[root@node105 ~]# useradd reader_cmd
[root@node105 ~]# passwd reader_cmd
[root@node105 ~]# useradd writer_cmd
[root@node105 ~]# passwd writer_cmd
为reader_cmd、writer_cmd创建Kerberos主体
[root@node105 ~]# kadmin.local -q "addprinc reader_cmd/reader_cmd@HADOOP.COM"
[root@node105 ~]# kadmin.local -q "addprinc writer_cmd/writer_cmd@HADOOP.COM"
  1. 使用Sentry管理员用户hive通过beeline客户端连接HiveServer2
[root@node105 ~]# kinit -kt /var/lib/hive/hive.keytab hive/hive@XYYH.COM
# 这里的principal要写hive服务的,用户就是当前klist中的主体
[root@node105 ~]# beeline -u "jdbc:hive2://node105:10000/;principal=hive/node105@XYYH.COM"
  1. 创建Role(reader_role_cmd,writer_role_cmd)为role赋予privilege
create role reader_role_cmd;
create role writer_role_cmd;
GRANT select ON DATABASE gmall TO ROLE reader_role_cmd;
GRANT insert ON DATABASE gmall TO ROLE writer_role_cmd;
  1. 将role授予用户组,此处在hive中直接把hive的role授给linux的用户组还是principal的实例???,建立role和group的映射
GRANT ROLE reader_role_cmd TO GROUP reader_cmd;
GRANT ROLE writer_role_cmd TO GROUP writer_cmd;
  1. 查看权限授予情况
  • 查看所有role(管理员)
    SHOW ROLES;
  • 查看指定用户组的role(管理员)
    SHOW ROLE GRANT GROUP hive;
    一开始没给hive组授权任何role时,查询报错。授权后:
  • 查看当前认证用户的role
    SHOW CURRENT ROLES;
  • 查看指定ROLE的具体权限(管理员)
    SHOW GRANT ROLE reader_role_cmd;
  1. 权限测试
  • 使用reader_cmd登录HiveServer2,查询gmall库下的任意一张表
[root@node105 ~]# kinit reader_cmd/reader_cmd@XYYH.COM
[root@node105 ~]# beeline -u "jdbc:hive2://node105:10000/;principal=hive/node105@XYYH.COM"
  • 使用writer_cmd登录HiveServer2,查询gmall库下的任意一张表
[root@node105 ~]# kinit writer_cmd/writer_cmd@HADOOP.COM
[root@node105 ~]# beeline -u "jdbc:hive2://node105:10000/;principal=hive/node105@HADOOP.COM"
  • 查询结果
    reader_cmd有对于gmall表的查询权限,而writer_cmd没有。说明授权生效。

五、测试

须知:

  1. 默认hive中1个role都没有,SHOW ROLES;为0。但hive用户是hive服务的默认
  2. 不是sentry管理员也可以进入security界面,但点击roles时,非管理员显示

    如果是sentry的管理员,比如hive/hive

没授权和授权后

ranger hive 权限对应 hive sentry 授权_linux_30


hive/hive创建role并赋给hive组,hive组是sentry的管理组,也是linux 的组。==》sentry的组和hive的组建立了映射。

ranger hive 权限对应 hive sentry 授权_hive_31


ranger hive 权限对应 hive sentry 授权_hdfs_32

六、su

1.通过linux、hadoop(hdfs,hive)、sentry之间组名的映射来完成sentry对linux用户的权限管理。hue仅仅是可以UI,hue的用户和属组也要跟linux映射。

2.权限精确到hive的列和hdfs的文件,注意:

2.1 有了hive列的权限不代表有了表的权限,hdfs中,有了文件的权限,可以查看文件夹???。

2.2 但反过来就不一样了,有了hive库或者表的权限,就可以查所有表和所有列。有了hdfs文件夹的权限不代表有里面文件的权限。

比如有/或者/user/hive/warehouse/dctest.db/test2/的权限,并不能访问/user/hive/warehouse/dctest.db/test2/test.csv

ranger hive 权限对应 hive sentry 授权_linux_33


ranger hive 权限对应 hive sentry 授权_ranger hive 权限对应_34


只有hdfs的权限精确到文件,才能访问

但有hive的根权限,可以访问所有库和表