Hive的默认权限模式
Hive的默认授权模式支持基于用户、组和角色的传统RDBMS风格的授权,并授予他们在数据库或表上执行操作的权限,详细描述在hive授权(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization)和hive废弃的权限模式。
这种RDBMS类型的授权不太适合Hadoop中的典型用例,因为在实现方面存在以下差异:
- 与传统的RDBMS不同,Hive不能完全控制它下面的所有数据。数据存储在多个文件中,文件系统具有独立的授权系统
- 与传统的RDBMS不允许其他程序直接访问数据不同的是,人们倾向于使用其他应用程序直接读取或写入与Hive一起使用的文件或目录
这就产生了这样的问题场景:
- 您向用户授予权限,但是用户不能访问数据库或文件系统,因为他们没有文件系统权限
- 您删除了用户的权限,但是用户仍然可以通过文件系统直接访问数据,因为他们具有文件系统权限
Hive社区意识到可能不存在一个万能的授权模型,因此它支持可插入的其他授权模型。在HCatalog包中,我们介绍了一个授权接口的实现,该接口使用底层文件系统(通常是存储后端)的权限作为每个数据库、表或分区的权限的基础
在Hive中,当文件系统用于存储时,有一个对应于数据库或表的目录。使用这种授权模型,用户或组对该目录的读/写权限决定了用户对数据库或表的权限。在HBase等其他存储系统中,对系统中等效实体的授权将使用系统的授权机制来确定Hive中的权限。
例如,alter table操作将在允许操作之前检查用户是否对表目录具有权限,即使它可能不会更改文件系统上的任何内容
用户需要对存储系统上对应的实体进行写访问,以执行任何类型的操作,从而修改数据库或表的状态。用户需要读访问权限才能对数据库或表执行任何非修改操作
当数据库或表被具有Unix/ posix权限模型(如HDFS)的文件系统所支持时,您可以为所有者用户、组和' other '设置读(r)和写(w)权限
例如,在http://hadoop.apache.org/docs/rx.x.x/hdfs_permissions_guide.html上给出了HDFS权限的详细信息
HDFS权限管理1.0.4版本http://hadoop.apache.org/docs/r1.0.4/hdfs_permissions_guide.html
HDFS权限管理1.2.1版本http://hadoop.apache.org/docs/r1.2.1/hdfs_permissions_guide.html
注意:对HDFS ACL(在Apache Hadoop 2.4中引入)的支持在已发布的Hive版本中是不可用的。这意味着,它只检查传统rwx样式的权限,以确定用户是否可以写入文件系统。对ACL的支持在Hive trunk Hive -7583中可用,在Hive 0.14中也可用
注意:如果hive.warehouse.subdir.inherit.perms启用后,将通过以下权限继承规则设置hive创建的文件和目录的权限和ACL。
用于确定用户是否对目录或文件具有权限的文件系统逻辑将被Hive使用
下表显示了此授权模型下的Hive操作所需的最小权限:
警告:目前Hive的这种授权模式并不能阻止恶意用户做坏事
权限未使用的DDL:
管理Hive默认授权模型的权限的DDL语句对基于存储的模型中的权限没有任何影响
配置基于存储系统的授权
基于文件系统的授权模型的实现可以通过一个名为StorageBasedAuthorizationProvider的授权提供程序来实现,该授权提供程序是Hive的一部分。(在0.10.0版本的Hive包中添加了对这个的支持—参见hive-3705和Metastore服务器中的基于存储的授权。)
需要将以下条目添加到hive-site.xml以启用授权
hive.security.authorization.enabledtrueenable or disable the hive client authorizationhive.security.authorization.managerorg.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProviderthe hive client authorization manager class name. The user defined authorization class should implement interface org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider.