文档编写目的

在CDH中,Sentry服务是一个基于角色授权的管理组件,通常我们将Sentry用来管理Hive、Impala等组件,但是同样的,Sentry也可以为Solr提供基于角色的细粒度授权,在启用Sentry后,可以对各种操作进行权限上的限制,无论对数据的访问是来自命令行、浏览器还是Hue,都会基于授予的角色拥有的权限来进行管理和限制。要注意的是,启用Sentry对Solr进行权限控制前需要先启用Kerberos,本文档将介绍如何使用Sentry对Solr进行赋权。


  • 测试环境:

1.CM和CDH版本为6.2.0

2.Solr版本为7.4

3.集群启用Sentry

4.集群启用Kerberos

5.操作系统版本为RedHat7.2


Solr集成Sentry


在Solr中进行相关的配置,勾选Sentry服务,与Solr集成。用户组和映射类选择Hadoop的用户组,不建议选择本地组


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆


在Solr中选择安全身份验证为Kerberos,由于集群已经启用了Kerberos,这里直接勾选Kerberos


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆_02


将配置保存后,重启Solr服务,完成Solr与Sentry的集成


0703-6.2.0-使用Sentry为Solr进行赋权_xml_03


使用Sentry对Solr进行赋权


本文档主要介绍如何使用Sentry对Solr中的Collection进行权限管理,对于Collection的权限有三种:QUERY、UPDATE、 *,QUERY提供读的访问权限,UPDATE提供写访问权限,通配符*表示所有权限,在授权时,同样可以使用collection=*的方式来授予角色所有collection 的相应权限。在Solr中使用Sentry来赋权,与其他组件一致,是将权限赋予角色,然后将角色授予相应的用户组,让用户组下的用户能够执行相应的权限,下面在Sentry中以命令行的方式对Solr进行赋权。


3.1 对Solr进行赋权的前置准备


1.准备好测试文件,一个10行数据的csv文件


0703-6.2.0-使用Sentry为Solr进行赋权_solr_04


2.准备好创建Collection所需要的schema.xml配置文件,对每个字段进行一一对应的配置


<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
<fields>
<field name="s1" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="s2" type="string" indexed="true" stored="true" />
<field name="s3" type="string" indexed="true" stored="true" />
<field name="s4" type="string" indexed="true" stored="true" />
<field name="s5" type="string" indexed="true" stored="true" />
<field name="s6" type="string" indexed="true" stored="true" />
<field name="_version_" type="long" indexed="true" stored="true"/>
</fields>
<uniqueKey>s1</uniqueKey>
<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
</types>
</schema>


0703-6.2.0-使用Sentry为Solr进行赋权_solr_05


3.准备好创建Collection的脚本,在脚本中,标注的那两行操作是将solrconfig.xml.secure这一配置文件替换掉原本的schema.xml,因为在启用Sentry的Solr中,必须要使用solrconfig.xml.secure这个配置文件才能让Sentry的权限管理生效


