您的位置:首页 > 运维架构 > Apache

Apache Sentry 第一弹:Server启动、连接Hue、分组详解

2015-08-21 23:55 537 查看
前言:

Sentry是Hadoop安全方面的一个开源组件,目前还在孵化中,地址:https://sentry.incubator.apache.org。原属于Cloudera开发,后来贡献给了Apache。关于它的强大直接摘录一段,全文请查看:http://www.csdn.net/article/2013-08-14/2816575-with-sentry-cloudera-fills-hadoops-enterprise-security-gap:

Sentry是一个Hadoop的授权模块,为了对正确的用户和应用程序提供精确的访问级别,Sentry提供了细粒度级、基于角色的授权以及多租户的管理模式,为Hadoop使用者提供了以下便利:

能够在Hadoop中存储更敏感的数据

使更多的终端用户拥有Hadoop数据访问权

创建更多的Hadoop使用案例

构建多用户应用程序

符合规范(例如SOX,PCI,HIPAA,EAL3)

本文(也可能是系列)主要讲述使用中趟过的那些坑,和具体的使用参考。

一、安装

我这边使用的是cdh5.4.3版本,sentry的版本是1.4.0,直接找到cloudera官方,找到tarball下载、解压即可。然后修改下/etc/profile,加到环境变量中

exportSENTRY_HOME=/home/hadoop/apache-sentry-1.4.0-cdh5.4.3-bin/ exportPATH=$SENTRY_HOME/bin:$PATH

二、修改配置

参考文章:http://blog.javachen.com/2015/04/30/install-and-config-sentry.html、

http://gethue.com/apache-sentry-made-easy-with-the-new-hue-security-app/(一定要详读,很有用,下面也会说到

重点关注:

1、数据库的配置,注释掉的为Mysql的配置参照 <property> <name>sentry.store.jdbc.url</name> <!--<value>jdbc:mysql://host:port/sentry</value>--> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> <description>JDBCconnectionURLforthebackedDB</description> </property> <property> <name>sentry.store.jdbc.user</name> <value></value> <description>Useridforconnectingtobackenddb</description> </property> <property> <name>sentry.store.jdbc.password</name> <value></value> <description>SentrypasswordforbackendJDBCuser</description> </property> <property> <name>sentry.store.jdbc.driver</name> <!--<value>com.mysql.jdbc.Driver</value>--> <value>org.apache.derby.jdbc.EmbeddedDriver</value> <description>BackendJDBCdriver-org.apache.derby.jdbc.EmbeddedDriver(onlywhendbtype=derby)JDBCDriverclassforthebackedDB</description> </property> 2、顾名思义,下面的参数分别表示允许连接的用户,和管理员的组,很重要,后面详细说明。 <property> <name>sentry.service.allow.connect</name> <value>hive,hue,jerrickwang</value> <description>commaseparatedlistofusers-Listofusersthatareallowedtoconnecttotheservice(egHive,Impala)</description> </property> <property> <name>sentry.service.admin.group</name> <value>admin</value> <description>Commaseparateslistofgroups.Listofgroupsallowedtomakepolicyupdates</description> </property> 3、sentry的组映射,默认配置HadoopGroupMappingService,也可以使用LocalGroupMapping,但是使用后者的时候需要指定policefile的地址。 <property> <name>sentry.store.group.mapping</name> <value>org.apache.sentry.provider.common.HadoopGroupMappingService</value> <description> GroupmappingclassforSentryservice.org.apache.sentry.provider.file.LocalGroupMappingservicecanbeusedforlocalgroupmapping.</description> </property> <property> <name>sentry.store.group.mapping.resource</name> <value></value> <description>Policyfileforgroupmapping.Policyfilepathforlocalgroupmapping,whensentry.store.group.mappingissettoLocalGroupMappingServiceclass.</d escription> </property>

三、初始化数据库,启动service,然后按照host和端口修改Hue配置:

3.1如果是mysql需要先创建sentry库,然后初始化(可选)。如果是用derby,在jdbc串中配置create=true,可跳过此步 createdatabasesentry sentry--commandschema-tool-initSchema-conffileconf/sentry-site.xml-dbTypemysql 3.2启动 cd$SENTRY_HOME sentry--commandservice-conffileconf/sentry-site.xml 3.3修改Hue配置,重启hue [libsentry] #HostnameorIPofserver. hostname=localhost #Portthesentryserviceisrunningon. port=8038 #Sentryconfigurationdirectory,wheresentry-site.xmlislocated. sentry_conf_dir=/home/hadoop/apache-sentry-1.4.0-cdh5.4.3-bin/conf

四、问题出现

Hue中:jerrickwang用户:default+admin组

senrty中:

<name>sentry.service.admin.group</name>

<value>admin</value>

但是登陆后,一直报错,找不到组:

15/08/1710:10:28WARNsecurity.ShellBasedUnixGroupsMapping:gotexceptiontryingtogetgroupsforuserjerrickwang:id:jerrickwang:Nosuchuser

尝试添加role,报错:

15/08/1710:15:06WARNthrift.SentryPolicyStoreProcessor:User:jerrickwangispartof[]whichdoesnot,intersectadmingroups[admin]

15/08/1711:11:40WARNcommon.HadoopGroupMappingService:Unabletoobtaingroupsforjerrickwang

java.io.IOException:Nogroupsfoundforuserjerrickwang

看样子是用户和分组的问题,查看配置:

<property>

<name>sentry.store.group.mapping</name>

<value>org.apache.sentry.provider.common.HadoopGroupMappingService</value>

各种搜索无果,果断自己看代码,官方下载sentry1.5源码,导入到eclipse:

provider-common包中找到HadoopGroupMappingService.class,代码很少,重点关注定义了一个org.apache.hadoop.security.Groups;

publicSet<String>getGroups(Stringuser){ try{ returnnewHashSet<String>(groups.getGroups(user)); }catch(IOExceptione){ LOGGER.warn("Unabletoobtaingroupsfor"+user,e); } returnCollections.emptySet(); }

查看Groups类,hadoop-common包:

publicList<String>getGroups(Stringuser){ ListstaticMapping=(List)this.staticUserToGroupsMap.get(user); CachedGroupsgroups=(CachedGroups)this.userToGroupsMap.get(user); if(groups.getGroups().isEmpty()) { thrownewIOException("Nogroupsfoundforuser"+user); } }

构造函数中:

this.impl=((GroupMappingServiceProvider)ReflectionUtils.newInstance(conf.getClass("hadoop.security.group.mapping",ShellBasedUnixGroupsMapping.class,GroupMappingServiceProvider.class),conf)); 同级目录下找到:ShellBasedUnixGroupsMapping类 privatestaticList<String>getUnixGroups(Stringuser) throwsIOException { Stringresult=""; try{ result=Shell.execCommand(Shell.getGroupsForUserCommand(user)); } catch(Shell.ExitCodeExceptione){ LOG.warn("gotexceptiontryingtogetgroupsforuser"+user+":"+e.getMessage()); returnnewLinkedList(); }

看样子是Sentry的默认分组竟然是这样的,完全没想到的点:从linux系统获取用户的组,而jerrickwang的用户在linux中不存在,也没用组,所以报错。

cat/etc/group查看系统组,基本是root,hadoop,work。

‍‍因为Hue上是接入ldap服务作为验证,所以不能添加账号,以上面的结论为基础向linux添加jerrickwang用户,分组给hadoop,sentryadmin组给hadoop应该即可

--按此修改,重启sentry,果然成功了!‍‍

五、更多一层的验证:

1、使用ldap服务,确保linux系统上有此用户

2、确保权限:

TobeabletoeditrolesandprivilegesinHue,thelogged-inHueuserneedstobelongtoagroupinHuethatisalsoanadmingroupinSentry.Forexample,our‘hive’userbelongstoa‘hive’groupinHueandalsotoa‘hive’groupinSentry:
<property>

<name>sentry.service.admin.group</name>

<value>hive,impala,hue</value>

</property>

我的:

Linux:jerrickwang--所属hadoop组

Hue:jerrickwangadmin组

配置:

<name>sentry.service.admin.group</name>

1、<value>admin</value>权限不够,不能添加,基本确定sentry的组就是linux的组

2、<value>hadoop</value>,hue中组设成hadoop搞定!

六、数据库

1、用mysql时我是一直没成功了,各种办法都试过了也没解决掉这个问题:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Specifiedkeywastoolong;maxkeylengthis767bytes

数据库各种改过,甚至改了sentry初始化时调用的sql(在script目录下)

2、使用derby时不要自己做初始化,我这边自己初始化后,在添加角色时一直抛出一个股东error:

Causedby:ERROR42Z23:Attempttomodifyanidentitycolumn'ROLE_ID':

bug:https://issues.apache.org/jira/browse/DERBY-1495

Connectedto:ApacheDerby(version10.10.2.0-(1582446))但是此版本早就修复了

3、使用ij访问derby

下载db-deby,解压,bin目录下有连接工具ij,配置环境变量

$cd$SENTRY_HOMT

$ij

ijversion10.11
ij>connect'jdbc:derby:;databaseName=metastore_db';
ij>
showtables;
TABLE_SCHEM|TABLE_NAME|REMARKS
------------------------------------------------------------------------
SYS|SYSALIASES|
SYS|SYSCHECKS|
SYS|SYSCOLPERMS|
SYS|SYSCOLUMNS|
SYS|SYSCONGLOMERATES|
SYS|SYSCONSTRAINTS|
SYS|SYSDEPENDS|
SYS|SYSFILES|
SYS|SYSFOREIGNKEYS|
SYS|SYSKEYS|
SYS|SYSPERMS|
SYS|SYSROLES|
SYS|SYSROUTINEPERMS|
SYS|SYSSCHEMAS|
SYS|SYSSEQUENCES|
SYS|SYSSTATEMENTS|
SYS|SYSSTATISTICS|
SYS|SYSTABLEPERMS|
SYS|SYSTABLES|
SYS|SYSTRIGGERS|
SYS|SYSUSERS|
SYS|SYSVIEWS|
SYSIBM|SYSDUMMY1|
SENTRY|SENTRY_DB_PRIVILEGE|
SENTRY|SENTRY_GROUP|
SENTRY|SENTRY_ROLE|
SENTRY|SENTRY_ROLE_DB_PRIVILEGE_MAP|
SENTRY|SENTRY_ROLE_GROUP_MAP|
SENTRY|SENTRY_VERSION|
SENTRY|SEQUENCE_TABLE|

30rowsselected
ij>
exit;

七、Next

1、Sentry分组中的LocalGroupMapping使用

2、Sentry集成Hive
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: