一、安裝hive插件
1、解壓安裝
# tar zxvf ranger-2.0.0-SNAPSHOT-hive-plugin.tar.gz -C /data1/hadoop/
2、修改install.properties
POLICY_MGR_URL=http://192.168.4.50:6080
REPOSITORY_NAME=hivedev
COMPONENT_INSTALL_DIR_NAME=/data1/hadoop/hive #hive安裝目錄
XAAUDIT.SOLR.ENABLE=true
XAAUDIT.SOLR.URL=http://192.168.4.50:6083/solr/ranger_audits
CUSTOM_USER=hduser
CUSTOM_GROUP=hduser
3、啟動hive插件
# sudo ./enable-hive-plugin.sh
啟動hive插件以后,默認生成hiveserver2-site.xml文件,或者在已經存在的該文件下添加如下信息:
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactory</value>
</property>
<property>
<name>hive.security.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
</property>
<property>
<name>hive.conf.restricted.list</name>
<value>hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager</value>
</property>
4、前台界面配置policy
點擊加號添加服務
如果測試連接ok,說明配置成功。
注:我在配置的時候,這里測試連接失敗,集群的hiveserver2服務啟動,端口也正常監聽,在集群內部使用beeline方式連接到集群進行操作時,提示如下錯誤:
Caused by: java.lang.NoSuchFieldError: REPLLOAD
最后發現是由於hive的版本與ranger hive里面的包版本不一致導致,我使用的hive版本是hive2.x,而ranger2.x對於的hive版本是3.x,所以,在使用的時候要注意版本的問題。
5、配置策略
當創建好服務以后,ranger默認就創建了一些policy,如下:
如果想要添加策略,可以添加右上角的add
6、測試
注意:ranger權限對應hive客戶端是沒有任何作用的,如果想要對hive客戶端做權限認證,則可以使用hive基於sql的安全認證,ranger只是對hiveserver2方式進行權限控制。
(1) 首先使用beeline -u jdbc:hive2://localhost:10000 -n hduser 連接到hive
- 創建數據庫(shanghai),該條語句可以正常執行。
- 在shanghai庫里面創建表(test),則會創建失敗,如下:
0: jdbc:hive2://192.168.0.230:10000> create table test(a string);
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [hduser] does not have [CREATE] privilege on [shanghai/test] (state=42000,code=40000)
提示沒有權限
(2) 添加策略,在上圖policy ID為10的這條策略里面修改如下:
上述的hduser的新添加的。添加完保存,格一小會,在再beeline模式下執行創建表的測試,看是否成功,當然,這里給了該用戶所有的權限,所以,該用戶還可以進行insert等操作。
(3) 測試其他用戶,比如當前的操作系統上面有一個yjt用戶,我想該用戶對test表有查詢權限,先在beeline模式下測試改用戶是否有select權限,如下:
[hduser@yjt ~]$ beeline -u jdbc:hive2://192.168.0.230:10000 -n yjt #指定登錄用戶為yjt
0: jdbc:hive2://192.168.0.230:10000> select * from shanghai.test;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [yjt] does not have [SELECT] privilege on [shanghai/test/*] (state=42000,code=40000)
可以發現,yjt這個用戶對於shanghai數據庫下的test這個表是沒有select權限的,添加權限:
還是在上述的策略10里面添加,如下:
上述保存以后,如下:
策略添加完以后,需要等待策略的下發,權限控制才生效。
注意:策略修改完以后,不用重新啟動beeline。
說明策略配置成功,那么上述配置了yjt這個用戶的select權限,是否該用戶真的只有select權限呢?繼續測試改用戶是否真的只有select權限,所以這里使用該用戶insert 一條數據到test表,如下:
額,這還沒到權限認證就開始報錯了,上述的錯誤可以看到該用戶對應hdfs的目錄或者文件沒有寫權限,從這里也可以看到,還可以使用hdfs的權限認證限制hive用戶。修改上述目錄或者文件的權限為777(主要為了測試用戶是否被hive ranger控制,所以這里設置為777,以排除其他干擾。)
[hduser@yjt conf]$ hadoop fs -setfacl -m user:yjt:rwx hdfs://yjt:9000/hive/warehouse/shanghai.db/test/
上述添加一條ACL。允許yjt所有操作
0: jdbc:hive2://192.168.0.230:10000> insert into table test values("test insert");
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [yjt] does not have [UPDATE] privilege on [shanghai/test] (state=42000,code=40000)
這里發現用戶沒有UPDATE權限,說明配置成功(在ranger里面,其實沒有insert權限,只有update權限),接下來,在policy里面添加update權限,看是否可以成功的insert數據。
借鑒:
https://www.jianshu.com/p/d9941b8687b7