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 ——>
注意:“hive。zookeeper。quorum”搭建 hiveserver2HA 使用配置項,可以不配置,如果不配置啟動 hiveServer2 時一直連線本地 zookeeper,導致大量錯誤日誌(/tmp/root/hive。log),從而導致透過 beeline 連線當前 node1 節點的 hiveserver2 時不穩定,會有連線不上錯誤資訊。
2)在每臺 Hadoop 節點配置 core-site。xml,記得傳送到所有節點
<!—— 配置代理訪問使用者,如果不配置下列資訊 hive的jdbc連線會報錯 ——>
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]# beelinebeeline> !connect jdbc:hive2://node1:10000 rootEnter 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=rootCUSTOM_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 tablesError: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [daochan] does not have [USE] privilege on [default] (state=42000,code=40000)#重新使用root使用者登入beeline,查詢對應的表,有許可權[root@node3 ~]# beelinebeeline> !connect jdbc:hive2://node1:10000Enter username for jdbc:hive2://node1:10000: rootEnter 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 182 lisi 193 wangwu 204 maliu 215 tianqi 226 zhaoba 23
1 zhangsan 1002 lisi 2003 wangwu 3004 maliu 4005 tianqi 5006 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 ~]# beelinebeeline> !connect jdbc:hive2://node1:100000: 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]# beelinebeeline> !connect jdbc:hive2://node1:10000Enter username for jdbc:hive2://node1:10000: user2Enter 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 [default/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 [default/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]# beelinebeeline> !connect jdbc:hive2://node1:10000Enter 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]# beelinebeeline> !connect jdbc:hive2://node1:10000Enter username for jdbc:hive2://node1:10000: user10: jdbc:hive2://node1:10000> select * from student;
許可權需求:對使用者“user2”訪問表“student”時,“age”列只能插敘小於等於 20 的行資料。
配置步驟如下:
1)給使用者“user1”配置表“student”的“Masking”訪問許可權
2)登入 Hive Beeline 測試
[root@node3 software]# beelinebeeline> !connect jdbc:hive2://node1:10000Enter username for jdbc:hive2://node1:10000: user2#查詢只有3行滿足條件的資料0: jdbc:hive2://node1:10000> select * from student;