#頭條創作挑戰賽#
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-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
注意,以上參數解釋如下:
- “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。
添加完成之後:
3)連接配接測試是否可以 jdbc 方式連接配接上 Hive
注意:這裡連接配接時,單機測試連接配接時需要等待一段時間,才能正常連接配接。
四、Ranger 對 Hive 使用者進行權限管理
檢視 Ranger 中配置好的 Hive 權限管理服務:
修改上圖中隻有 root 使用者對是以庫、表、列具有操作權限,修改後如下:
在 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;
下面在 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”下
1 zhangsan 18
2 lisi 19
3 wangwu 20
4 maliu 21
5 tianqi 22
6 zhaoba 23
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”表權限:
最終配置好如下:
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;
0: jdbc:hive2://node1:10000> select * from score;
#向表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;
0: jdbc:hive2://node1:10000> select * from score;
#測試向“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”的通路權限
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;
權限需求:對使用者“user1”通路表“student”時,“age”列進行空值輸出,進行脫敏。
配置步驟如下:
1)給使用者“user1”配置表“student”的“Masking”通路權限
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;
權限需求:對使用者“user2”通路表“student”時,“age”列隻能插叙小于等于 20 的行資料。
配置步驟如下:
1)給使用者“user1”配置表“student”的“Masking”通路權限
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;