【问题标题】:Sentry privileges model: Can Sentry take a database privileges away from a server privileges?Sentry 权限模型:Sentry 可以从服务器权限中获取数据库权限吗?
【发布时间】:2016-12-06 03:41:44
【问题描述】:

假设我有一个用户 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 中拿走吗?

【问题讨论】:

    标签: apache-sentry


    【解决方案1】:

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

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

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

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

    具体示例:假设我们的服务器当前有两个数据库,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
    

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

    【讨论】:

    • 如果您有一个包含很多列的表(即 100 列,-在大数据世界中很常见-)并且您想删除少数几个的选择权限,这显然是非常不切实际的模型列(如 2 列)。然后您需要指定 98 列权限,因为权限不是负数。您不能在表格上指定选择并仅在几列上撤销选择。这怎么可能有意义?
    • 是的,这种用法很不方便!可能会授予对所有列 (*) 的访问权限,然后只撤销一些特定列,但我没有尝试过,我在文档中看不到任何此类用法。否则看起来你只需要列出所有 100 列,或者将数据拆分为多个表(具有不同的权限)并在需要的地方加入它们。
    • 我期待 * 可以工作,但实际上它不受支持,因为它返回语法错误。有这个限制并查看 5 年前最后一次提交的 Github 存储库让我觉得没有人在使用 Sentry。
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2016-05-28
    • 2014-05-29
    • 2020-07-02
    相关资源
    最近更新 更多