SQL Standard Based Hive Authorization(基于SQL标准的Hive授权)

Hive 0.13 之前的权限管理

Hive 默认的权限不是为了防止恶意用户访问隐私数据。它仅能防止用户不经意的错误操作。它本身是不完整的,包括执行 grant 语句之内的很多操作,没有授权检查。在查询编译阶段进行权限检查。但是允许用户执行 dfs 命令,用户自定义函数和 shell 命令,这些命令可能跳过权限检查。

Hive 还支持基于存储的权限,在 metastore 服务 API 中添加的权限检查。在 Hive 0.12 之后,也可以在客户端使用。可以保护 metastore 不被恶意用户修改,但不能支持行级或列级的细粒度访问控制。

为了实现细粒度的访问控制,默认权限模型通过创建视图,并且把视图而不是把底层的表分配给用户。

SQL 标准的 Hive 权限(Hive-0.13 引入)

SQL 标准的 Hive 权限模型为 Hive 提供了第 3 方选项。因为它完全兼容 SQL 权限模型,不会为当前用户带来兼容问题。

本权限模型可以和 metastore 上的基于存储的权限模型配合使用。和当前默认的权限模型一样,在查询编译阶段判断权限。用户通过 Hive Server2 访问,并且限制用户代码和非 SQL 命令,这套权限才能起到相应的作用。通过启动 Hive Server 的用户访问数据所在的目录和文件。如果用户不需要防止恶意用户访问,可以允许通过 Hive 命令行访问这些目录和文件。

在本权限模型下,可以执行 Hive Cli,HDFS 和 hadoop jar 命令的用户,都认为是特权用户。这些工具访问数据不通过 Hive Server2,所以本权限模型不起作用。可以通过 metastore 上基于存储的权限模型控制这些访问。

像商业分析人员倾向于通过 SQL 查询数据,通过 ODBC/JDBC 连接 HiveServer2,他们的访问可以使用本模型控制。

Hive 命令和一些语句的限制

当启用本模型时,如 dfs, add, delete, compile, and reset 命令都被禁止执行。

set 命令仅能修改一个较小的参数集合。可以修改的参数通过参数 hive.security.authorization.sqlstd.confwhitelist 控制。

仅 admin 角色可以增加或删除函数和宏。

为了使用户使用函数,可以创建持久函数。admin 角色的用户可以创建这些函数,其他用户可以使用。

当权限开启的时候,禁止使用 Hive transform 语句。

权限列表

● SELECT 权限 – 可以读一个对象的权限

● INSERT 权限 – 可以增加数据到一个对象(表)

● UPDATE 权限 – 可以在对象(表)上执行 update 操作

● DELETE 权限 – 可以在对象(表)上执行 delete 操作

● ALL 权限 – 所有的上述权限

对象( Objects)

权限适用于表和视图。上述权限不支持在数据库级别设置。

一些操作会考虑是否是数据库的所有者。

URI 是另一种对象。上述权限也不适用于 URI 对象。URI 用来指向文件系统中的文件和目录。在 URI 上的权限检查基于用户在文件和目录上的权限。

对象所有者(Object Ownership)

对于某些操作,对象所有者(表/视图/数据库)决定了是否可以执行。

创建表、视图或数据库的用户成为它们的所有者。创建表和视图的所有者,拥有对其他用户赋权的能力。

角色可以是数据库的所有者。使用 alter database 命令可以把数据的拥有者改为一个角色。

用户和角色(Users and Roles)

权限可以赋给用户或角色。
一个用户可以属于多个角色。

public 和 admin 角色有特殊的意义:所有的用户都属于 public 角色。如果给 public 角色赋权限,则是向所有用户赋权限。

当用户执行 Hive 查询或命令时,检查赋给当前用户和他当前的角色(可以多个)的权限。当前的角色可以用 current roles 查看。除了 admin 角色的所有其他角色默认为当前角色。通过 set role 命令可以改变当前角色。

