天天看點

資料治理(十五):Ranger 管理 Hive 安全

作者:Lansonli

#頭條創作挑戰賽#

Ranger 管理 Hive 安全

一、配置 HiveServer2

通路 Hive 有兩種方式:HiveServer2 和 Hive Client,Hive Client 需要 Hive 和 Hadoop 的 jar 包,配置環境。HiveServer2 使得連接配接 Hive 的 Client 從 Yarn 和 HDFS 叢集中獨立出來,不需要每個節點都配置 Hive 和 Hadoop 的 jar 包和一系列環境。

Ranger 管理 Hive 權限隻能針對 HiveServer2 jdbc 方式連接配接,是以這裡需要配置 HiveServer2。

配置 HiveServer2 步驟如下:

1)在 Hive 服務端配置 hive-site.xml

#在Hive 服務端 $HIVE_HOME/conf/hive-site.xml中配置:
<!-- 配置hiveserver2 -->
<property>
     <name>hive.server2.thrift.port</name>
     <value>10000</value>
</property>
<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>192.168.179.4</value>
</property>
<!-- 配置hiveserver2使用的zookeeper -->
<property>
    <name>hive.zookeeper.quorum</name>
    <value> node3:2181,node4:2181,node5:2181</value>
</property> 

           

注意:“hive.zookeeper.quorum”搭建 hiveserver2HA 使用配置項,可以不配置,如果不配置啟動 hiveServer2 時一直連接配接本地 zookeeper,導緻大量錯誤日志(/tmp/root/hive.log),進而導緻通過 beeline 連接配接目前 node1 節點的 hiveserver2 時不穩定,會有連接配接不上錯誤資訊。

2)在每台 Hadoop 節點配置 core-site.xml,記得發送到所有節點

<!-- 配置代理通路使用者,如果不配置下列資訊 hive的jdbc連接配接會報錯 -->
<property>     
    <name>hadoop.proxyuser.root.hosts</name>     
    <value>*</value>
 </property> 
<property>     
    <name>hadoop.proxyuser.root.groups</name>    
    <value>*</value> 
</property>

           

3)重新開機 HDFS ,Hive ,在 Hive 服務端啟動 Metastore 和 HiveServer2 服務

[root@node1 conf]# hive --service metastore &
[root@node1 conf]# hive --service hiveserver2 > /root/hiveserver2_log.txt &

           

4)在用戶端通過 beeline 連接配接 Hive

[root@node3 test]# beeline
beeline> !connect jdbc:hive2://node1:10000 root
Enter password for jdbc:hive2://node1:10000: **** #可以輸入任意密碼,沒有驗證
0: jdbc:hive2://node1:10000> show tables;

           
資料治理(十五):Ranger 管理 Hive 安全

二、安裝 Ranger-hive-plugin

我們可以使用 Ranger 對 Hive 資料安全進行管理,這裡需要安裝 Hive 插件“ranger-2.1.0-hive-plugin”,此插件隻能對 jdbc 方式連接配接 Hive 的請求進行權限管理,不能對 hive-cli 用戶端方式進行權限管理(一般安裝 Hive 的節點才能使用 Hive 用戶端通路)。步驟如下:

1)遠端發送編譯好的“hive-plugin”到 node1 節點“/software”目錄下,并解壓

遠端發送“/software/apache-ranger-2.1.0/target/”下的“ranger-2.1.0-hive-plugin.tar.gz”到 node1 節點“/software”下:

[root@node3 /]# scp /software/apache-ranger-2.1.0/target/ranger-2.1.0-hive-plugin.tar.gz node1:/software/
#在node1節點操作
[root@node1 ~]# cd /software/
[root@node1 software]# tar -zxvf ./ranger-2.1.0-hive-plugin.tar.gz

           

2)配置“install.properties”檔案

進入到“/software/ranger-2.1.0-hive-plugin”目錄中,修改“install.properties”檔案:

[root@node1 ranger-2.1.0-hive-plugin]# vim install.properties
#配置Ranger-Admin通路位址
POLICY_MGR_URL=http://node1:6080
#配置Hive 倉庫名稱,可以自定義,需要後期在Ranger中使用
REPOSITORY_NAME=hive_repo
#配置Hive的安裝目錄
COMPONENT_INSTALL_DIR_NAME=/software/hive-3.1.2/
#配置使用插件的使用者和使用者組
CUSTOM_USER=root
CUSTOM_GROUP=root

           

