首页 > 代码库 > Hive权限之改进
Hive权限之改进
不足
即使开启hive权限认证的情况下,任何用户仍然是超级用户,可以通过grant给任何人赋予任何权限,这样权限认证基本没有意义,因此必须在开启权限认证的同时,对执行grant/revoke的实体进行限制,比如只有admin才能 grant privilege on database,只有table owner才能grant privilege on table。BIP中hive目前是没有开启权限认证的。
改进
针对hive权限的不足以及bip对hive的使用场景,改进后的hive权限认证有一个拥有超级权限的角色admin_role, 即admin_role拥有没有开启权限认证时候一样的所有权限,拥有admin_role的用户就是admin,而普通用户只有是某个实体的owner或者被grant相应的权限时才能在这个实体上进行对应的操作,具体体现在一下几点:
1、 DB上的权限:BIP的hive_warehouse中只有一个DB,也即默认的DB default,只有admin才能对DB上权限进行管理,主要有:create/drop database、grant/revoke privilege on database
2、 Table/Column上的权限:普通用户只有在被pplive grant create on database后才能创建表,一个表在被创建后,admin_role和owner拥有all也即所有的权限,同时只有对table拥有all权限才能grant/revoke privilege on table,其他用户或拥有的role被grant相应权限后就能进行对应的操作
3、 Role上的权限:只有admin_role才有权create/drop role,因此也就只有admin才能对role进行权限相关的操作
4、 只有admin_role拥有代理权限,即admin_role可以转换为bip.user用户进行hive的一切操作,此时创建、读写表都是以代理的bip.user的身份去执行,适用于bip web场景
Hive对hql的解析主要有词法分析、语法分析、语义分析和执行四步,词法分析和语法分析主要是形成抽象语法树AST,确保hql语法的正确性,语义分析则是将AST翻译成task并分析task间的关系形成有向无环图DAG,最终执行引擎则将DAG中task提交给Hadoop执行并监控task的执行状态。Hive通过在语义分析中进行权限验证,检查用户是否对执行hql所操作的table和column有相应的权限,同时开放了hook让我们可以对语义分析的输入和输出进行操作,以下属性可以配置语义分析hook类:
<property>
<name>hive.semantic.analyzer.hook</name>
<value>com.bip.hive.auth.AuthHook></value>
</property>
语义分析hook类须继承抽象类AbstractSemanticAnalyzerHook,可实现preAnalyze进行语义分析前检查,实现postAnalyze进行语义分析后操作,而自定义的权限检查则是在preAnalyze中实现。我们在Semantic Hook中获取用户的身份,判断用户是否能执行某种操作,进而区分了admin和非admin的执行权限。
Hive默认使用HadoopDefaultAuthenticator获取执行hql的用户,并使用其返回的用户进行权限验证。为了使hive能够以代理的模式去执行,我们需要提供自己的authenticator,返回设置的bip.user作为真正的hql执行者,以下配置可设置authenticator:
<property>
<name>hive.security.authenticator.manager</name>
<value>com.pplive.bip.hive.auth.Authenticator</value>
<description>bip user authenticator</description>
</property>
目前admin通过在hive命令行定义bip.user变量启动hive可进入代理模式:
Hive -d bip.user=xxx 或 hive --define bip.user=xxx
Memo
Hive也提供group权限管理功能,在role已经能够满足需求的情况下不建议进行group相关的权限管理。
通过对hive权限管理的改进,可以防止非法用户对没有权限的表、列进行读写删除操作,同时可以对执行的hql进行审计,分析hql的执行时间和频率以及hive表的使用频率。
基于MetaData的权限管理相关的权限信息是存储在hive metadata中,其实也可以将权限信息存储在我们自己db中,这样就能自己把握权限控制的规则,不用开启hive的权限控制,在SemanticAnalyze之后基于我们的规则对hql所读写的表、字段进行控制。
然而,即使是改进后的hive权限依然较弱,因为hive所有权限相关的信息都存储在MetaData中,只要用户知道了存储MetaData的Mysql用户名和密码就可以任意修改权限MetaData, 而连接MetaData Mysql的信息在hive-site.xml中是明文配置的,因此最安全权限是基于Storage底层的访问控制。