数据库管理员可以是 admin 角色。他们有权限执行一些特殊的命令,如 create ruoedrop role。对于没有赋给 admin 角色的对象,他们也能访问。用户如果想变为 admin 角色,需要执行 set role admin命令。

用户和角色的名称(Names of Users and Roles)

角色名大小写不敏感。“marketing” 和 “MarkEting” 是同一个角色。
用户名大小写敏感。因为用户名不是 Hive 管理的。用户可能是 hiveserver2 认证模型支持的任何用户。

引用标识符(Quoted Identifiers)

Hive 0.14 之后,角色名和用户名可以用 (`)括起来,中间可以用任何 Unicode 编码的字符。

角色管理命令

创建角色 – Create Role

CREATE ROLE role_name;

创建新的角色。只有 admin 角色才有权限执行。 ALL, DEFAULT 和 NONE 这 3 个角色名已经作为系统保留,普通用户不能创建。

删除角色 – Drop Role

DROP ROLE role_name;

只有 admin 角色才有权限执行。

显示当前角色 – Show Current Roles

SHOW CURRENT ROLES;

显示本用户的当前角色。

如果用户有 admin 角色,默认情况下,admin 角色不是当前角色。

所有的用户都能执行此命令。

Set Role

SET ROLE (role_name|ALL|NONE);

如果设置了角色名,则指定的角色为当前角色。

ALL 代表拥有的所有角色。(当用户被赋予新的角色,用此命令可以刷新)。

设置为 NONE 代表去除所有角色。

如果用户不属于指定的角色,会报错。

显示系统所有角色 – Show Roles

SHOW ROLES;

显示系统所有角色。只有 admin 角色的用户才有权限执行此命令。

Grant Role

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 Role

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

SHOW ROLE GRANT (USER|ROLE) principal_name;

principal_name 可以是用户名或角色名。

当前任何用户可以执行此命令,以后版本可能改变。

Show Role Grant 示例

显示谁分配了用户的角色。

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

SHOW PRINCIPALS role_name;

显示属于指定角色的其他角色和用户。只有 admin 角色才有权限执行此命令。

Show Principals 示例
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

GRANT
    priv_type [, priv_type ] ...
    ON table_or_view_name
    TO principal_specification [, principal_specification] ...
    [WITH GRANT OPTION];

如果用户分配表或视图的权限有 “WITH GRANT OPTION”,此用户可以把此表或视图的权限分配给其他用户或角色。

撤销 – Revoke

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

SHOW GRANT [principal_specification] ON (ALL | [TABLE] table_or_view_name);
  
principal_specification
  : USER user
  | ROLE role

当前所有用户都能执行此命令,为了可能改变。

管理用户权限示例

  • 找出用户 ashutosh 拥有表 hivejiratable 的权限。
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   |
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
  • 显示 用户 ashutosh 在所有对象上的权限:
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   |
+-----------+-------------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
  • 显示所有用户或角色有表 hivejiratable 的权限。
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   |
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+

Hive 操作需要的权限

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 0.13.x

在 hive-site.xml 设置以下参数:
  • hive.server2.enable.doAs: false.
  • hive.users.in.admin.role: 有 admin 角色的用户
启动 HiveServer2 时,加上以下参数
  • -hiveconf hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory
  • -hiveconf hive.security.authorization.enabled=true
  • -hiveconf hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator
  • -hiveconf hive.metastore.uris=’ ’

Hive 0.14 及以后

在 hive-site.xml 设置以下参数:
  • 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 创建的任何表和视图都有 所有者的默认权限

hiveserver2-site.xml 配置:
  • hive.security.authorization.manager:org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory
  • hive.security.authorization.enabled: true
  • hive.security.authenticator.manager: org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator
  • hive.metastore.uris=’ ’ // 使用内置的metastore

你可能感兴趣的:(hive,sql,hive,数据库)