3)執行“enable-hive-plugin.sh”腳本啟動 hive 插件

進入到“/software/ranger-2.1.0-hive-plugin”目錄下,執行如下指令,啟用插件:

[root@node1 ~]# cd /software/ranger-2.1.0-hive-plugin
[root@node1 ranger-2.1.0-hive-plugin]# enable-hive-plugin.sh

           

三、配置 Ranger 連接配接 Hive 服務

安裝好以上 Hive-Plugin 之後,重新啟動 HDFS,啟動 Hive,HiveMetastore、HiveServer2 等。如果想要對連接配接 Hive 的使用者進行表、列權限管理,需要在 Ranger 中添加對應的 Hive 服務,才可以使用 Ranger 通過這個服務配置每個使用者對 Hive 庫、表、列權限管理。配置如下:

1)啟動 HDFS,啟動 Hive、Hive MeateStore、Hive Server2

#啟動HDFS,在node1節點上啟動Hive metastore
[root@node1 conf]# start-all.sh
[root@node1 conf]# hive --service metastore &
[root@node1 conf]# hive --service hiveserver2 > /root/hiveserver2_log.txt &

           

2)在 Ranger 頁面中配置 Hive

資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全

注意,以上參數解釋如下:

  • “Service Name”填寫目前 Hive 服務名稱,與 Hive 插件中"install.properties"檔案配置參數"REPOSITORY_NAME"保持一緻。
  • 配置的“user”和“password”也是與"install.properties"檔案中配置的“CUSTOM_USER=root”、“CUSTOM_GROUP=root”保持一緻。
  • “jdbc.url”填寫“jdbc:hive2://node1:10000”即可,這裡連接配接 node1。

添加完成之後:

資料治理(十五):Ranger 管理 Hive 安全

3)連接配接測試是否可以 jdbc 方式連接配接上 Hive

資料治理(十五):Ranger 管理 Hive 安全

注意:這裡連接配接時,單機測試連接配接時需要等待一段時間,才能正常連接配接。

四、Ranger 對 Hive 使用者進行權限管理

檢視 Ranger 中配置好的 Hive 權限管理服務:

資料治理(十五):Ranger 管理 Hive 安全

修改上圖中隻有 root 使用者對是以庫、表、列具有操作權限,修改後如下:

資料治理(十五):Ranger 管理 Hive 安全

在 node3 中登入 beeline 連接配接 node1 hive:

#node3 通過beeline連接配接Hive
[root@node3 ~]# beeline
#連接配接HiveServer2 jdbc連接配接
beeline> !connect jdbc:hive2://node1:10000
#這裡使用者名目前可以随意輸入,在Hive中沒有校驗,這裡可以通過Hive配置有哪些用
#戶可以連接配接Hive,然後通過Ranger再管理這些使用者的細粒度通路權限。從上圖中可以
#看到目前隻有root使用者可以通路表資料,可以使用非root使用者測試,這裡使用
#“diaochan”使用者:
Enter username for jdbc:hive2://node1:10000: diaochan
#由于Hive中沒有檢驗密碼,是以這裡可以随意輸入任意密碼
Enter password for jdbc:hive2://node1:10000: ****
#查詢庫下的表,沒有權限。
0: jdbc:hive2://node1:10000> show tables
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [daochan] does not have [USE] privilege on [de
fault] (state=42000,code=40000)


#重新使用root使用者登入beeline,查詢對應的表,有權限
[root@node3 ~]# beeline
beeline> !connect jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: root
Enter password for jdbc:hive2://node1:10000: *** #密碼随意
0: jdbc:hive2://node1:10000> show tables;

           
資料治理(十五):Ranger 管理 Hive 安全

下面在 Hive 中建立兩張表進行權限管理:

#在Hive中建立兩張表
create table student (id int,name string,age int) row format delimited fields terminated by '\t';
create table score (id int,name string,score int) row format delimited fields terminated by '\t';

           

上傳資料附件,将以上檔案上傳到 node3“/software/test”下

資料治理(十五):Ranger 管理 Hive 安全
1  zhangsan  18
2  lisi  19
3  wangwu  20
4  maliu  21
5  tianqi  22
6  zhaoba  23

           
資料治理(十五):Ranger 管理 Hive 安全
1  zhangsan  100
2  lisi  200
3  wangwu  300
4  maliu  400
5  tianqi  500
6  zhaoba  600

           
#加載資料:
hive> load data local inpath '/root/test/students.txt' into table student;
hive> load data local inpath '/root/test/scores.txt' into table score;

           

