美文网首页hive玩转大数据程序员
Apache Ranger及Hive权限控制

Apache Ranger及Hive权限控制

作者: 便利蜂数据平台 | 来源:发表于2017-08-03 21:01 被阅读3101次

    一、Ranger概述

    1.Ranger简介

    Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。

    本文章介绍Ranger与Hive集成过程,与使用方法

    2.Ranger包含以下组件

    • Ranger Admin 用户管理策略,提供WebUI和RestFul接口
    • Ranger UserSync 用于将Unix系统或LDAP用户/组同步到RangerAdmin
    • Ranger TagSync 同步Atlas中的Tag信息
    • Ranger KMS
    000.jpg

    3.Ranger依赖的组件:

    • JDK 运行RangerAdmin RangerKMS
    • RDBMS 1.存储授权策略 2.存储Ranger 用户/组 3.存储审核日志
    • Solr(可选) 存储审核日志
    • HDFS(可选) 存储审核日志
    • Kerberos(可选) 确保所有请求都被认证

    4.目前Ranger0.7支持的Plugin

    • HDFS
    • YARN
    • SOLR
    • ATLAS
    • HBASE
    • KNOX
    • KAFKA
    • HIVE
    • STORM
    • NIFI

    二、Ranger编译安装

    说明: Ranger可以在Ambari上直接安装。开启AmbariHivePlugin也可以直接在页面上操作。
    但如果跟ApacheHive集成的话,需要先编译出ApacheRanger的HivePlugin来

    1.Apache Ranger编译

    #Install maven git gcc mysql
    git clone https://github.com/apache/ranger.git
    cd ranger
    git checkout release-ranger-0.7.1
    mvn clean compile package assembly:assembly install -DskipTests
    ls target
    

    2.通过Ambari安装Ranger

    • 前置条件:
    • 1.必须有 MySQL/Oracle/Postgres/MSSQL/SQL Anywhere Server 数据库实例
    • 2.在RangerAdmin主机上 必须安装DB Client
    • 3.确保DB Admin用户可以再其他机器上登陆(用来创建ranger用户)
    • 4.执行下面的命令 导入JDBC驱动 ambari-server setup --jdbc-db={database-type} --jdbc-driver={/jdbc/driver/path}
    #导入JDBC驱动:
    #(MySQL JDBC Driver Jar包下载页面:https://dev.mysql.com/downloads/connector/j/5.0.html)
    wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.0.8.tar.gz
    tar -zxvf mysql-connector-java-5.0.8.tar.gz
    ambari-server setup --jdbc-db=mysql --jdbc-driver=mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar
    

    3.安装RangerHivePlugin

    登陆RangerAdmin: http://l-node1.data.beta.cn0:6080

    #AmbariHive可直接在Ambari页面上操作
    #ApacheHive的话 需要执行以下命令:
    
    # 1.拷贝RangerHivePlugin安装包
    cp target/ranger-0.7.1-hive-plugin.tar.gz /usr/apache
    tar -zxvf /usr/apache/ranger-0.7.1-hive-plugin.tar.gz
    
    # 2.编辑install.properties文件
    #编辑POLICY_MGR_URL 指向RangerAdmin 例如 POLICY_MGR_URL=http://l-node1.data.beta.cn0:6080
    #编辑REPOSITORY_NAME 要与RangerAdmin中ServiceName配置一致 例如 REPOSITORY_NAME=hivebeta
    vim /usr/apache/ranger-0.7.1-hive-plugin/install.properties
    
    # 3.配置JAVA_HOME HIVE_HOME 环境变量
    echo "export JAVA_HOME=/usr/java/jdk1.8.0_141" >> /etc/bashrc
    echo "export HIVE_HOME=/usr/apache/hive" >> /etc/bashrc
    source /etc/bashrc
    
    # 4.开启plugin
    sudo sh /usr/apache/ranger-0.7.1-hive-plugin/enable-hive-plugin.sh
    #显示Ranger Plugin for hive has been enabled. Please restart hive to ensure that changes are effective.即成功
    
    # 5.重启HiveServer
    

    4.RangerAdmin上面配置要管理的HiveServer实例

    001.png
    002.png

    三、Ranger Hive权限控制

    1.准备测试数据

    点击hivebeta 开始Hive权限控制

    003.png

    根据我们刚才的配置,hive用户拥有all权限

    使用beeline登陆
    [hive@l-node3 hive]$ bin/beeline
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    Beeline version 2.3.0 by Apache Hive
    beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha
    Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha
    Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: hive
    Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:
    17/08/03 11:49:28 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000
    Connected to: Apache Hive (version 2.3.0)
    Driver: Hive JDBC (version 2.3.0)
    Transaction isolation: TRANSACTION_REPEATABLE_READ
    
    #创建ranger测试库
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> create database ranger_test_db;
    No rows affected (0.259 seconds)
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
    No rows affected (0.114 seconds)
    
    #创建测试表
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user
    . . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)
    . . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED
    . . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'
    . . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;
    No rows affected (0.317 seconds)
    
    # 表数据
    [hive@l-node3 hive]$ hadoop fs -cat /tmp/t_user.data
    meizi   18518760001
    xuaner  18518760002
    afa 18518760003
    hanze   18518760004
    xupeng  18518760005
    xiaofeng    18518760006
    shuoshuo    18518760007
    
    # 导入数据
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> LOAD DATA INPATH '/tmp/t_user.data' INTO TABLE t_user;
    No rows affected (0.523 seconds)
    
    #查询成功
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
    +--------------+---------------+
    | t_user.name  | t_user.phone  |
    +--------------+---------------+
    | meizi        | 18518760001   |
    | xuaner       | 18518760002   |
    | afa          | 18518760003   |
    | hanze        | 18518760004   |
    | xupeng       | 18518760005   |
    | xiaofeng     | 18518760006   |
    | shuoshuo     | 18518760007   |
    +--------------+---------------+
    7 rows selected (0.11 seconds)
    

    2.HiveAccess(对库、表、列的授权)

    # 在Ranger UserSync机器上创建测试用户rangeruser1
    [root@l-node1 ~]# useradd rangeruser1
    
    # 测试未授权的用户
    [hive@l-node3 hive]$ bin/beeline
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    Beeline version 2.3.0 by Apache Hive
    beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha
    Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha
    
    #使用rangeruser1用户登陆
    Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: rangeruser1
    Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:
    17/08/03 12:30:58 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000
    Connected to: Apache Hive (version 2.3.0)
    Driver: Hive JDBC (version 2.3.0)
    Transaction isolation: TRANSACTION_REPEATABLE_READ
    
    # use db; select table; 等访问全部被拒绝
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
    Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [USE] privilege on [ranger_test_db] (state=42000,code=40000)
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from ranger_test_db.t_user;
    Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [SELECT] privilege on [ranger_test_db/t_user/*] (state=42000,code=40000)
    

    给rangeruser1用户授权

    点击Add New Policy给rangeruser1用户授予ranger_test_db.t_user.* select权限

    004.png
    #select成功
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
    No rows affected (0.127 seconds)
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
    +--------------+---------------+
    | t_user.name  | t_user.phone  |
    +--------------+---------------+
    | meizi        | 18518760001   |
    | xuaner       | 18518760002   |
    | afa          | 18518760003   |
    | hanze        | 18518760004   |
    | xupeng       | 18518760005   |
    | xiaofeng     | 18518760006   |
    | shuoshuo     | 18518760007   |
    +--------------+---------------+
    7 rows selected (0.12 seconds)
    
    #删除表 被拒绝
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> drop table t_user;
    Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [DROP] privilege on [ranger_test_db/t_user] (state=42000,code=40000)
    
    #创建表 被拒绝
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user2
    . . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)
    . . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED
    . . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'
    . . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;
    Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [CREATE] privilege on [ranger_test_db/t_user2] (state=42000,code=40000)
    

    Delegate Admin(委托管理员)说明: 如果一个Condition中的 用户/组 为Delegate Admin,那么该 用户/组 可以修改上面resource的权限 并可以把此resource授权给其他人

    也可以使用SQL进行授权(授权过的记录同样会显示在RangerAdmin上):
    GRANT SELECT ON TABLE ranger_test_db.t_user TO USER fengjie;

    3.Masking(动态列屏蔽)

    动态列屏蔽: 可以将一列数据进行屏蔽操作 如哈希、加密、打马赛克等

    添加一个Masking Policy

    005.png
    006.png

    Select Masking Option里面填Mask的选项,默认有: 显示前4位、显示后4位、哈希、Null值、日期类型仅显示年等。我们这里使用Custom自定义,
    其实就是写Select子句 可以根据逻辑自己实现,也可使用UDF。本例中我们使用concat(substr(phone,1,7),'****')将手机号的后四位屏蔽掉

    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
    +--------------+---------------+
    | t_user.name  | t_user.phone  |
    +--------------+---------------+
    | meizi        | 1851876****   |
    | xuaner       | 1851876****   |
    | afa          | 1851876****   |
    | hanze        | 1851876****   |
    | xupeng       | 1851876****   |
    | xiaofeng     | 1851876****   |
    | shuoshuo     | 1851876****   |
    +--------------+---------------+
    7 rows selected (0.173 seconds)
    

    4.Row Level Filter(行级别过滤)

    行级别过滤: 可以过滤掉行数据。比如订单表,北京的员工仅允许看北京的订单数据,其他地区的数据被强制过滤掉

    添加一个Row Level Filter Policy

    007.png
    008.png

    Row Level Filter里面填Filter的过滤规则,其实就是写Where子句。本例中我们使用name <> 'hanze'将 name为'hanze'的用户过滤掉

    #hanze用户已经被过滤掉,不显示在结果中了
    0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
    +--------------+---------------+
    | t_user.name  | t_user.phone  |
    +--------------+---------------+
    | meizi        | 1851876****   |
    | xuaner       | 1851876****   |
    | afa          | 1851876****   |
    | xupeng       | 1851876****   |
    | xiaofeng     | 1851876****   |
    | shuoshuo     | 1851876****   |
    +--------------+---------------+
    6 rows selected (0.164 seconds)
    

    四、基于TAG的权限控制

    Apache Ranger可以和Apache Atlas(数据治理,元数据仓储)组件一起使用,它可以定义一种基于标签的安全服务,通过使用标签对文件和数据资产进行分类,并控制用户和用户组对一系列标签的访问。

    Apache Atlas里面可以对资源打Tag。打了Tag后 我们可以在这里根据Tag来控制权限
    (注意:因需要集成Atlas 此功能暂未验证)

    1.添加TagService

    009.png
    010.png

    2.添加TagPolicy

    011.png
    012.png

    上图的Policy,实现了这样的场景:
    产品组(product)可以访问带"TAG"标签的资源; 但实习生(intern)不靠谱 实习生没有访问权限; 但因实习生中的meizi表现突出 给他赋予访问权限

    3.授权流程:

    013.png

    先检查基于Tag的权限是否拒绝,如果拒绝的话,报错退出。
    如果不拒绝,再检查基于Resource的权限拒不拒绝。
    如果不拒绝,再检查Tag的权限允不允许,Resource的权限允不允许。

    五、Audit审计记录

    1.Access

    此页面记录每次授权的信息 包括策略id、时间、访问用户、访问的资源、访问的类型、授权结果等信息。可以根据条件进行搜索
    开启此功能需要先安装Solr

    014.png

    2.Admin

    此页面记录对策略的操作

    015.png

    3.Login Sessions

    此页面记录登陆RangerAdmin的操作

    016.png

    4.Plugins

    记录Plugins的同步策略

    017.png

    5.Pugins Status

    Plugin的状态

    018.png

    六、RestAPI

    以上在RangerAdminWeb上操作的东西 都可以在RestAPI里面操作。
    比如 添加服务、更新服务、删除服务、搜索服务、获取策略、创建策略、更新策略、删除策略、搜索策略等

    API name                Create Policy
    Request Type            POST
    Request URL             service/public/v2/api/policy
    Request Parameters      Application/json
    
    Hive Example:
    {
     "policyName": "FinancePolicy",
     "databases": "finance,hr",
     "tables": "invoices,emps",
     "columns": "amt, emp_id",
     "udfs": "",
     "description": "Hive Policy",
     "repositoryName": "hivedev",
     "repositoryType": "hive",
     "tableType": "Exclusion",
     "columnType": "Inclusion",
     "isEnabled": true,
     "isAuditEnabled": true,
     "permMapList": [
     {
     "userList": [
     "john",
     "andrew"
     ],
     "permList": [
     "Write",
     "Admin"
     ]
     },
     {
     "userList": [
     "hr"
     ],
     "groupList": [
     "admin"
     ],
     "permList": [
     "Read",
     "Write",
     "Admin"
     ]
     }
     ]
    }
    

    参考文档

    Apache Ranger Installation

    Apache Ranger User Guide

    Hortonworks HDP doc

    HDFS + Ranger

    Ranger PPT

    Ranger + Atlas PPT

    相关文章

      网友评论

        本文标题:Apache Ranger及Hive权限控制

        本文链接:https://www.haomeiwen.com/subject/exkmlxtx.html