1.在CDH上安装、配置sentry
sentry配置
想要给其他用户授权,这个用户要拥有sentry的管理员 + hive表的权限。如果是在hue中,还要有hue的管理员。
{1} 配置sentry的管理员组,管理员组中的用户都可以对其他用户授权(hue左侧导航栏有security选项)。在hue中通过sentry给其他用户授权时,使用的用户要有sentry的管理员角色,所以要在sentry中给hue的用户授权。这里创建了dcdcdc超级用户,这个用户可以给其他用户设置hive表权限,生产上一般都会用专门的用户,而不是用hive用户,这样更专业。
在Sentry的配置项中搜索“管理员组”,其中包括hive、impala、hue,只有当某用户所属组位于其中时,才可为其他用户授予权限。注意,这里面的是组,不是用户。下面还有个管理员的选项。
2. 同Hive整合
{1} hive开启sentry
{2} hive取消HiveServer2用户模拟
在hive配置项中搜索“HiveServer2 启用模拟”,取消勾选
模拟的意思是CDH用beeline连接hive时,用-n告诉HiveServer用户是谁,告诉HS是谁,HS就认为是谁,这个功能跟sentry有冲突。取消后,HiveServer对于所有客户端连接都认为是默认用户hive。
{3} 搜sentry-site,添加如下记录
{4} hive启动数据库的存储通知
每次修改元数据(CRUD表)都会写入到日志,这个日志sentry需要
{5} 绕过sentry的授权用户
添加dcdcdc
{5} yarn添加hive为允许用户(默认)
取消用户模拟后,hive的所有mr任务都以hive用户运行,yarn要有hive用户对接
3. 同Impala整合,直接启用
4. hdfs中
- sentry权限和hdfs中权限同步
{1} 在HDFS配置项中搜索“启用访问控制列表”、启用 Sentry 同步,勾选。
- 默认hdfs1个文件只有1个组,这个配置能加强hdfs的权限模型,1个文件可以有多个组
{2} 同步路径前缀(默认)
地址就写hive的warehouse
5.hue
{1} 启用:在HUE配置项中搜索“Sentry”,勾选Sentry。否则hue的左侧导航栏不会有security选项
重启
配置超级用户
1. 先创建hdfs的princ和系统用户,用来创建超级用户dcdcdc的相关目录
addprinc hdfs
hdfs用户一般cdh给创建好了,不用创建系统用户
2. 创建超级用户dcdcdc的相关对象
addprinc dcdcdc
在每个节点创建dcdcdc系统用户
useradd dcdcdc
kinit hdfs
hadoop fs -mkdir /user/dcdcdc
hadoop fs -chown dcdcdc:dcdcdc /user/dcdcdc
hadoop fs -chmod 700 /user/dcdcdc
3. sentry下给dcdcdc授权
beeline -u “jdbc:hive2://n1:10000/;principal=hive/node101@XYYH.COM”
注意:url的主机和principal的主机要相同,10000后面要带个 / ,要用hive的principal来认证。
地址要写hiveserver2所在地址
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的组
此时dcdcdc既是sentry的超级管理员(能创建sentry的role、能给role授权),又是hive的超级管理员(能创建库、表)。
给别的用户授权使用这个用户即可,不用使用之前不合理的hive用户。
四、使用
须知
- 使用了sentry之后,原来组件中的权限将不可用,全被sentry接管,比如hive组件的hive用户,原来有全部权限,使用sentry后,要给hive用户授权,否则默认无权限。
- 大数据组件有很多,包括linux系统本身,每个组件都有自己的用户,kerberos只认名字
使用Sentry进行授权管理,需要使用Sentry的管理员用户对其他用户进行授权,授权的方式有两种。
1.通过HUE进行可视化操作
须知:
- 使用hue时,hue下创建的用户登录hue后自动完成kerberos认证,因为CDH会自动完成组件间的认证。如果是命令行,创建用户后要手动认证
- 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里都要创建。 - 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
1.2 此时hue用户没有访问hive的权限,刚好可以演示下
须知:
3列:
选表时,第3列可以选,选hdfs时,第3列禁用
创建role的时候可以顺便授予给group,group显示optional
{1} 只能看见默认的default库,里面的表也看不到。
{2} 点击roles,发现无法编辑,点击右边的问号进入官方文档,发现原来想要在hue编辑权限,当前登录的用户必须既属于hue服务中的一个组,还要属于sentry中的1个管理组。并且无论sentry使用哪个组,hue中都要用跟这个组同名的组
{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相关的角色了。权限不选就是所有权限
此时左边的hive栏刷新后就可以看到原来看不到的库和表了,这说明hue用户已经有了访问hive的权限。创建时可以不会有新的库和表的提示,手动输入即可。
2.使用Hive中的授权语句进行操作,类似mysql中的grant
须知:
先在linux中创建用户,默认会有同名用户组。hive中可以直接给linux的group授role。而hue需要在hue中创建用户和组???
使用sentry管理员用户登录hive,比如hive、hue。然后创建role,给role授权,
- 在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"
- 使用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"
- 创建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;
- 将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;
- 查看权限授予情况
- 查看所有role(管理员)
SHOW ROLES; - 查看指定用户组的role(管理员)
SHOW ROLE GRANT GROUP hive;
一开始没给hive组授权任何role时,查询报错。授权后: - 查看当前认证用户的role
SHOW CURRENT ROLES; - 查看指定ROLE的具体权限(管理员)
SHOW GRANT ROLE reader_role_cmd;
- 权限测试
- 使用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没有。说明授权生效。
五、测试
须知:
- 默认hive中1个role都没有,SHOW ROLES;为0。但hive用户是hive服务的默认
- 不是sentry管理员也可以进入security界面,但点击roles时,非管理员显示
如果是sentry的管理员,比如hive/hive
没授权和授权后
hive/hive创建role并赋给hive组,hive组是sentry的管理组,也是linux 的组。==》sentry的组和hive的组建立了映射。
六、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
只有hdfs的权限精确到文件,才能访问
但有hive的根权限,可以访问所有库和表