#!/bin/sh
ZK="cdh178.macro.com"
COLLECTION="collection0731"
BASE=`pwd`
SHARD=3
REPLICA=1
echo "create solr collection"
rm -rf tmp/*
solrctl --zk $ZK:2181/solr instancedir --generate tmp/${COLLECTION}_configs
mv tmp/${COLLECTION}_configs/conf/solrconfig.xml tmp/${COLLECTION}_configs/conf/solrconfig.xml.bk
mv tmp/${COLLECTION}_configs/conf/solrconfig.xml.secure tmp/${COLLECTION}_configs/conf/solrconfig.xml
cp conf/schema.xml tmp/${COLLECTION}_configs/conf/
solrctl --zk $ZK:2181/solr instancedir --create $COLLECTION tmp/${COLLECTION}_configs
solrctl --zk $ZK:2181/solr collection --create $COLLECTION -s $SHARD -r $REPLICA
solrctl --zk $ZK:2181/solr collection --list


0703-6.2.0-使用Sentry为Solr进行赋权_solr_06


4.创建Collection,这一步操作需要使用solr系统用户登录Kerberos来完成

使用solr系统用户登陆Kerberos


0703-6.2.0-使用Sentry为Solr进行赋权_xml_07


执行脚本创建Collection,collection0731创建成功


0703-6.2.0-使用Sentry为Solr进行赋权_solr_08


5.将准备的csv数据文件导入到Solr中,这一步同样需要solr系统用户来完成

使用solr用户登陆Kerberos


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆_09


导入csv数据文件


curl --negotiate -u : 'http://cdh178.macro.com:8983/solr/collection0731/update/csv?commit=true' \
-H 'Content-Type: application/csv' \
--data-binary @/root/test0726/data.csv


0703-6.2.0-使用Sentry为Solr进行赋权_solr_10


查看数据导入是否成功


curl --negotiate -u : "http://cdh178.macro.com:8983/solr/collection0731/query?q=*%3A*&wt=json&indent=true"


0703-6.2.0-使用Sentry为Solr进行赋权_solr_11


至此,Collection创建成功,csv数据文件也导入成功,下面用Sentry对Solr进行赋权


3.2 使用Sentry对Solr进行赋权

先创建一个admin角色,并赋予所有权限,然后将admin角色授予solr用户组,该操作需要使用solr系统用户登陆Kerberos来完成


0703-6.2.0-使用Sentry为Solr进行赋权_solr_12


创建角色admin并赋权然后给到solr用户组


solrctl sentry --create-role admin
solrctl sentry --add-role-group admin solr
solrctl sentry --grant-privilege admin 'collection=*->action=*'
solrctl sentry --grant-privilege admin 'config=*->action=*'


0703-6.2.0-使用Sentry为Solr进行赋权_solr_13


查看角色admin的权限


solrctl sentry --list-privileges admin


0703-6.2.0-使用Sentry为Solr进行赋权_xml_14


下面对test用户进行权限测试

1.使用test用户登陆Kerberos,此时未使用Sentry对test用户组进行授权


0703-6.2.0-使用Sentry为Solr进行赋权_xml_15


2.使用未授予任何权限的test用户来查看之前创建的Collection


curl --negotiate -u : "http://cdh178.macro.com:8983/solr/collection0731/query?q=*%3A*&wt=json&indent=true"


0703-6.2.0-使用Sentry为Solr进行赋权_xml_16


由上图可以看出,test用户并没有查看Collection的权限

3.使用未授予任何权限的test用户来对之前创建的Collection进行更新操作


curl --negotiate -u : 'http://cdh178.macro.com:8983/solr/collection0731/update' \
> -H 'Content-Type: application/json' \
> -d '[{"s1":"11", "s2":"1111", "s3":"kkk", "s4":"2019-07-22 18:22:25", "s5":"text11", "s6":"mark"}]'


0703-6.2.0-使用Sentry为Solr进行赋权_solr_17


由上图可以看出,test用户同样没有更新Collection的权限

4.使用Solr用户登陆Kerberos,然后创建角色test,赋予所有Collection的UPDATE权限


solrctl sentry --create-role test
solrctl sentry --add-role-group test test
solrctl sentry --grant-privilege test 'collection=*->action=UPDATE'
solrctl sentry --list-privileges test


0703-6.2.0-使用Sentry为Solr进行赋权_xml_18


5.赋予所有Collection的UPDATE权限后,再次使用test登陆Kerberos,然后对Collection进行更新操作

使用Solr系统用户赋权


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆_19


solrctl sentry --create-role test
solrctl sentry --add-role-group test test
solrctl sentry --grant-privilege test 'collection=*->action=UPDATE'
solrctl sentry --list-privileges test


0703-6.2.0-使用Sentry为Solr进行赋权_solr_20


使用test用户登陆Kerberos,进行更新操作


0703-6.2.0-使用Sentry为Solr进行赋权_solr_21


curl --negotiate -u : 'http://cdh178.macro.com:8983/solr/collection0731/update' \
-H 'Content-Type: application/json' \
-d '[{"s1":"11", "s2":"1111", "s3":"kkk", "s4":"2019-07-22 18:22:25", "s5":"text11", "s6":"mark"}]'


0703-6.2.0-使用Sentry为Solr进行赋权_solr_22


由上图可以看出,test用户拥有对Collection的UPDATE权限,下面测试test用户对Collection进行查询


curl --negotiate -u : "http://cdh178.macro.com:8983/solr/collection0731/query?q=*%3A*&wt=json&indent=true"


0703-6.2.0-使用Sentry为Solr进行赋权_solr_23


可以看出,查询失败,说明UPDATE权限只能对Collection进行更新操作,而不能进行查询操作


6.使用solr系统用户登陆Kerberos,然后将角色test删除,再重新创建角色test,并赋予所有Collection的QUERY权限,然后再进行测试

使用solr用户登陆进行赋权


solrctl sentry --drop-role test
solrctl sentry --create-role test
solrctl sentry --add-role-group test test
solrctl sentry --grant-privilege test 'collection=*->action=QUERY'
solrctl sentry --list-privileges test


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆_24


使用test用户登陆Kerberos,然后对Collection进行查询,查询成功


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆_25


使用test用户登陆Kerberos,然后对Collection进行更新


0703-6.2.0-使用Sentry为Solr进行赋权_xml_26


由上图可以看出,更新操作失败,因为只赋予了QUERY权限,与预期结果一致

7.对test用户赋予所有权限,然后对查询和更新进行测试

使用solr用户对test进行赋权,赋予所有权限


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆_27


使用test用户登陆Kerberos,进行查询操作,查询成功


0703-6.2.0-使用Sentry为Solr进行赋权_xml_28


使用test用户登陆Kerberos,进行更新操作,更新成功


0703-6.2.0-使用Sentry为Solr进行赋权_solr_29


更新后数据发生了变化,更新操作与查询操作都能成功进行


0703-6.2.0-使用Sentry为Solr进行赋权_solr_30


总结


1.在Solr中使用Sentry进行赋权,需要使用solrconfig.xml.secure这个配置文件来替换掉原本的solrconfig.xml配置文件,这样才能使Sentry的权限管理正常的运行。


2.在Solr中使用Sentry进行赋权操作时,和Hive中一样,需要使用对应的系统用户登陆Kerberos来完成授权,普通用户是无法进行操作的。


3.在Solr中启用Sentry之前,需要先将Kerberos启动,然后一起与Solr进行集成,这样Sentry才能在Solr中正常的赋权。


4.Sentry在Solr中的使用主要是对Collection进行QUERY和UPDATE两种方式的授权,以及授予所有权限的*。


Fayson的github:

​https://github.com/fayson/cdhproject​


0703-6.2.0-使用Sentry为Solr进行赋权_用户登陆_31