Hive 默认的权限不是为了防止恶意用户访问隐私数据。它仅能防止用户不经意的错误操作。它本身是不完整的,包括执行 grant 语句之内的很多操作,没有授权检查。在查询编译阶段进行权限检查。但是允许用户执行 dfs 命令,用户自定义函数和 shell 命令,这些命令可能跳过权限检查。
Hive 还支持基于存储的权限,在 metastore 服务 API 中添加的权限检查。在 Hive 0.12 之后,也可以在客户端使用。可以保护 metastore 不被恶意用户修改,但不能支持行级或列级的细粒度访问控制。
为了实现细粒度的访问控制,默认权限模型通过创建视图,并且把视图而不是把底层的表分配给用户。
SQL 标准的 Hive 权限模型为 Hive 提供了第 3 方选项。因为它完全兼容 SQL 权限模型,不会为当前用户带来兼容问题。
本权限模型可以和 metastore 上的基于存储的权限模型配合使用。和当前默认的权限模型一样,在查询编译阶段判断权限。用户通过 Hive Server2 访问,并且限制用户代码和非 SQL 命令,这套权限才能起到相应的作用。通过启动 Hive Server 的用户访问数据所在的目录和文件。如果用户不需要防止恶意用户访问,可以允许通过 Hive 命令行访问这些目录和文件。
在本权限模型下,可以执行 Hive Cli,HDFS 和 hadoop jar
命令的用户,都认为是特权用户。这些工具访问数据不通过 Hive Server2,所以本权限模型不起作用。可以通过 metastore 上基于存储的权限模型控制这些访问。
像商业分析人员倾向于通过 SQL 查询数据,通过 ODBC/JDBC 连接 HiveServer2,他们的访问可以使用本模型控制。
当启用本模型时,如 dfs, add, delete, compile, and reset 命令都被禁止执行。
set 命令仅能修改一个较小的参数集合。可以修改的参数通过参数 hive.security.authorization.sqlstd.confwhitelist
控制。
仅 admin 角色可以增加或删除函数和宏。
为了使用户使用函数,可以创建持久函数。admin 角色的用户可以创建这些函数,其他用户可以使用。
当权限开启的时候,禁止使用 Hive transform 语句。
● SELECT 权限 – 可以读一个对象的权限
● INSERT 权限 – 可以增加数据到一个对象(表)
● UPDATE 权限 – 可以在对象(表)上执行 update 操作
● DELETE 权限 – 可以在对象(表)上执行 delete 操作
● ALL 权限 – 所有的上述权限
权限适用于表和视图。上述权限不支持在数据库级别设置。
一些操作会考虑是否是数据库的所有者。
URI 是另一种对象。上述权限也不适用于 URI 对象。URI 用来指向文件系统中的文件和目录。在 URI 上的权限检查基于用户在文件和目录上的权限。
对于某些操作,对象所有者(表/视图/数据库)决定了是否可以执行。
创建表、视图或数据库的用户成为它们的所有者。创建表和视图的所有者,拥有对其他用户赋权的能力。
角色可以是数据库的所有者。使用 alter database
命令可以把数据的拥有者改为一个角色。
权限可以赋给用户或角色。
一个用户可以属于多个角色。
public 和 admin 角色有特殊的意义:所有的用户都属于 public 角色。如果给 public 角色赋权限,则是向所有用户赋权限。
当用户执行 Hive 查询或命令时,检查赋给当前用户和他当前的角色(可以多个)的权限。当前的角色可以用 current roles
查看。除了 admin 角色的所有其他角色默认为当前角色。通过 set role
命令可以改变当前角色。
数据库管理员可以是 admin 角色。他们有权限执行一些特殊的命令,如 create ruoe
和 drop role
。对于没有赋给 admin 角色的对象,他们也能访问。用户如果想变为 admin 角色,需要执行 set role admin
命令。
角色名大小写不敏感。“marketing” 和 “MarkEting” 是同一个角色。
用户名大小写敏感。因为用户名不是 Hive 管理的。用户可能是 hiveserver2 认证模型支持的任何用户。
Hive 0.14 之后,角色名和用户名可以用 (`)括起来,中间可以用任何 Unicode 编码的字符。
CREATE ROLE role_name;
创建新的角色。只有 admin 角色才有权限执行。 ALL, DEFAULT 和 NONE 这 3 个角色名已经作为系统保留,普通用户不能创建。
DROP ROLE role_name;
只有 admin 角色才有权限执行。
SHOW CURRENT ROLES;
显示本用户的当前角色。
如果用户有 admin 角色,默认情况下,admin 角色不是当前角色。
所有的用户都能执行此命令。
SET ROLE (role_name|ALL|NONE);
如果设置了角色名,则指定的角色为当前角色。
ALL 代表拥有的所有角色。(当用户被赋予新的角色,用此命令可以刷新)。
设置为 NONE 代表去除所有角色。
如果用户不属于指定的角色,会报错。
SHOW ROLES;
显示系统所有角色。只有 admin 角色的用户才有权限执行此命令。
GRANT role_name [, role_name] ...
TO principal_specification [, principal_specification] ...
[ WITH ADMIN OPTION ];
principal_specification
: USER user
| ROLE role
把一个或多个角色赋给其他的角色或用户。
如果加上“WITH ADMIN OPTION” is specified, 那么得到这些权限的用户可以把此角色赋给其他角色或用户。
如果角色产生循环,会报错。
REVOKE [ADMIN OPTION FOR] role_name [, role_name] ...
FROM principal_specification [, principal_specification] ... ;
principal_specification
: USER user
| ROLE role
从用户或角色中去除某个角色。
如果加上 “REVOKE ADMIN OPTION FOR”,则仅去除" ADMIN OPTION", 拥有角色的用户还可以使用此角色的权限,但是不能把此角色赋给其他角色或用户。
SHOW ROLE GRANT (USER|ROLE) principal_name;
principal_name 可以是用户名或角色名。
当前任何用户可以执行此命令,以后版本可能改变。
显示谁分配了用户的角色。
0: jdbc:hive2://localhost:10000> GRANT role1 TO USER user1;
No rows affected (0.058 seconds)
0: jdbc:hive2://localhost:10000> SHOW ROLE GRANT USER user1;
+---------+---------------+----------------+----------+
| role | grant_option | grant_time | grantor |
+---------+---------------+----------------+----------+
| public | false | 0 | |
| role1 | false | 1398284083000 | uadmin |
+---------+---------------+----------------+----------+
SHOW PRINCIPALS role_name;
显示属于指定角色的其他角色和用户。只有 admin 角色才有权限执行此命令。
0: jdbc:hive2://localhost:10000> SHOW PRINCIPALS role1;
+-----------------+-----------------+---------------+----------+---------------+----------------+
| principal_name | principal_type | grant_option | grantor | grantor_type | grant_time |
+-----------------+-----------------+---------------+----------+---------------+----------------+
| role2 | ROLE | false | uadmin | USER | 1398285926000 |
| role3 | ROLE | true | uadmin | USER | 1398285946000 |
| user1 | USER | false | uadmin | USER | 1398285977000 |
+-----------------+-----------------+---------------+----------+---------------+----------------+
显示 role1 分配给角色 role2, role3 和用户 user1。
GRANT
priv_type [, priv_type ] ...
ON table_or_view_name
TO principal_specification [, principal_specification] ...
[WITH GRANT OPTION];
如果用户分配表或视图的权限有 “WITH GRANT OPTION”,此用户可以把此表或视图的权限分配给其他用户或角色。
REVOKE [GRANT OPTION FOR]
priv_type [, priv_type ] ...
ON table_or_view_name
FROM principal_specification [, principal_specification] ... ;
principal_specification
: USER user
| ROLE role
priv_type
: INSERT | SELECT | UPDATE | DELETE | ALL
Revoke 不能级联删除权限,如Postgres revoke documentation.
Examples:
0: jdbc:hive2://localhost:10000/default> grant select on table secured_table to role my_role;
No rows affected (0.046 seconds)
0: jdbc:hive2://localhost:10000/default> revoke update, select on table secured_table from role my_role;
No rows affected (0.028 seconds)
SHOW GRANT [principal_specification] ON (ALL | [TABLE] table_or_view_name);
principal_specification
: USER user
| ROLE role
当前所有用户都能执行此命令,为了可能改变。
0: jdbc:hive2://localhost:10000> show grant user ashutosh on table hivejiratable;
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| default | hivejiratable | | | ashutosh | USER | DELETE | false | 1398303419000 | thejas |
| default | hivejiratable | | | ashutosh | USER | SELECT | false | 1398303407000 | thejas |
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
0: jdbc:hive2://localhost:10000> show grant user ashutosh on all;
+-----------+-------------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+-------------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| default | hivecontributors | | | ashutosh | USER | DELETE | false | 1398303576000 | thejas |
| default | hivecontributors | | | ashutosh | USER | INSERT | false | 1398303576000 | thejas |
| default | hivecontributors | | | ashutosh | USER | SELECT | false | 1398303576000 | thejas |
| default | hivejiratable | | | ashutosh | USER | DELETE | false | 1398303419000 | thejas |
| default | hivejiratable | | | ashutosh | USER | SELECT | false | 1398303407000 | thejas |
+-----------+-------------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
0: jdbc:hive2://localhost:10000> show grant on table hivejiratable;
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| default | hivejiratable | | | ashutosh | USER | DELETE | false | 1398303419000 | thejas |
| default | hivejiratable | | | ashutosh | USER | SELECT | false | 1398303407000 | thejas |
| default | hivejiratable | | | navis | USER | INSERT | false | 1398303650000 | thejas |
| default | hivejiratable | | | navis | USER | SELECT | false | 1398303650000 | thejas |
| default | hivejiratable | | | public | ROLE | SELECT | false | 1398303481000 | thejas |
| default | hivejiratable | | | thejas | USER | DELETE | true | 1398303380000 | thejas |
| default | hivejiratable | | | thejas | USER | INSERT | true | 1398303380000 | thejas |
| default | hivejiratable | | | thejas | USER | SELECT | true | 1398303380000 | thejas |
| default | hivejiratable | | | thejas | USER | UPDATE | true | 1398303380000 | thejas |
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
Codes
Y: 需要的权限
Y + G: 需要 “WITH GRANT OPTION” 选项.
动作 | Select | Insert | Update | Delete | Ownership | Admin | URI Privilege (RWX Permission + Ownership) |
---|---|---|---|---|---|---|---|
CREATE TABLE | Y (of database) | Y (for create external table – the location) | |||||
DROP TABLE | Y | ||||||
DESCRIBE TABLE | Y | ||||||
SHOW PARTITIONS | Y | ||||||
ALTER TABLE LOCATION | Y | Y (for new location) | |||||
ALTER PARTITION LOCATION | Y | Y (for new partition location) | |||||
ALTER TABLE ADD PARTITION | Y | Y (for partition location) | |||||
ALTER TABLE DROP PARTITION | Y | ||||||
ALTER TABLE (all of them except the ones above) | Y | ||||||
TRUNCATE TABLE | Y | ||||||
CREATE VIEW | Y + G | ||||||
ALTER VIEW PROPERTIES | Y | ||||||
ALTER VIEW RENAME | Y | ||||||
DROP VIEW PROPERTIES | Y | ||||||
DROP VIEW | Y | ||||||
ANALYZE TABLE | Y | Y | |||||
SHOW COLUMNS | Y | ||||||
SHOW TABLE STATUS | Y | ||||||
SHOW TABLE PROPERTIES | Y | ||||||
CREATE TABLE AS SELECT | Y (of input) | Y (of database) | |||||
CREATE INDEX | Y (of table) | ||||||
DROP INDEX | Y | ||||||
ALTER INDEX REBUILD | Y | ||||||
ALTER INDEX PROPERTIES | Y | ||||||
SELECT | Y | ||||||
INSERT | Y | Y (for OVERWRITE) | |||||
UPDATE | Y | ||||||
DELETE | Y | ||||||
LOAD | Y (output) | Y (output) | Y (input location) | ||||
SHOW CREATE TABLE | Y+G | ||||||
CREATE FUNCTION | Y | ||||||
DROP FUNCTION | Y | ||||||
CREATE MACRO | Y | ||||||
DROP MACRO | Y | ||||||
MSCK (metastore check) | Y | ||||||
ALTER DATABASE | Y | ||||||
CREATE DATABASE | Y (if custom location specified) | ||||||
EXPLAIN | Y | ||||||
DROP DATABASE | Y |
Version Information
As of Hive 3.0.0 (HIVE-12408), Ownership is not required for the URI Privilege.
hive.server2.enable.doAs: false.
hive.users.in.admin.role: “,” 分割的 admin 用户列表
hive.security.metastore.authorization.manager 增加 org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly (可以配置一个逗号分割的列表,所以还可以配置 StorageBasedAuthorization parameter). 这项配置禁止远程 metastore。HiveServer2 可以配置使用内置 metastore,这样 HiveServer2 调用 内置的 metastore 认证 api。Hive cli 和其他远程 metastore 用户都被禁止。这限制了 metastore 和 HiveServer2 在同一个进程中。metastore 的数据库应当仅能 hiveserver 和 metastore 访问。
hive.security.authorization.manager:org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory. 保证通过 hive-cli 创建的任何表和视图都有 所有者的默认权限