Hadoop安全架构

安全1.png

客户端访问安全控制(Client access security control)

knox-services.png
Apache Knox Gateway是一款用于保护Hadoop生态体系安全的代理网关系统,为Hadoop集群提供唯一的代理入口。Knox以类似反向代理的形式挡在你的前面,隐匿部署细节(例如端口号和机器名等),接管所有用户的HTTP请求(例如WEB UI控制台访问和RESTful服务调用),以此来保护集群安全。不仅如此,Knox还能担任认证网关的角色。(详情请参考:http://knox.apache.org)

面向数据的访问控制(Access control for data)

data_distribution.png
Apache Accumulo的是一个高度可扩展的结构化存储,基于谷歌的BigTable。Accumulo是用Java编写的,并在Hadoop分布式文件系统(HDFS),这是流行的Apache Hadoop项目的一部分工作。Accumulo支持高效存储和检索的结构化数据,包括查询范围,并提供支持使用Accumulo表作为输入和输出的MapReduce作业。Accumulo设有自动负载平衡和分区,数据压缩和细粒度的安全标签。(详情请参考:https://accumulo.apache.org)

Hive权限控制

Hive支持简单的权限管理,默认情况下是不开启,这样所有的用户都具有相同的权限,同时也是超级管理员,也就对hive中的所有表都有查看和改动的权利,这样是不符合一般数据仓库的安全原则的。当前Hive支持三种授权模型以满足不同的应用场景。

应用场景

下面关于Hive的应用场景是比较常见的。

  1. hive作为一个表存储层,作为Hive HCatalog API 的用户就是这种场景,如Apache Pig,MapReduce和一些强大的并行处理数据库(Cloudera Impala, Facebook Presto, Spark SQL、Flink等等)。这种场景中,hive为在存储中(通常是HDFS)的文件提供了一个表抽象和元数据。这些用户能够直接访问HDFS和metastore服务(该服务提供了一个访问元数据的API)。HDFS的访问权限控制是通过HDFS的权限管理机制实现的。而元数据的访问控制则需要由hive的配置来完成。
  2. Hive作为一个SQL查询引擎。这是hive最常用的场景。这是SQL用户和BI工具的’Hive view’,这种场景又可以分为如下两类:

a. Hive 命令行用户:这类用户可以直接访问HDFS和Hive metastore服务,这类场景类似于上面第一种场景。需要说明的是,Hive CLI这种方式已经被官方舍弃,由beeline取代。
b.ODBC/JDBC 和其他 HiveServer2 API 用户(比如beeline),这类用户对于所有数据和元数据的访问都是通过HiveServer2来完成的。他们不会直接访问HDFS或者metastore服务。

授权模型概览

基于存储的授权模型

Storage Based Authorization in the Metastore Server(SBA),通常用于Metastore Server API的授权;上面的应用场景1和2a中,用户可以直接访问数据。Hive的配置将无法控制对数据的访问,HDFS的权限对表存储的访问就是一个事实的来源。通过启用SBA,就可以使用一个单一的来源并拥有一个一致性的数据和元数据授权策略模型。为了控制在元数据对象如数据库、表、分区上对元数据的访问,当你去访问这些对象在文件系统中对应的目录时将会检查权限。通过确保查询是由最终用户 (需要将配置项hive.server2.enable.doAs设置为true,这也是其默认值)来运行,可以保护通过HiveServer2(上面的场景2b)进行的访问。
注意,通过使用HDFS ACL,在对文件系统的访问控制上我们会有很大的灵活性,相应的在SBA模型中也就会提供更多的灵活性了。该特性已经在Hive0.14中可用了。

基于SQL标准的授权模型

SQL Standards Based Authorization in HiveServer2(SSBA),尽管SBA模型在数据库、表和分区层面可以提供访问控制,但是还无法在更精细的层面如列和视图提供权限控制,因为它的控制是通过对文件系统的目录和文件的访问控制来实现的,一个良好的授权访问控制模型的必要条件就是它能够提供用户需要访问的列和行的权限控制。而文件系统级别的访问控制只能提供对整个文件的控制,HiveServer2满足这个条件,因为它有一个理解(通过使用SQL)行和列的API,它能够提供你的SQL查询所需要的对列和行访问的最小权限。
SSBA(在Hive0.13中引入,HIVE-5837)的使用能够提供细粒度的访问控制,它是基于SQL标准来进行授权的,使用类似于 grant/revoke 的语句来控制访问。通过HiveServer2的配置可以使用这个授权模型。
注意,对于上面提到的2a场景(HIVE CLI),SSBA是无法使用的。因为Hive CLI是直接访问HDFS的,用户可以非常容易越过SSBA的检查,甚至完全可以禁用它。禁用此功能可避免给用户带来错误的安全性。因此在生产环境中,为了提高整个环境的安全性,我们应该尽量使用HiveServer2服务。

默认授权模型

Hive Default Authorization(Hive2.0.0之前的默认模型),默认授权模式是Hive早期版本中使用的一种授权模型。这种授权模型并不能完全的控制访问,有很多没有解决的安全漏洞。比如,没有定义授予用户权限所需的权限,任何用户都能够给他们自己授权来访问一个表或者数据库。
这个模型类似于SSBA模型,他们都使用了grant/revoke语句进行访问控制。但是它的控制策略是不同于SSBA的,而且他们互相也不兼容。这种模型是支持Hive CLI的,但是对于Hive CLI这不是一种安全的授权模型。

扩展授权模式

Apache Ranger 和 Apache Sentry 都是Apache中的项目,他们通过使用hive提供的插件进行授权管理。通过使用他们可以获得更多的功能,比如,使用Ranger可以通过web的方式查看和管理策略,查看审计信息,基于运行时的特性可以动态的控制行和列的访问控制(包括column masking)。
总结:
对于metadata API 的调用(Hive MetaStore服务)使用SBA模型,同时在HiveServer2中使用SSBA模型。需要进一步加强权限控制功能可以考虑使用第三方工具(Apache Ranger 和 Apache Sentry )。

Hive权限说明

HIVE支持以下权限:

权限名称 含义
ALL 所有权限
ALTER 允许修改元数据(modify metadata data of object)—-表信息数据
UPDATE 允许修改物理数据(modify physical data of object)—-实际数据
CREATE 允许进行Create操作
DROP 允许进行DROP操作
INDEX 允许建索引(目前还没有实现)
LOCK 当出现并发的使用允许用户进行LOCK和UNLOCK操作
SELECT 允许用户进行SELECT操作
SHOW_DATABASE 允许用户查看可用的数据库

Hive常用操作与权限的对应关系:

Operation ALTER UPDATE CREATE DROP INDEX LOCK SELECT SHOW_DBASE
LOAD √
EXPORT √
IMPORT √ √
CREATE TABLE √
CREATE TABLE AS SELECT √ √
DROP TABLE √
SELECT √
ALTER TABLE ADD COLUMN √
ALTER TABLE REPLACE COLUMN √
ALTER TABLE RENAME √
ALTER TABLE ADD PARTITION √
ALTER TABLE DROP PARTITION √
ALTER TABLE ARCHIVE √
ALTER TABLE UNARCHIVE √
ALTER TABLE SET PROPERTIES √
ALTER TABLE SET SERDE √
ALTER TABLE SET SERDEPROPERTIES √
ALTER TABLE CLUSTER BY √
ALTER TABLE PROTECT MODE √
ALTER PARTITION PROTECT MODE √
ALTER TABLE SET FILEFORMAT √
ALTER TABLE SET LOCATION √
ALTER PARTITION SET LOCATION √
ALTER TABLE CONCATENATE √
ALTER PARTITION CONCATENATE √
SHOW DATABASE √
LOCK TABLE √
UNLOCK TABLE √

终端方式控制权限

  1. vi ~/modules/apache-hive-2.3.4-bin/conf/hive-site.xml

权限配置:

  1. <property>
  2. <name>hive.security.authorization.enabled</name>
  3. <value>true</value>
  4. <description>开启权限验证</description>
  5. </property>
  6. <property>
  7. <name>hive.security.authorization.createtable.owner.grants</name>
  8. <value>ALL</value>
  9. <description>表的创建者对表拥有所有权限</description>
  10. </property>
  11. <property>
  12. <name>hive.users.in.admin.role</name>
  13. <value>vagrant</value>
  14. <description>将用户加入admin角色</description>
  15. </property>
  16. <property>
  17. <name>hive.semantic.analyzer.hook</name>
  18. <value>com.lonton.t8.bigdata.demo.hive.auth.MyAuthHook</value>
  19. <description>自定义方法实现超级管理员</description>
  20. </property>
  21. <!-- 以下配置为非必需配置项,根据需要添加 -->
  22. <property>
  23. <name>hive.server2.enable.doAs</name>
  24. <value>false</value>
  25. <description>默认情况下,HiveServer2以提交查询的用户执行查询访问(true),如果hive.server2.enable.doAs设置为false,查询将以运行hiveserver2进程的用户访问。</description>
  26. </property>
  27. <property>
  28. <name>hive.metastore.authorization.storage.checks</name>
  29. <value>true</value>
  30. <description>在做类似drop partition操作时,metastore是否要认证权限,默认是false</description>
  31. </property>
  32. <property>
  33. <name>hive.metastore.execute.setugi</name>
  34. <value>false</value>
  35. <description>非安全模式,设置为true会令metastore以客户端的用户和组权限执行DFS操作,默认是false,这个属性需要服务端和客户端同时设置</description>
  36. </property>
  37. <property>
  38. <name>hive.security.authorization.manager</name>
  39. <value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
  40. <description>客户端授权的实现类,验证用户所用身份操作是否有权限</description>
  41. </property>
  42. <property>
  43. <name>hive.security.authenticator.manager</name>
  44. <value>org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator</value>
  45. <description>客户端认证的实现类,验证用户所用的身份是否是对的,默认是org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator;用户定义的需要实现org.apache.hadoop.hive.ql.security.HiveAuthenticatorProvider</description>
  46. </property>

权限设置:

  1. -- 查看当前用户名
  2. select current_user();
  3. -- 查看系统用户名
  4. set system:user.name;
  5. select * from stu;
  6. -- 查看用户被授予的角色
  7. show role grant user vagrant;
  8. -- 执行grant/revoke前让用户进入admin角色权限(set role (role_name|all|none); )
  9. set hive.users.in.admin.role;
  10. set role admin;
  11. -- 设置角色失效,可用于退出admin
  12. set role none;
  13. -- 查看当前用户具有的角色
  14. show current roles;
  15. -- 查看所有存在的角色(ADMIN角色才有执行权)
  16. show roles;
  17. -- 查看属于某种角色的用户、角色列表(ADMIN角色才有执行权)
  18. SHOW PRINCIPALS admin;
  19. -- 创建自定义角色
  20. create role role_test;
  21. -- 删除自定义角色
  22. drop role role_test;
  23. -- 将自定义角色分配给用户
  24. grant role_test to user vagrant;
  25. -- 收回用户的自定义角色
  26. revoke role role_test from user vagrant;
  27. -- 把select权限授权给用户(表)
  28. grant select on table default.stu to user vagrant;
  29. -- 把select权限授权给用户(数据库)
  30. grant select on databases default to user vagrant;
  31. -- 收回用户select权限(数据库)
  32. revoke select on databases default from user vagrant;
  33. -- 收回用户select权限(表)
  34. revoke select on table default.stu from user vagrant;
  35. -- 查看用户被授予那些操作权限(数据库)
  36. show grant user vagrant on database default;
  37. -- 查看用户被授予那些操作权限(表)
  38. show grant user vagrant on table default.stu;

编程方式控制权限

  1. 添加依赖

    1. <dependency>
    2. <groupId>org.apache.hive</groupId>
    3. <artifactId>hive-exec</artifactId>
    4. <version>${hive.version}</version>
    5. </dependency>
  2. 编写代码 ```java import org.apache.hadoop.hive.ql.parse.ASTNode;
    import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
    import org.apache.hadoop.hive.ql.parse.HiveParser;
    import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
    import org.apache.hadoop.hive.ql.parse.SemanticException;
    import org.apache.hadoop.hive.ql.session.SessionState;

/**

  • Hive自定义权限控制规则
  • @description
  • 限定${admin}用户执行创建数据库,赋权等操作。
  • @author polaris
  • @version 1.0
  • @created 2020年5月12日 下午5:03:31 */ public class MyAuthHook extends AbstractSemanticAnalyzerHook {
    private static String admin = “vagrant”;

    @Override
    public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,

    1. ASTNode ast) throws SemanticException {
    2. switch (ast.getToken().getType()) {
    3. case HiveParser.TOK_CREATEDATABASE:
    4. case HiveParser.TOK_DROPDATABASE:
    5. case HiveParser.TOK_CREATEROLE:
    6. case HiveParser.TOK_DROPROLE:
    7. case HiveParser.TOK_GRANT:
    8. case HiveParser.TOK_REVOKE:
    9. case HiveParser.TOK_GRANT_ROLE:
    10. case HiveParser.TOK_REVOKE_ROLE:
    11. String userName = null;
    12. if (SessionState.get() != null
    13. && SessionState.get().getAuthenticator() != null) {
    14. userName = SessionState.get().getAuthenticator().getUserName();
    15. }
    16. if (!admin.equalsIgnoreCase(userName)) {
    17. throw new SemanticException(userName
    18. + " can't use ADMIN options, except " + admin + ".");
    19. }
    20. break;
    21. default:
    22. break;
    23. }
    24. return ast;

    }

}

  1. 3. 配置Hive
  2. ```xml
  3. <property>
  4. <name>hive.semantic.analyzer.hook</name>
  5. <value>com.lonton.t8.bigdata.demo.hive.auth.MyAuthHook</value>
  6. </property>
  1. 服务重启
    1. cd ~/modules/apache-hive-2.3.4-bin
    2. # 启动hiveserver2,将自动开启Metastore服务
    3. bin/hiveserver2 >/dev/null 2>&1 &
    4. # 检查hiveserver2是否正常启动
    5. ps -aux| grep hiveserver2
    6. # 检查hiveserver2端口
    7. # yum install net-tools # netstat安装
    8. netstat -nl|grep 10000
    9. # 检查metastore是否正常启动
    10. ps -aux| grep metastore
    参考:
    【Hive的授权机制】https://blog.csdn.net/CPP_MAYIBO/article/details/88079420
    【Hive多用户权限控制】https://www.iteye.com/blog/zhangxiong0301-2238479
    【Hive权限管理】https://blog.csdn.net/mnasd/article/details/79904061