• SQL Standard Based Hive Authorization(基于SQL标准的Hive授权)


     
    Hive 0.13版本之前的授权现状
     
    Hive默认授权(Default Hive Authorization (Legacy Mode))
     
    设计目的并不是为了防止恶意用户访问(操作)未经授权的数据;
     
    帮助用户避免一些意料之外的操作行为;
     
    授权机制并不完善,在很多指令方面都没有进行授权确认,比如授权指令Grant;
     
    授权确认发生在Hive SQL语句的编译阶段;
     
    允许用户执行dfs指令、用户自定义函数以及shell指令,这些特殊操作很有可能跳过客户端的安全机制;
     
    通过创建视图,并为视图进行授权(而不是为视图所依赖的表授权),从而提供细粒度的访问控制(仅可以访问表中的某几列)。
     
    基于存储的授权(Storage Based Authorization in the Metastore Server)
     
    通常用于Metastore Server API的授权;
     
    Hive 0.12.0版本之后开始支持;
     
    虽然能够保护Metastore中的元数据不被恶意用户破坏,但是没有提供细粒度的访问控制(列级别、行级别)
     
    基于SQL标准的Hive授权(SQL Standards Based Hive Authorization)
     
    基于SQL标准的Hive授权为Hive授权提供了第三个选择,它完全兼容SQL的授权模型,不会给现在的用户带来向后兼容的问题,因此被推荐使用。一旦用户迁移到这种更加安全的授权机制后,默认的授权机制可以被遗弃掉。
     
    基于SQL的授权模型可以和基于存储的授权模型(Hive Metastore Server)结合使用。
     
    和Hive的默认授权机制一样,授权确认发生的SQL语句的编译阶段。
     
    为了保证该授权模型起到安全作用,客户端同样需要安全保证,可以通过以下两种方式做到:
    (1)用户访问必须且仅可以通过HiveServer2;
    (2)限制用户代码和非SQL指令被执行。
     
    授权确认时是以提交SQL指令的用户身份为依据的,但SQL指令是以Hive Server用户身份(即Hive Server的进程用户)被执行的,因此Hive Server用户必须拥有相应目录(文件)的权限(根据SQL指令的不同,所需权限也不同)。
     
    尽可能与标准SQL保持一致,但具体实现时存在些许偏差。有一些是因为方便现有用户进行迁移(授权相关),另一些是出于方便使用的目的。
     
    在这种授权模型控制下,拥有权限使用Hive CLI、HDFS commands、Pig command line、'hadoop jar' 等工具(指令)的用户被称为特权用户。在一个组织(团队)内,仅仅一些需要执行ETL相关工作的团队需要这些特殊权限,这些工具的访问不经过HiveServer2,因此它们不受这种授权模型的控制。对于需要通过Hive CLI、Pig和MapReduce访问Hive表的用户,可以通过在Hive Metastore Server中启用Storage Based Authorization来进行相应的权限控制;其它情况则可能需要结合Hadoop的安全机制进行。
     
    大多数的用户(使用SQL语句,并通过ODBC/JDBC访问HiveServer2进行商业分析)是可以使用这种授权模型进行权限控制的。
     
    Hive指令和语句的限制
     
    当使用基于SQL标准的授权模型时,
     
    dfs、add、delete、compile、reset被禁用;
    transform clause被禁用。
     
    改变Hive配置的指令集合被限制为仅某些用户可以执行,可以通过hive.security.authorization.sqlstd.confwhitelist(hive-site.xml)进行配置。
     
    添加或删除函数、宏的权限被限制为仅具有admin角色的用户可以执行。
     
    为了用户可以使用(自定义)函数,创建永久函数(create permanent functions)的功能被添加。拥有角色admin的用户可以执行该指令添加函数,所有添加的函数可以被所有的用户使用。
     
    权限
     
    SELECT:赋予读取某个对象的权限;
     
    INSERT:赋予添加数据至某个对象(表)的权限;
     
    UPDATE:赋予在某个对象(表)上执行更新操作的权限;
     
    DELETE:赋予在某个对象(表)上删除数据的权限;
     
    ALL:赋予在某个对象上的所有权限(被转换成拥有上面四个权限)。
     
    对象
     
    权限被应用到表或者视图上,上面所描述的权限不支持应用于数据库上。
     
    数据库所有者被用来确认某些特殊操作的权限;
     
    Hive允许用户在SQL语句中使用URI,因此URI也是Hive的一种对象。上面所描述的权限不适用于URI对象。URI通常指向文件系统(HDFS)的一个文件或目录,授权是基于用户(提交SQL语句的用户,SQL语句中包含URI对象)在文件或目录上的权限进行的。
     
    对象所有者
     
    对于某些特殊操作,是否是该对象(表/视图/数据库)的对象所有者决定了是否有权限在该对象上执行这些特殊操作。
     
    用户创建表、视图或者数据库,该用户即成为所创建表、视图或者数据库的所有者。对于表或者视图来说,所有者拥有对它们进行操作的所有权限(SELECT、INSERT、UPDATE、DELETE)。
     
    数据库的所有者也可以是一个角色,可以通过“alter database”指令设置一个数据库的所有者为一个角色。
     
    用户和角色
     
    用户和角色均可以被赋予权限。
     
    用户可以属于一个或多个角色。
     
    有两个具有特殊意义的角色:public和admin。
     
    所有用户均属于角色public,我们使用该角色并通过grant语句将权限赋予给其它用户。
     
    当用户执行查询或指令的时候,用户被赋予的权限以及用户的“当前角色(可以为多个)”的权限被确认。“当前角色”可以通过”show current roles”进行查看。默认情况下,“当前角色”即为用户所属的所有角色(角色admin除外),我们可以通过指令“set role”指定某个角色成为“当前角色”。
     
    作为数据库管理员的用户通常被添加至角色admin。
     
    具有角色admin的用户可以执行额外的指令,如create role或者drop role。他们也有访问对象的全部权限,即使他们并没有被显式授权。因为角色admin默认不属于“当前角色”,一个属于角色admin的用户要想得到角色admin的权限,必须通过指令set role先将“当前角色”切换至角色admin。
     
    用户(角色)名称
     
    角色名称大小写不敏感。
     
    用户名称大小写敏感。
     
    带引号的标识符(Quoted Identifiers)
     
    一般情况下不建议使用,忽略此小节。
     
    角色管理指令
     
    Create Role
     
    CREATE ROLE role_name;
     
    仅仅角色admin具有该权限。角色名称ALL、DEFAULT和NONE被保留。
     
    Drop Role
     
    DROP ROLE role_name;
     
    仅仅角色admin具有该权限。
     
    Show Current Roles
     
    SHOW CURRENT ROLES;
     
    显示用户的“当前角色”列表。
     
    判断用户权限时涉及两个方面:
     
    用户是否被赋予相应权限;
    用户所属角色(可能为多个)是否被赋予相应权限。
     
    默认“当前角色”包含用户所属的所有角色,但角色admin除外,即使该用户属于角色admin。
     
    所有用户均可以执行该指令。
     
    Set Role
     
    SET ROLE (role_name|ALL);
     
    如果role_name被指定,则角色role_name成为“当前角色”中的唯一角色。
     
    如果指定role_name为ALL,则会刷新“当前角色”列表,用于用户被赋予新的角色时使用。
     
    如果用户并不属于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
     
    从指定的用户或角色中回收指定的角色。
     
    Show Role Grant
     
    SHOW ROLE GRANT (USER|ROLE) principal_name;
     
    principal_name为用户或角色名称。
     
    列出指定用户或角色被赋予的角色列表。
     
    所有用户均可以执行该指令。
     
    Show Principals
     
    SHOW PRINCIPALS role_name;
     
    列出属于指定角色的所有角色和用户。
     
    仅仅角色admin具有该权限。
     
    管理对象权限
     
    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”,则该用户可以将得到的某表/视图的权限赋予/回收给其它用户或角色。
     
    注意:回收权限时,CASCADE在当前版本中是不被支持的,即仅能回收指定用户或角色的权限,通过这些用户或角色赋予出去的权限则没有被回收。
     
    Show Grant
     
    SHOW GRANT [principal_name] ON (ALL| ([TABLE] table_or_view_name)
     
    principal_name为用户或角色名称。
     
     
    附:Hive操作权限列表  

    Codes

    Y:  Privilege required.

    Y + G:  Privilege "WITH GRANT OPTION" required.

    Action Select Insert Update Delete Ownership Admin URI Privilege (RWX Permission + Ownership)
    CREATE TABLE         Y (of database)   Y  (for create external table – the location)
    DROP TABLE         Y    
    DESCRIBE TABLE Y            
    SHOW PARTITIONS Y            
    ALTER TABLE LOCATION         Y   Y (for new location)
    ALTER PARTITION LOCATION         Y   Y (for new partition location)
    ALTER TABLE ADD PARTITION   Y         Y (for partition location)
    ALTER TABLE DROP PARTITION       Y      
    ALTER TABLE (all of them except the ones above)         Y    
    TRUNCATE TABLE         Y    
    CREATE VIEW Y + G            
    ALTER VIEW PROPERTIES         Y    
    ALTER VIEW RENAME         Y    
    DROP VIEW PROPERTIES         Y    
    DROP VIEW         Y    
    ANALYZE TABLE Y Y          
    SHOW COLUMNS Y            
    SHOW TABLE STATUS Y            
    SHOW TABLE PROPERTIES Y            
    CREATE TABLE AS SELECT Y (of input)       Y (of database)    
    CREATE INDEX         Y (of table)    
    DROP INDEX         Y    
    ALTER INDEX REBUILD         Y    
    ALTER INDEX PROPERTIES         Y    
    SELECT Y            
    INSERT   Y   Y (for OVERWRITE)      
    UPDATE     Y        
    DELETE       Y      
    LOAD   Y (output)   Y (output)     Y (input location)
    SHOW CREATE TABLE Y+G            
    CREATE FUNCTION           Y  
    DROP FUNCTION           Y  
    CREATE MACRO           Y  
    DROP MACRO           Y  
    MSCK (metastore check)           Y  
    ALTER DATABASE           Y  
    CREATE DATABASE             Y (if custom location specified)
    EXPLAIN Y            
    DROP DATABASE         Y    
     
  • 相关阅读:
    块编程指南
    libxml2:Debug模式可以编译,Distribution下不可以?
    CIO应该考虑的九个外包神话和现实
    【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
    自定义 UITableViewCell 的 accessory 样式
    提升UNIX安全性的Unix SSH示例配置
    java 跟.net webservice 互通问题
    外包合同中降低成本的战略性技巧
    get post
    Android SAX API: XmlResourceParser及其扩展应用
  • 原文地址:https://www.cnblogs.com/yurunmiao/p/4441735.html
Copyright © 2020-2023  润新知