Hive 0.13 之前的 Hive 授权状态

Hive 中的默认授权并非旨在防止恶意用户访问他们不应该访问的数据。它仅有助于防止用户意外执行他们不应该执行的操作。它也是不完整的,因为它没有对许多操作(包括 Grant 语句)进行授权检查。授权检查在 Hive 查询编译期间进行。但是,由于允许用户执行 dfs 命令,用户定义的函数和 shell 命令,因此可以绕过 Client 端安全检查。

Hive 还支持基于存储的授权,该授权通常用于向 Metastore Server API 调用添加授权(请参见Metastore Server 中基于存储的授权)。从 Hive 0.12.0 开始,它也可以在 Client 端使用。尽管它可以保护元存储库免受恶意用户的更改,但它不支持细粒度的访问控制(列或行级别)。

Hive 中的默认授权模型可通过创建视图并授予对视图(而非基础表)的访问权限来提供细粒度的访问控制。

基于 SQL 标准的 Hive 授权(Hive 0.13 中的新增功能)

基于 SQL 标准的授权选项(在 Hive 0.13 中引入)为 Hive 中的授权提供了第三种选择。推荐这样做是因为它允许 Hive 在其授权模型中完全兼容 SQL,而不会引起当前用户的向后兼容性问题。当用户迁移到此更安全的模型时,可能会弃用当前的默认授权。

有关此授权选项的概述,请参见HiveServer2 中基于 SQL 标准的授权

此授权模式可以与 Metastore 服务器上的基于存储的授权结合使用。像 Hive 中当前的默认授权一样,这也将在查询编译时强制执行。为了通过此选项提供安全性,必须保护 Client 端的安全。这可以通过仅允许用户通过 Hive Server2 进行访问以及限制用户代码和可以运行的非 SQL 命令来完成。将针对提交请求的用户进行检查,但查询将以 Hive 服务器用户身份运行。Importing 数据的目录和文件对此 Hive 服务器用户具有读取访问权限。对于不需要防御恶意用户的用户,也可以通过 Hive 命令行来支持。

这项工作的目标是尽可能地遵守 SQL 标准,但是在实现中与标准存在偏差。为了使现有的 Hive 用户更容易迁移到此授权模型,进行了一些更改,而某些更改则考虑了易用性(在这种情况下,我们还研究了许多广泛使用的数据库的功能)。

在此授权模型下,有权访问 Hive CLI,HDFS 命令,Pig 命令行,“ hadoop jar”命令等的用户被视为特权用户。在组织中,通常只有负责ETL个工作负载的团队需要这种访问权限。这些工具无法通过 HiveServer2 访问数据,因此,未经此模型授权它们的访问。对于 Hive CLI,Pig 和 MapReduce 用户,可以使用 metastore 服务器上启用的基于存储的授权来控制对 Hive 表的访问。

大多数用户(例如业务分析师)倾向于通过 HiveServer2 使用 SQL 和 ODBC/JDBC,并且可以使用此授权模型来控制其访问。

对 Hive 命令和语句的限制

启用此授权后,将禁用 dfs,add,delete,compile 和 reset 等命令。

用于更改 Hive 配置的 set 命令仅限于较小的安全设置。这是使用hive.security.authorization.sqlstd.confwhitelist配置参数控制的。如果需要自定义此设置,则 HiveServer2Management 员可以在其 hive-site.xml 中为此配置参数设置一个值。

添加或删除函数和宏的特权仅限于 admin 角色。

为了使用户能够使用功能,已添加了创建permanent functions的功能。具有 admin 角色的用户可以运行命令来创建这些功能,然后所有用户都可以使用这些功能。

启用此授权后,Hive transform clause也会被禁用。

Privileges

●SELECT 特权–授予对对象的读取访问权限。

●INSERT 特权–提供将数据添加到对象(表)的能力。

●UPDATE 特权–提供对对象(表)运行更新查询的能力。

●DELETE 特权–提供删除对象(表)中数据的功能。

●ALL PRIVILEGES –授予所有特权(将其转换为以上所有特权)。

Objects

  • 特权适用于表和视图。数据库不支持上述特权。

  • 对某些操作考虑数据库所有权。

  • URI 是 Hive 中的另一个对象,因为 Hive 允许在 SQL 语法中使用 URI。以上特权不适用于 URI 对象。预期所使用的 URI 指向文件系统中的文件/目录。授权是根据用户对文件/目录的权限来完成的。

Object Ownership

对于某些操作,对象(表/视图/数据库)的所有权确定您是否有权执行该操作。

创建表,视图或数据库的用户将成为其所有者。对于表和视图,所有者通过授予选项获得所有特权。

角色也可以是数据库的所有者。 “ alter database”命令可用于将数据库的所有者设置为角色。

用户和角色

特权可以授予用户以及角色。
用户可以属于一个或多个角色。

有两个具有特殊含义的角色- publicadmin
所有用户都属于“ public”角色。您可以在 Grant 语句中使用此角色向所有用户授予特权。

当用户运行 Hive 查询或命令时,将检查授予用户及其“ *当前角色 *”的特权。使用“ show current roles;”命令可以看到当前角色。尽管 admin 角色以外的所有用户角色都将默认为当前角色,尽管您可以使用“ set role”命令将特定角色设置为当前角色。有关详细信息,请参见命令描述。

负责数据库 Management 员工作的用户应被添加为 admin 角色。
他们具有运行其他命令(例如“ create role”和“ drop role”)的特权。他们还可以访问未获得明确访问权限的对象。但是,属于 admin 角色的用户需要先获得“ set role”命令,然后才能获得 admin 角色的特权,因为默认情况下该角色不在当前角色中。

用户名和角色

角色名称不区分大小写。也就是说,“营销”和“ MarkEting”指的是相同的角色。

用户名区分大小写。这是因为与角色名称不同,用户名不在 Hive 中 Management。该用户可以是 hiveserver2 身份验证模式支持的任何用户。

Quoted Identifiers

