使用命令行创建collection时Sentry给Solr赋权的问题

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.故障描述


Fayson在前面的文章介绍过《如何使用Sentry为Solr赋权》,但当时Fayson是在Hue中创建的collection,如果我们采用先创建schema的xml文件,然后通过命令行创建Solr的collection,使用Sentry赋权后,会出现权限不生效的情况。以下我们具体看看故障现象。我们依旧以《如何使用Sentry为Solr赋权》里的测试样例数据为例子,参考Hue中创建collection的方式来定义一个schema文件。

2.collection创建以及导入数据


1.首先准备一个8个字段的csv文件,一共10行,使用逗号分隔,用来导入Solr并实现全文索引。

注意:这个csv我们定义了文件头,一共8个字段,从field_1到field_8。

2.定义一个schema文件,一共8个字段,从field_1到field_8,其中field_1为主键。

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
<fields>
  <field name="field_1" type="string" indexed="true" stored="true" required="true" multiValued="false" />
  <field name="field_2" type="string" indexed="true" stored="true" />
  <field name="field_3" type="text_en" indexed="true" stored="true" />
  <field name="field_4" type="string" indexed="true" stored="true" />
  <field name="field_5" type="string" indexed="true" stored="true" />
  <field name="field_6" type="string" indexed="true" stored="true" />
  <field name="field_7" type="string" indexed="true" stored="true" />
  <field name="field_8" type="string" indexed="true" stored="true" />
<field name="_version_" type="long" indexed="true" stored="true"/>
</fields>
<uniqueKey>field_1</uniqueKey>
<types>
<!-- The StrField type is not analyzed, but indexed/stored verbatim.
               It supports doc values but in that case the field needs to be
     single-valued and either required or have a default value.
     -->
<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
<!--
               Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types.
These fields support doc values, but they require the field to be
single-valued and either be required or have a default value.
-->
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100" /> 
</types>
</schema>

(可左右滑动)

3.准备创建collection的脚本,并创建collection

#!/bin/sh

