hive插件 ranger_Apache Ranger及Hive权限控制
一、Ranger概述
1.Ranger簡(jiǎn)介
Apache Ranger提供一個(gè)集中式安全管理框架, 并解決授權(quán)和審計(jì)。它可以對(duì)Hadoop生態(tài)的組件如HDFS、Yarn、Hive、Hbase等進(jìn)行細(xì)粒度的數(shù)據(jù)訪問(wèn)控制。通過(guò)操作Ranger控制臺(tái),管理員可以輕松的通過(guò)配置策略來(lái)控制用戶訪問(wèn)權(quán)限。
本文章介紹Ranger與Hive集成過(guò)程,與使用方法
2.Ranger包含以下組件
Ranger Admin 用戶管理策略,提供WebUI和RestFul接口
Ranger UserSync 用于將Unix系統(tǒng)或LDAP用戶/組同步到RangerAdmin
Ranger TagSync 同步Atlas中的Tag信息
Ranger KMS
000.jpg
3.Ranger依賴的組件:
JDK 運(yùn)行RangerAdmin RangerKMS
RDBMS 1.存儲(chǔ)授權(quán)策略 2.存儲(chǔ)Ranger 用戶/組 3.存儲(chǔ)審核日志
Solr(可選) 存儲(chǔ)審核日志
HDFS(可選) 存儲(chǔ)審核日志
Kerberos(可選) 確保所有請(qǐng)求都被認(rèn)證
4.目前Ranger0.7支持的Plugin
HDFS
YARN
SOLR
ATLAS
HBASE
KNOX
KAFKA
HIVE
STORM
NIFI
二、Ranger編譯安裝
說(shuō)明: Ranger可以在Ambari上直接安裝。開(kāi)啟AmbariHivePlugin也可以直接在頁(yè)面上操作。
但如果跟ApacheHive集成的話,需要先編譯出ApacheRanger的HivePlugin來(lái)
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.通過(guò)Ambari安裝Ranger
前置條件:
1.必須有 MySQL/Oracle/Postgres/MSSQL/SQL Anywhere Server 數(shù)據(jù)庫(kù)實(shí)例
2.在RangerAdmin主機(jī)上 必須安裝DB Client
3.確保DB Admin用戶可以再其他機(jī)器上登陸(用來(lái)創(chuàng)建ranger用戶)
4.執(zhí)行下面的命令 導(dǎo)入JDBC驅(qū)動(dòng) ambari-server setup –jdbc-db={database-type} –jdbc-driver={/jdbc/driver/path}
#導(dǎo)入JDBC驅(qū)動(dòng):
#(MySQL JDBC Driver Jar包下載頁(yè)面: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頁(yè)面上操作
#ApacheHive的話 需要執(zhí)行以下命令:
# 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 環(huán)境變量
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.開(kāi)啟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實(shí)例
001.png
002.png
三、Ranger Hive權(quán)限控制
1.準(zhǔn)備測(cè)試數(shù)據(jù)
點(diǎn)擊hivebeta 開(kāi)始Hive權(quán)限控制
003.png
根據(jù)我們剛才的配置,hive用戶擁有all權(quán)限
使用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
#創(chuàng)建ranger測(cè)試庫(kù)
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)
#創(chuàng)建測(cè)試表
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)
# 表數(shù)據(jù)
[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
# 導(dǎo)入數(shù)據(jù)
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(對(duì)庫(kù)、表、列的授權(quán))
# 在Ranger UserSync機(jī)器上創(chuàng)建測(cè)試用戶rangeruser1
[root@l-node1 ~]# useradd rangeruser1
# 測(cè)試未授權(quán)的用戶
[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; 等訪問(wèn)全部被拒絕
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用戶授權(quán)
點(diǎn)擊Add New Policy給rangeruser1用戶授予ranger_test_db.t_user.* select權(quán)限
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)
#創(chuàng)建表 被拒絕
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(委托管理員)說(shuō)明: 如果一個(gè)Condition中的 用戶/組 為Delegate Admin,那么該 用戶/組 可以修改上面resource的權(quán)限 并可以把此resource授權(quán)給其他人
也可以使用SQL進(jìn)行授權(quán)(授權(quán)過(guò)的記錄同樣會(huì)顯示在RangerAdmin上):
GRANT SELECT ON TABLE ranger_test_db.t_user TO USER fengjie;
3.Masking(動(dòng)態(tài)列屏蔽)
動(dòng)態(tài)列屏蔽: 可以將一列數(shù)據(jù)進(jìn)行屏蔽操作 如哈希、加密、打馬賽克等
添加一個(gè)Masking Policy
005.png
006.png
Select Masking Option里面填Mask的選項(xiàng),默認(rèn)有: 顯示前4位、顯示后4位、哈希、Null值、日期類型僅顯示年等。我們這里使用Custom自定義,
其實(shí)就是寫Select子句 可以根據(jù)邏輯自己實(shí)現(xiàn),也可使用UDF。本例中我們使用concat(substr(phone,1,7),'****')將手機(jī)號(hào)的后四位屏蔽掉
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(行級(jí)別過(guò)濾)
行級(jí)別過(guò)濾: 可以過(guò)濾掉行數(shù)據(jù)。比如訂單表,北京的員工僅允許看北京的訂單數(shù)據(jù),其他地區(qū)的數(shù)據(jù)被強(qiáng)制過(guò)濾掉
添加一個(gè)Row Level Filter Policy
007.png
008.png
Row Level Filter里面填Filter的過(guò)濾規(guī)則,其實(shí)就是寫Where子句。本例中我們使用name <> 'hanze'將 name為’hanze’的用戶過(guò)濾掉
#hanze用戶已經(jīng)被過(guò)濾掉,不顯示在結(jié)果中了
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的權(quán)限控制
Apache Ranger可以和Apache Atlas(數(shù)據(jù)治理,元數(shù)據(jù)倉(cāng)儲(chǔ))組件一起使用,它可以定義一種基于標(biāo)簽的安全服務(wù),通過(guò)使用標(biāo)簽對(duì)文件和數(shù)據(jù)資產(chǎn)進(jìn)行分類,并控制用戶和用戶組對(duì)一系列標(biāo)簽的訪問(wèn)。
Apache Atlas里面可以對(duì)資源打Tag。打了Tag后 我們可以在這里根據(jù)Tag來(lái)控制權(quán)限
(注意:因需要集成Atlas 此功能暫未驗(yàn)證)
1.添加TagService
009.png
010.png
2.添加TagPolicy
011.png
012.png
上圖的Policy,實(shí)現(xiàn)了這樣的場(chǎng)景:
產(chǎn)品組(product)可以訪問(wèn)帶”TAG”標(biāo)簽的資源; 但實(shí)習(xí)生(intern)不靠譜 實(shí)習(xí)生沒(méi)有訪問(wèn)權(quán)限; 但因?qū)嵙?xí)生中的meizi表現(xiàn)突出 給他賦予訪問(wèn)權(quán)限
3.授權(quán)流程:
013.png
先檢查基于Tag的權(quán)限是否拒絕,如果拒絕的話,報(bào)錯(cuò)退出。
如果不拒絕,再檢查基于Resource的權(quán)限拒不拒絕。
如果不拒絕,再檢查Tag的權(quán)限允不允許,Resource的權(quán)限允不允許。
五、Audit審計(jì)記錄
1.Access
此頁(yè)面記錄每次授權(quán)的信息 包括策略id、時(shí)間、訪問(wèn)用戶、訪問(wèn)的資源、訪問(wèn)的類型、授權(quán)結(jié)果等信息。可以根據(jù)條件進(jìn)行搜索
開(kāi)啟此功能需要先安裝Solr
014.png
2.Admin
此頁(yè)面記錄對(duì)策略的操作
015.png
3.Login Sessions
此頁(yè)面記錄登陸RangerAdmin的操作
016.png
4.Plugins
記錄Plugins的同步策略
017.png
5.Pugins Status
Plugin的狀態(tài)
018.png
六、RestAPI
以上在RangerAdminWeb上操作的東西 都可以在RestAPI里面操作。
比如 添加服務(wù)、更新服務(wù)、刪除服務(wù)、搜索服務(wù)、獲取策略、創(chuàng)建策略、更新策略、刪除策略、搜索策略等
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"
]
}
]
}
參考文檔
總結(jié)
以上是生活随笔為你收集整理的hive插件 ranger_Apache Ranger及Hive权限控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CPU工作状态的知识介绍
- 下一篇: 密码学专题 openssl编译和安装