当配置参数hive.support.quoted.identifiers设置为column(默认值)时,用户名和角色名可以可选地用反引号(+27++28+`时,用户名和角色名中仅允许使用字母数字和下划线字符。

有关详细信息,请参见HIVE-6013列名称中支持带引号的标识符

Hive 0.14开始,用户可能会被反引号(``+35+`设置无关。

角色 Management 命令

Create Role

CREATE ROLE role_name;

创建一个新角色。只有 admin 角色对此具有特权。

角色名称 ALL,DEFAULT 和 NONE 被保留。

Drop Role

DROP ROLE role_name;

放弃给定角色。只有 admin 角色对此具有特权。

显示当前角色

SHOW CURRENT ROLES;

显示用户的current roles的列表。通过查看用户的特权和用户的所有当前角色,可以授权用户的所有操作。

当前的默认角色具有该用户的所有角色,但 admin 角色除外(即使该用户也属于 admin 角色)。

任何用户都可以运行此命令。

Set Role

SET ROLE (role_name|ALL|NONE);

如果指定了 role_name,则该角色将成为当前角色中的唯一角色。

将 role_name 设置为 ALL 将刷新当前角色的列表(以防将新角色授予用户)并将其设置为默认角色列表。

将 role_name 设置为 NONE 将从当前用户中删除所有当前角色。 (它是在HIVE-11780中引入的,并将包含在即将发布的 1.3.0 和 1.2.2 版本中。)

如果将用户不属于的角色指定为 role_name,将导致错误。

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”,则用户将获得将角色授予其他用户/角色的特权。

如果 Grant 语句最终在角色之间创建循环关系,则该命令将失败并显示错误。

Revoke Role

REVOKE [ADMIN OPTION FOR] role_name [, role_name] ...
FROM principal_specification [, principal_specification] ... ;

principal_specification
  : USER user
  | ROLE role

在 FROM 子句中从用户/角色撤消角色的成员资格。

从 Hive 0.14.0 开始,可以使用 REVOKE ADMIN OPTION FOR<role>(HIVE-6252)来撤销 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

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  |
+-----------------+-----------------+---------------+----------+---------------+----------------+

Management 对象特权

对象特权命令

Grant

GRANT
    priv_type [, priv_type ] ...
    ON table_or_view_name
    TO principal_specification [, principal_specification] ...
    [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

如果授予用户对表或视图的 WITH GRANT OPTION 特权,则该用户还可以授予/撤消其他用户的特权以及这些对象上的角色。从 Hive 0.14.0 开始,可以通过使用 REVOKE GRANT OPTION FOR<privilege>(HIVE-7404)来删除特权的授予选项,同时仍然保留特权。

请注意,在使用 REVOKE 语句的情况下,当前不支持 CASCADE 的 DROP-BEHAVIOR 选项(在 SQL 标准中)。因此,revoke 语句不会删除任何从属特权。有关 CASCADE 行为的详细信息,可以检查Postgres 撤销文档

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)

请注意,在 Hive 中,与标准 SQL 不同,必须在 principal_specification 中指定 USER 或 ROLE。

Show Grant

SHOW GRANT [principal_specification] ON (ALL | [TABLE] table_or_view_name);

principal_specification
  : USER user
  | ROLE role

当前,任何用户都可以运行此命令。但这在将来可能会改变,以允许用户仅查看自己的特权,并且需要其他特权才能查看其他用户的特权。

Management 对象特权的示例

找出用户 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   |
+-----------+----------------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+

配置单元操作所需的特权

Codes

Y:需要特权。

是:要求特权“有授予选项”。

ActionSelectInsertUpdateDeleteOwnershipAdminURI 特权(RWX 权限所有权)
CREATE TABLE Y(数据库的) Y(用于创建外部表–位置)
DROP TABLE Y
DESCRIBE TABLEY
SHOW PARTITIONSY
更改表的位置 Y Y(对于新位置)
更改分区位置 Y Y(用于新分区位置)
更改表添加分区 Y Y(用于分区位置)
更改表分区 Y
ALTER TABLE(除上述以外的所有表) Y
TRUNCATE TABLE Y
CREATE VIEWG
更改视图属性 Y
更改视图重命名 Y
拖放视图属性 Y
DROP VIEW Y
ANALYZE TABLEYY
SHOW COLUMNSY
显示表格状态Y
显示表属性Y
创建表作为选择Y(Importing) Y(数据库的)
CREATE INDEX Y(表的)
DROP INDEX Y
改建索引 Y
ALTER INDEX 属性 Y
SELECTY
INSERT Y Y(用于覆盖)
UPDATE Y
DELETE Y
LOAD Y (output) Y (output) Y(Importing 位置)
显示创建表Y+G
CREATE FUNCTION Y
DROP FUNCTION Y
CREATE MACRO Y
DROP MACRO Y
MSCK(元存储检查) Y
ALTER DATABASE Y
CREATE DATABASE Y(如果指定了自定义位置)
EXPLAINY
DROP DATABASE Y

Version Information

从 Hive 3.0.0(HIVE-12408)开始,URI 特权不需要所有权。

Configuration

对于 Hive 0.13.x

在 hive-site.xml 中设置以下内容:

  • hive.server2.enable.doAs 为 false。

  • hive.users.in.admin.role 到需要以 admin 角色添加的逗号分隔用户列表。请注意,属于 admin 角色的用户需要先获得“ set 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 角色的逗号分隔用户列表。请注意,属于 admin 角色的用户需要先获得“ set role”命令,然后才能获得 admin 角色的权限,因为默认情况下该角色不在当前角色中。

  • 将 org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly 添加到 hive.security.metastore.authorization.manager 中。 (它使用逗号分隔的列表,因此,如果您也想启用它,则可以将其与 StorageBasedAuthorization 参数一起添加)。
    此设置不允许在远程元存储中调用任何授权 api 调用。可以将 HiveServer2 配置为使用嵌入式 metastore,这将使其能够调用 metastore 授权 api。 Hive cli 和任何其他远程 metastore 用户在尝试进行授权 api 调用时将被拒绝授权。这将授权 api 限制为特权 HiveServer2 进程。您还应该确保对 metastore rdbms 的访问仅限于 metastore 服务器和 hiverserver2.

  • 对 org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory 的“ hive.security.authorization.manager”。这将确保 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=' '

Known Issues

Hive 0.13

HIVE-6985 – SQL std auth-授予公共角色的特权未得到尊重

HIVE-6919 –分区表上的 Hive sql std auth select 查询失败

HIVE-6921 –索引创建失败,并且打开了 SQL std auth

HIVE-6957 – SQL 授权不适用于 HS2 二进制模式和 Kerberos 身份验证

CVE-2014-0228-Export/import 声明未经授权。

Hive 0.13.1

上面在 Hive 0.13.0 下提到的已知问题已在 0.13.1 版本中修复。

References

有关 SQL 安全性标准的信息,请参见:

  • ISO 9075 第 1 部分框架第 4.2.6 节(角色),4.6.11 节(特权)

  • ISO 9075 第 2 部分基础第 4.35 节(基本安全模型)和第 12 节(访问控制)

Troubleshooting

*问题: *我的用户名位于 hive-site.xml 的 hive.users.in.admin.role 中,但仍然收到用户不是 admin 的错误。有什么事吗

*执行以下操作: *确保已在配置更改后重新启动了 HiveServer2,并且已按照上面Configuration的说明使用了 HiveServer2 命令行选项。

*执行此操作: *确保已运行“ set role admin;”命令以获取 admin 角色。