Sentry权限模型:Sentry可以从服务器权限中获取数据库权限吗?

时间:2016-12-06 03:41:44

标签: apache-sentry

假设我有一个用户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;

priveleges仍然是相同的。

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

Sentry是否应该从数据库testdb获取远离服务器server1的权限?

1 个答案:

答案 0 :(得分:2)

不,Sentry权限模型是分层的,如documentation

中所述
  

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

特权总是积极的,而不是消极的 - 默认情况下你从零开始,并添加特权。

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

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

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

然后我们可以在数据库级别添加更细粒度的权限,例如INSERT数据库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

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