ZK="cdh01.fayson.com"
COLLECTION="collection1"
BASE=`pwd`
SHARD=3
REPLICA=1
echo "create solr collection"
rm -rf tmp/*
solrctl --zk $ZK:2181/solr instancedir --generate tmp/${COLLECTION}_configs
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

(可左右滑动)

注意:因为我们开启了Sentry,在创建collection的时候我们使用的是solr用户的principle。否则是没有权限创建collection的。这里跟在Hive/Impala中使用Sentry时,使用hive作为管理员用户是相似的。

4.将准备好的csv文件导入到collection1.

curl --negotiate -u : 'http://cdh04.fayson.com:8983/solr/collection1/update/csv?commit=true' \
-H 'Content-Type: application/csv' \
--data-binary @/root/_fayson/data.csv

(可左右滑动)

5.查询collection1确认数据都已经导入成功。

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

(可左右滑动)

3.故障重现


1.首先我们创建一个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=*'
solrctl sentry --list-privileges admin

(可左右滑动)

注意:必须使用solr用户的principal。

2.我们在不给fayson用户组分配任何权限的情况下,使用fayson用户对collection1进行查询。

[root@cdh02 solr]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: fayson@FAYSON.COM
Valid starting       Expires              Service principal
06/13/2018 21:35:08  06/14/2018 21:35:08  krbtgt/FAYSON.COM@FAYSON.COM
        renew until 06/20/2018 21:35:08
06/13/2018 21:35:17  06/14/2018 21:35:08  HTTP/cdh04.fayson.com@FAYSON.COM
        renew until 06/18/2018 21:35:17
[root@cdh02 solr]# curl --negotiate -u : "http://cdh04.fayson.com:8983/solr/collection1/query?q=*%3A*&wt=json&indent=true"

(可左右滑动)

可以查询出collection中的数据,说明Sentry的权限控制没有生效,故障重现。

4.故障分析与解决


我们比较了Hue和CLI方式的solrconfig.xml文件,发现Hue的solrconfig.xml里面启用了Secure相关的配置,但是CLI方式下的却没有。Hue会自动识别到启用Sentry并修改solrconfig,但是通过Solr的命令行在创建collection的config文件时并不会自动启用Sentry的xml配置文件。所以如果想要通过命令行创建能够让Sentry支持的collection的话,我们需要手动指定collection的solrconfig文件。

注:查看collection的config文件的命令如下,将collection的config文件导出到/tmp/collection1目录

solrctl instancedir --get collection1 /tmp/collection1

(可左右滑动)

以下我们具体看看如何解决。

1.首先我们通过solr用户删掉之前创建的collection1

[root@cdh02 solr]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: fayson@FAYSON.COM
Valid starting       Expires              Service principal
06/13/2018 21:35:08  06/14/2018 21:35:08  krbtgt/FAYSON.COM@FAYSON.COM
        renew until 06/20/2018 21:35:08
06/13/2018 21:35:17  06/14/2018 21:35:08  HTTP/cdh04.fayson.com@FAYSON.COM
        renew until 06/18/2018 21:35:17
[root@cdh02 solr]# kinit solr/admin
Password for solr/admin@FAYSON.COM: 
[root@cdh02 solr]# solrctl collection --delete collection1
[root@cdh02 solr]# solrctl collection --list
[root@cdh02 solr]#

(可左右滑动)

2.修改创建collection的脚本,再次创建collection

#!/bin/sh

ZK="cdh01.fayson.com,cdh02.fayson.com,cdh03.fayson.com"
COLLECTION="collection2"
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

(可左右滑动)

注意红色框框部分我们使用solrconfig.xml.secure替换solrconfig.xml

运行该脚本建立collection

[root@cdh02 solr]# sh create_sentry.sh 
create solr collection
Uploading configs from tmp/collection2_configs/conf to cdh01.fayson.com,cdh02.fayson.com,cdh03.fayson.com:2181/solr. This may take up to a minute.
collection2 (2)

(可左右滑动)

3.使用命令导入数据,依旧使用solr用户

root@cdh02 solr]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: solr/admin@FAYSON.COM
Valid starting       Expires              Service principal
06/13/2018 21:45:40  06/14/2018 21:45:40  krbtgt/FAYSON.COM@FAYSON.COM
        renew until 06/20/2018 21:45:40
06/13/2018 21:46:02  06/14/2018 21:45:40  HTTP/cdh02.fayson.com@FAYSON.COM
        renew until 06/18/2018 21:46:02
06/13/2018 21:52:16  06/14/2018 21:45:40  HTTP/cdh04.fayson.com@FAYSON.COM
        renew until 06/18/2018 21:52:16
[root@cdh02 solr]# curl --negotiate -u : 'http://cdh04.fayson.com:8983/solr/collection2/update/csv?commit=true' \
> -H 'Content-Type: application/csv' \
> --data-binary @/root/_fayson/data.csv
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">284</int></lst>
</response>

(可左右滑动)

4.使用fayson用户登录Kerberos对collection2进行查询

[root@cdh02 solr]# kinit fayson
Password for fayson@FAYSON.COM: 
[root@cdh02 solr]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: fayson@FAYSON.COM
Valid starting       Expires              Service principal
06/13/2018 21:53:50  06/14/2018 21:53:50  krbtgt/FAYSON.COM@FAYSON.COM
        renew until 06/20/2018 21:53:50
[root@cdh02 solr]# curl --negotiate -u : "http://cdh04.fayson.com:8983/solr/collection2/query?q=*%3A*&wt=json&indent=true"

(可左右滑动)

查询失败,说明通过命令行创建的collection,在不通过Sentry分配权限的情况下,无法进行对collection查询。

5.通过solr用户重新创建一个fayson角色,并赋予所有collection的Update权限。注意需要使用solr用户登录Kerberos

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

(可左右滑动)

6.再次使用fayson用户登录Kerberos,再次对collection2进行查询。

[root@cdh02 solr]# kinit fayson
Password for fayson@FAYSON.COM: 
[root@cdh02 solr]# curl --negotiate -u : "http://cdh04.fayson.com:8983/solr/collection2/query?q=*%3A*&wt=json&indent=true"

(可左右滑动)

依旧查询失败,说明collection的update权限只能让用户组有创建或者更新collection的权限。

7.使用solr用户登录Kerberos,将fayson用户组的权限改为所有collection的查询权限。

[root@cdh02 solr]# kinit solr/admin
Password for solr/admin@FAYSON.COM: 
[root@cdh02 solr]# solrctl sentry --drop-role fayson
[root@cdh02 solr]# solrctl sentry --create-role fayson
[root@cdh02 solr]# solrctl sentry --grant-privilege fayson 'collection=*->action=Query'
[root@cdh02 solr]# solrctl sentry --add-role-group fayson fayson
[root@cdh02 solr]# solrctl sentry --list-privileges fayson

(可左右滑动)

8.再次使用fayson登录Kerberos并对collection2进行查询。

[root@cdh02 solr]# kinit fayson
Password for fayson@FAYSON.COM: 
[root@cdh02 solr]# curl --negotiate -u : "http://cdh04.fayson.com:8983/solr/collection2/query?q=*%3A*&wt=json&indent=true"

(可左右滑动)

查询成功,说明通过Sentry给fayson用户组分配的collection的query权限成功。

5.总结


如果在Hue中创建solr的collection,Hue会自动识别到启用Sentry并修改solrconfig,但是通过Solr的命令行在创建collection的config文件时并不会自动启用Sentry的xml配置文件。通过命令行在创建collection的时候,需要在通过solrctl instancedir –generate创建好config文件后,手动将solrconfig.xml.secure替换为solrconfig.xml,然后再创建collection。这是通过Sentry对该collection的赋权才能生效。

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何在Kerberos与非Kerberos的CDH集群BDR不可用时复制数据

本文档描述了在Kerberos与非Kerberos的CDH集群之间BDR不可用的情况下实现数据互导。文档主要讲述

84811
来自专栏Hadoop实操

如何在Redhat7.4安装CDH6.0

Cloudera在前天8月30日,对外宣布正式发布Cloudera Enterprise 6,相关介绍可以参考Fayson昨天的文章《Cloudera Ente...

1.8K6
来自专栏乐沙弥的世界

基于Innobackupex的全备恢复

    对于MySQL数据库的热备,xtrabackup是大多数DBA朋友们的选择。xtrabackup内嵌了一个innobackupex可用于热备MySQL数...

3902
来自专栏Hadoop实操

如何启用Oozie的HA

Oozie是基于Hadoop的作业调度工具,工作流引擎,在实际工作中,遇到对数据进行一连串的操作的时候很实用,不需要自己写一些处理代码了,只需要定义好各个act...

1.5K6
来自专栏Hadoop实操

8.如何使用RedHat7的OpenLDAP和Sentry权限集成

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproje...

52711
来自专栏蓝天

Hive 1.2.1&Spark&Sqoop安装指南

本文的安装参照《Hive 0.12.0安装指南》,内容来源于官方的:GettingStarted,将Hive 1.2.1安装在Hadoop 2.7.1上。本...

2441
来自专栏纯洁的微笑

springboot(十七):使用Spring Boot上传文件

上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spring Boot上传文件的小案例。 1、pom包配置 我们使用S...

7464
来自专栏蓝天

编译hbase-1.2.3源代码

确保机器可以正常访问Internet,如能正常访问https://repo.maven.apache.org等,如果是代理方式则需要设置好eclipse和m...

2232
来自专栏三杯水

ELKB5.2.2集群环境部署配置优化终极文档

3,logstash filter 加入urldecode支持url、reffer、agent中文显示

3612
来自专栏Hadoop实操

如何在Redhat7.3安装CDH5.14

Cloudera在2018年1月26日发布了CDH5.14,新功能介绍可以参考Fayson之前的文章《CDH5.14和CM5.14的新功能》。本文档主要描述如何...

2.1K8

扫码关注云+社区

领取腾讯云代金券