一、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"
]
}
]
}
參考文檔