声明:Hive授权不是完全安全的。基本授权模式的目的主要是防止优秀用户意外地做坏事,但对防止恶意用户做坏事没有承诺。有关安全选项,请参阅Hive授权主页
前提
为了使用Hive授权,需要在hive-site.xml中设置以下两个参数
hive.security.authorization.enabledtrueenable or disable the hive client authorizationhive.security.authorization.createtable.owner.grantsALLthe privileges automatically granted to the owner whenever a table gets created. An example like "select,drop" will grant select and drop privilege to the owner of the table
注意,默认情况下hive.security.authorization.createtable.owner.grants设置为null,这将导致表的创建者无法访问该表。
用户、组和角色
Hive授权系统的核心是用户、组和角色。角色允许管理员为一组可轻松重用的授予指定名称。角色可以分配给用户、组和其他角色。例如,考虑一个具有以下用户和组的系统:
- :
- user_all_dbs: group_db1, group_db2
- user_db1: group_db1
- user_db2: group_db2
如果希望将每个用户限制在一组特定的数据库中,则可以使用角色来构建授权机制。管理员将创建两个角色,分别称为role_db1和role_db2。role_db1角色将只提供第一个数据库的特权,而role_db2角色将只提供第二个数据库的特权。然后,管理员可以将role_db1角色授予group_db1,或者显式地授予组中的用户,并对第二个数据库的用户对role_db2执行相同的操作。以便让需要查看所有数据库的用户得到他们适当的
与用户和组不同,Hive角色必须在使用之前手动创建。用户和组由 hive.security.authenticator.manager管理。当一个用户连接到一个Metastore服务器并发出一个查询,Metastore将确定连接用户的用户名,以及与ushive.security. authorizization.ername相关联的组。然后,通过比较Hive操作所需的特权和使用以下规则的用户特权,该信息用于确定用户是否应该访问被请求的元数据:
- 用户权限(有权限授予给用户)
- 组权限(用户是否属于已授予该权限的任何组)
- 角色权限(用户或该用户所属的任何组是否具有授予该权限的角色)
默认情况下,Metastore使用HadoopDefaultAuthenticator来决定user ->组映射,它通过使用运行该Metastore的机器上的Unix用户名和组来决定授权。为了更清楚,考虑一个场景:一个用户foo是组棒的机器上运行hive客户端,并连接到一个Metastore一个单独的服务器上运行,也有一个用户名为foo,但是Metastore服务器上,foo是集团baz的成员。当执行一个操作时,metastore将确定foo在baz组中。
更进一步,用户在Metastore服务器上所属的组也可能与同一用户所属的组不同,这是由HDFS决定的。如果Hive或HDFS被配置为使用非默认的user ->group映射器,或者Metastore和Namenode都使用默认的映射器,但是进程在不同的机器上运行,并且user ->group映射在每台机器上不相同,这种情况可能会发生。
需要注意的是,Hive Metastore只控制元数据的授权,而底层数据是由HDFS控制的,所以如果两个系统之间的权限和特权不同步,用户可以访问元数据,但不能访问物理数据。如果跨Metastore和Namenode的user ->组映射不同步,就像上面的场景一样,一个用户可能拥有根据Metastore访问表所需的特权,但是可能没有根据Namenode访问底层文件的权限。这也可能是由于管理员介入造成的。
用户和角色的名称
角色名是区分大小写的。然而,在Hive 0.13中,有一个bug导致它有大小写不敏感的行为。这个问题在hive 0.14中得到了修复。
用户名也是区分大小写的。与角色名不同,用户名不在Hive中管理
Creating/Dropping/Using Roles
Create/Drop Role
CREATE ROLE role_nameDROP ROLE role_name
Grant/Revoke Roles
GRANT ROLE role_name [, role_name] ...TO principal_specification [, principal_specification] ...[WITH ADMIN OPTION]REVOKE [ADMIN OPTION FOR] ROLE role_name [, role_name] ...FROM principal_specification [, principal_specification] ...principal_specification: USER user | GROUP group | ROLE role
查看角色授权
SHOW ROLE GRANT principal_specification principal_specification: USER user | GROUP group | ROLE role
权限
hive支持以下权限
- ALL - 赋予用户所有权限
- ALTER - 允许用户修改对象的元数据
- UPDATE - 允许用户修改对象的物理数据
- CREATE - 允许用户创建对象。对于数据库,这意味着用户可以创建表,对于表,这意味着用户可以创建分区
- DROP - 允许用户删除对象
- INDEX - 允许用户在对象上创建索引(注意:目前还没有实现)
- LOCK - 允许用户在启用并发时锁定或解锁表
- SELECT - 允许用户访问对象的数据
- SHOW_DATABASE - 允许用户查看可用的数据库
Grant/Revoke权限
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... [ON object_specification] TO principal_specification [, principal_specification] ... [WITH GRANT OPTION]REVOKE [GRANT OPTION FOR] priv_type [(column_list)] [, priv_type [(column_list)]] ... [ON object_specification] FROM principal_specification [, principal_specification] ...REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...priv_type: ALL | ALTER | UPDATE | CREATE | DROP | INDEX | LOCK | SELECT | SHOW_DATABASE object_specification: TABLE tbl_name | DATABASE db_name principal_specification: USER user | GROUP group | ROLE role
查看grant权限
SHOW GRANT principal_specification[ON object_specification [(column_list)]] principal_specification: USER user | GROUP group | ROLE role object_specification: TABLE tbl_name | DATABASE db_name
Hive操作和所需的权限
根据org.apache.hadoop.hive.ql.plan.HiveOperation,在Hive 0.7发布时,只有这些操作需要权限: