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
Sentry是Hadoop安全方面的一个开源组件,目前还在孵化中,地址:
Sentry是一个Hadoop的授权模块,为了对正确的用户和应用程序提供精确的访问级别,Sentry提供了细粒度级、基于角色的授权以及多租户的管理模式,为Hadoop使用者提供了以下便利:
能够在Hadoop中存储更敏感的数据
使更多的终端用户拥有Hadoop数据访问权
创建更多的Hadoop使用案例
构建多用户应用程序
符合规范(例如SOX,PCI,HIPAA,EAL3)
本文(也可能是系列)主要讲述使用中趟过的那些坑,和具体的使用参考。
一、安装
我这边使用的是cdh5.4.3版本,sentry的版本是1.4.0,直接找到cloudera官方,找到tarball下载、解压即可。然后修改下/etc/profile,加到环境变量中
二、修改配置
参考文章:
重点关注:
三、初始化数据库,启动service,然后按照host和端口修改Hue配置:
四、问题出现
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;
查看Groups类,hadoop-common包:
构造函数中:
看样子是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:
我的:
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:
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
相关文章推荐
- 2.1-apache配置静态缓存
- CentOS7.0下,apache不能正常运行的解决思路
- 2.1-Apache不记录指定文件类型日志
- 2.0-apache日志切割
- solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法
- Apache Spark 入门简介
- lamp环境搭建 centos5.5 +Apache2.2.9 +mysql5.1.18+php5.3.6 源码安装,【附配置环境】
- Mac配置apache,mysql
- apache优化
- Apache与IIS的客观对比(不比不知道,一比吓一跳)
- centos 6.7下安装redmine+svn+apache
- Visual Studio Tools for Apache Cordova 使用web技术构建使用Ios Andriod 和 windows 的应用
- Apache漏洞利用与安全加固实例分析
- pom.xml 在eclipse中显示error: Hadoop:Missing artifact org.apache.hadoop
- win7系统配置php+Apache+mysql环境的方法
- wamp 下 Apache 局域网访问403的解决问题
- 安装apache2遇到的问题
- 如何独立安装apache的ab笔记
- Apache,php关于站点配置及访问
- 本地机apache配置基于域名的虚拟主机详解