Apache Ranger及Hive權限控制

一、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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容