權限需求:對使用者“user1”配置以上兩張表的通路和修改權限,對使用者“user2”配置對兩張表隻有通路權限。

配置步驟如下:

1)在 node1 節點建立兩個使用者,密碼為對應使用者名稱

#建立兩個使用者user1,和user2
[root@node1 ~]# useradd user1
[root@node1 ~]# passwd user1


[root@node1 ~]# useradd user2
[root@node1 ~]# passwd user2

           

2)在 Ranger 頁面,打開“hive_repo”服務,配置如下:

配置“Student”表權限:

資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全

最終配置好如下:

資料治理(十五):Ranger 管理 Hive 安全

3)登入 Hive Beeline 測試:

向 HDFS 中插入資料時,user1,user2 使用者需要操作 HDFS 和 Yarn,是以這裡将 HDFS 中 Hive 對應的路徑“/user/hive/warehouse”中的“/user”路徑權限改成“777”,将 Yarn 使用目錄“tmp”路徑權限改成“777”

[root@node5 bin]# hdfs dfs -chmod -R 777 /user
[root@node5 bin]# hdfs dfs -chmod -R 777 /tmp

           

測試登入 user1,對“student”、“score”表有操作和修改權限,如下:

[root@node3 ~]# beeline
beeline> !connect jdbc:hive2://node1:10000
0: jdbc:hive2://node1:10000> select * from student;

           
資料治理(十五):Ranger 管理 Hive 安全
0: jdbc:hive2://node1:10000> select * from score;

           
資料治理(十五):Ranger 管理 Hive 安全
#向表student、score中插入資料,也能通過。
0: jdbc:hive2://node1:10000> insert into student values (7,"aa",24);
0: jdbc:hive2://node1:10000> insert into score values (7,"bb",700);

           

測試登入 user2,對“student”、“score”表有操作和修改權限,如下:

[root@node3 software]# beeline
beeline> !connect jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: user2
Enter password for jdbc:hive2://node1:10000: *** #密碼随便輸入
0: jdbc:hive2://node1:10000> select * from student;

           
資料治理(十五):Ranger 管理 Hive 安全
0: jdbc:hive2://node1:10000> select * from score;

           
資料治理(十五):Ranger 管理 Hive 安全
#測試向“student”和“score”中插入資料,沒有對應權限:
0: jdbc:hive2://node1:10000> insert into table student values (8,"cc",25);
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [user2] does not have [UPDATE] privilege on [d
efault/student] (state=42000,code=40000)


0: jdbc:hive2://node1:10000> insert into table score values (8,"dd",800);
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [user2] does not have [UPDATE] privilege on [d
efault/score] (state=42000,code=40000)

           

權限需求:對使用者“user3”配置對“student”表中“id、name”兩列有查詢權限,其他列沒有查詢權限。

配置步驟如下:

1)在 node1 節點中添加使用者“user3”

#建立兩個使用者user3
[root@node1 ~]# useradd user3
[root@node1 ~]# passwd user3

           

2)給使用者“user3”配置表“student”的通路權限

資料治理(十五):Ranger 管理 Hive 安全

3)測試

#user3登入beeline
[root@node3 software]# beeline
beeline> !connect jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: user3
#通路表“student”資料,“age”列無法查詢,select * 查詢不允許
0: jdbc:hive2://node1:10000> select id ,name from student;

           
資料治理(十五):Ranger 管理 Hive 安全

權限需求:對使用者“user1”通路表“student”時,“age”列進行空值輸出,進行脫敏。

配置步驟如下:

1)給使用者“user1”配置表“student”的“Masking”通路權限

資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全

2)登入 Hive Beeline 測試

[root@node3 software]# beeline
beeline> !connect jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: user1
0: jdbc:hive2://node1:10000> select * from student;

           
資料治理(十五):Ranger 管理 Hive 安全

權限需求:對使用者“user2”通路表“student”時,“age”列隻能插叙小于等于 20 的行資料。

配置步驟如下:

1)給使用者“user1”配置表“student”的“Masking”通路權限

資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全
資料治理(十五):Ranger 管理 Hive 安全

2)登入 Hive Beeline 測試

[root@node3 software]# beeline
beeline> !connect jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: user2
#查詢隻有3行滿足條件的資料
0: jdbc:hive2://node1:10000> select * from student;

           
資料治理(十五):Ranger 管理 Hive 安全

繼續閱讀