文章目录
一、环境
ldap跟hdfs、hive整合,kerberos、sentry安装并启用。
二、非ldap下
1. 验证1:kerberos的认证、sentry的授权不关心用户的来源(ldap,linux),是独立于linxu和ldap的,可以不在linux创建对应用户。
kerberos、sentry只接收相关服务(hdfs、hive、impala)的认证、授权委托。验证用户是否认证、授权,用户是由服务提交的,至于用户最终映射到哪里(ldap、linux),kerberos、sentry并不关心
{1} 在ldap中添加一个linux中没有的entry(用户),先不赋sentry权限,查看这个用户是否可以访问hive。然后sentry再授权,查看访问情况
[1] 创建在linux中没有的ldap用户
创建组vim /opt/ldap-groups/testgroup.ldif
ldapadd -D “cn=ldapadmin,dc=example,dc=com” -W -x -f /opt/ldap-groups/testgroup.ldif -hnode105 -p389
创建用户vim /opt/ldap-users/testuser.ldif
ldapadd -D “cn=ldapadmin,dc=example,dc=com” -W -x -f /opt/ldap-users/testuser.ldif -hnode105 -p389
id testuser
[2] 进行krb认证
[3] 访问hdfs
没进行krb认证,报如下错误
如果kdestory,则不能访问
kinit testuser
在testuser认证的情况下,有的目录可以访问,有的访问不了
那是因为hdfs根本不归sentry管,通过自己的acls,在hue中给hdfs授权,其实也是走的acls,并不是sentry
[4] sentry未授权的情况下访问hive
beeline -u "jdbc:hive2://node105:10000/;principal=hive/node105@XYYH.COM"
后面的principal是hive服务的主体,用户是当前krb认证的
无法访问对应表。
此时testuser用户所在组testgroup没有任何角色:
[4] 赋予表sentry的权限,查看是否可以访问hive
-
切换到超级用户dcdcdc:
kinit dcdcdc
-
beeline -u “jdbc:hive2://node105:10000/;principal=hive/node105@XYYH.COM”
-
show roles; dcdcdc当然是可以获取的,testuser直接报错,因为没权限
-
show current roles;
-
用超级用户给testuser授权
创建role:create role testgrouprole;
show roles;
将dctest库的权限付给testgrouprole: grant all on database dctest to ROLE testgrouprole;
将角色testgrouprole分配给testgroup组: GRANT ROLE testgrouprole TO GROUP testgroup;
-
退出beeline,重新用testuser认证
beeline -u “jdbc:hive2://node105:10000/;principal=hive/node105@XYYH.COM”
show current roles;会发现相比上一节,多了role
再次查询select * from dctest.test limit 10;会发现能查到dctest库中的数据。
2. 验证2:整合ldap后,不在ldap但在linux的用户是否仍可以访问hive
kinit hive/hive, 发现可以访问
三、ldap整合cdh后相关验证
1. ldap中创建的用户linux是否可以查到、登陆、使用ssh登陆
在ldapadmin中创建一个用户test1
在linux中使用ldapsearch -D “cn=admin,dc=xyyh,dc=com” -W |grep dn可以查到,在id test1却提示没有这个用户。==》
需要安装sssd
第一遍安装时没有安装ssd,之后在步骤中添加,最后所有客户端linux中可以查看到ldap中添加linux中没有添加的用户:但这个用户必须符合linux 的基本要求,比如要有组,如果ldap中添加一个没有组的用户,linux中还是查不到
2. ldap中创建一个用户和组,linux上不建。在hive中是否可以使用;是否可以使用sentry控制权限。hue中是否也能映射用户、组、权限。
在ldap上创建1个linux中没有的用户,设置好组,然后在不同sentry权限的情况下测试。
{1} 创建用户时并设置组,注意:创建用户时objectClass不能只选posixAccount,创建组时可以只选posixGroup
### {2} 在hive的beeline中测试此时已经可以直接用test12登陆hive了
select current_user();
因为还没有授权,所以只能查看默认库
授权,另开一个窗口用超级用户hive登陆
此时就可以查看所有库了,也可以查看表中数据
再把权限取消
此时就不能查看了
{3} hue
## 3. 在beeline命令中 + ldap一个用户多个组的时 :测试sentry ### {1} src 环境: 2个库,test1和test2, test1下有表test1_table,数据是1,1 test2下有表test2_table,数据是2,2思路:
创建2个role,role1有test1的权限,role2有test2的权限。
在ldap中的用户test12,目前有一个组test12group,给它添加2个组,group1和group2,然后分别授role1和role2。
看看sentry是否能正常发挥作用。
{2} process
创建role,授权role
create role role1;grant all on database test1 to role role1;show grant role role1;
create role role2;grant all on database test2 to role role2;show grant role role2;
ldap中创建2个组
sentry中建立组和role的关联
取消test12group组的role,此时test12用户只能查看default库
只给test12授role1,查看show databases;和select * from test1.test1_table;
只给test12授role2,取消role1,查看show databases;和select * from test2.test2_table;
目前,beeline中发现只认一个主组,别的组的role都无效,除非把主组给删掉,其他组的role才发挥作用。如何才能使用户和组多对多???
3. linux中是否可以同步ldap中多对多的用户-组的关系
{1}
{2} 亲测,是可以的。需要修改sssd的配文
【1】需要sssd的ldap_schema = rfc2307bis修改为rfc2307,因为默认就是rfc2307,所以直接注释即可。注意:所有节点上的/etc/sssd/sssd.conf都要改,sssd服务在每个节点上都有
LDAP的Schema定义了服务器上检索到默认属性名以及一些属性的含义,特别是成员属性。有两种最广泛的使用模式rfc2307和rfc2307bis,rfc2307为默认的模式。当使用rfc2307模式时,组成员是配置在memberUid的属性中。使用rfc2307bis模式时,需要在sssd.conf文件中增加如下配置;
【2】 在ldap中,每个用户设置主组,然后在每个组下添加memberUid。此时进入linux用id xxx查看,发现还是原来的,这是因为sssd有缓存,使用sss_cache -E
清除缓存。linux就可以借助sssd完美映射ldap中用户和组的关系了。
下图中的test12用户和它的3个组都是ldap中的,linux中都没有。