假设我有一个用户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
的权限?
答案 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
更改较低级别的权限对较高级别没有影响,较高级别由较低级别继承。