0

假设我有一个用户jack和一个组datateam。用户jack属于组datateam

使用 Sentry 进行授权。

create role admin; 
grant role admin to group datateam; 
grant all on server server1 to role admin;

现在该角色admin具有以下特权。

+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| database  | table  | partition  | column  | principal_name  | principal_type  | privilege  | grant_option  |    grant_time     | grantor  |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| *         |        |            |         | admin           | ROLE            | *          | false         | 1480985013185000  | --       |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+

假设我有这个数据库。

create database testdb;

这是成功的。用户jack创建了一个数据库testdb

使用 Sentry 撤销testdb;

revoke all on database `testdb` from role admin;

特权还是一样的。

+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| database  | table  | partition  | column  | principal_name  | principal_type  | privilege  | grant_option  |    grant_time     | grantor  |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| *         |        |            |         | admin           | ROLE            | *          | false         | 1480985013185000  | --       |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+

Sentry 不应该将数据库的权限testdb从服务器上拿走server1吗?

4

1 回答 1

2

不,Sentry 权限模型是分层的,如文档中所述:

可以对 Hive 仓库中的不同对象授予权限。可以授予的任何特权都与对象层次结构中的级别相关联。如果在层次结构中的容器对象上授予特权,则基础对象会自动继承它。例如,如果用户在数据库范围内拥有所有权限,那么他对包含在该范围内的所有基础对象都拥有所有权限。

特权总是积极的,而不是消极的——默认情况下你从无到有,然后添加特权。

因此,如果您在层次结构中的较高级别(例如服务器)具有特权,则您无法从较低级别(例如数据库)的此特权中获得任何东西。您只能在较低级别添加更细粒度的权限。

具体示例:假设我们有一个服务器,当前有两个数据库,A 和 B。在服务器级别授予的任何权限都将应用于 A 和 B,以及创建的任何新数据库。假设我们在服务器级别授予 SELECT:

   Server-level    Database-level   Result
A  SELECT          -                SELECT
B  SELECT          -                SELECT   

然后我们可以在数据库级别添加更细粒度的权限,例如在数据库 B 上插入:

   Server-level    Database-level   Result
A  SELECT          -                SELECT
B  SELECT          INSERT           SELECT,INSERT   

然后,如果我们撤销数据库 B 上的所有数据库级权限,我们又回到了开始的地方:

   Server-level    Database-level   Result
A  SELECT          -                SELECT
B  SELECT          -                SELECT

更改较低级别的权限对较高级别没有影响,较高级别由较低级别继承。

于 2017-04-13T21:08:56.517 回答