原理內容來之https://developer.aliyun.com/article/25491 數據庫
Apache Sentry是Cloudera公司發佈的一個Hadoop開源組件,截止目前仍是Apache的孵化項目,它提供了細粒度級、基於角色的受權以及多租戶的管理模式。Sentry當前能夠和Hive/Hcatalog、Apache Solr 和Cloudera Impala集成,將來會擴展到其餘的Hadoop組件,例如HDFS和HBase。編程
Sentry提供了定義和持久化訪問資源的策略的方法。目前,這些策略能夠存儲在文件裏或者是能使用RPC服務訪問的數據庫後端存儲裏。數據訪問工具,例如Hive,以必定的模式辨認用戶訪問數據的請求,例如從一個表讀一行數據或者刪除一個表。這個工具請求Sentry驗證訪問是否合理。Sentry構建請求用戶被容許的權限的映射並判斷給定的請求是否容許訪問。請求工具這時候根據Sentry的判斷結果來容許或者禁止用戶的訪問請求。後端
Sentry受權包括如下幾種角色:安全
Binding
Binding實現了對不一樣的查詢引擎受權,Sentry將本身的Hook函數插入到各SQL引擎的編譯、執行的不一樣階段。
這些Hook函數起兩大做用:服務器
Policy Engine
這是Sentry受權的核心組件。Policy Engine斷定從binding層獲取的輸入的權限要求與服務提供層已保存的權限描述是否匹配。架構
Policy Provider
Policy Provider負責從文件或者數據庫中讀取出原先設定的訪問權限。Policy Engine以及Policy Provider其實對於任何受權體系來講都是必須的,所以是公共模塊,後續還可服務於別的查詢引擎。ide
Sentry策略存儲和服務將角色和權限以及組合角色的映射持久化到一個關係數據庫並提供編程的API接口方便建立、查詢、更新和刪除。這容許Sentry的客戶端並行和安全地獲取和修改權限。
函數
Sentry策略存儲能夠使用不少後端的數據庫,例如MySQL、Postgres等等,它使用ORM庫DataNucleus來完成持久化操做。Sentry支持kerberos認證,也能夠擴展代碼支持其餘認證方式。工具
安裝Sentry服務:
基於CDH 6.3.2oop
1.點擊添加服務
2.選擇sentry,點擊繼續
3.選擇HDFS,點擊繼續
4.選擇主機,點擊繼續
5.選擇數據庫,點擊測試,以後點擊繼續,一路下一步直至最後一步(這個操做必定要在添加服務以前操做)
6.返回主頁查看已添加的服務
7.hive中開啓sentry服務
勾選Hive Metastore Server Default Group
取消hiveserver2,不然會有配置錯誤的報錯
1.在Hive集羣全部節點建立兩個組reader、writer,並分別在對應的組下建立reader、writer用戶
登錄cdh所在的服務器建立如下用戶 useradd reader -s /sbin/nologin useradd writer -s /sbin/nologin
在這以前必定要安裝krb5 client和配置hive環境變量,並將cdh6的hive和 sentry的最新客戶端配置文件下載下來,替換調hive conf中的配置 kinit -kt /opt/all.keytab hive/cdh6-krb5.senses-ai.com@CDH6.COM beeline -u "jdbc:hive2://cdh6-krb5.senses-ai.com:10000/default;principal=hive/cdh6-krb5.senses-ai.com@CDH6.COM"
3.建立sentry admin role 受權,這樣就能夠經過hive用戶管理sentry權限
create role admin_role; grant all on server server1 to role admin_role; grant role admin_role to group hive; 以後能夠show databases; 進行驗證查看數據庫
4.建立Role(sunwenbo_writer_role,sunwenbo_reader_role)
CREATE ROLE sunwenbo_writer_role; CREATE ROLE sunwenbo_reader_role; 銷燬Role DROP ROLE sunwenbo_reader_role;
5.爲role賦予權限
GRANT select ON DATABASE sunwenbo TO ROLE sunwenbo_reader_role; GRANT all ON DATABASE sunwenbo TO ROLE sunwenbo_writer_role; 若是權限賦予要精確到表,那麼能夠用如下方式 GRANT insert ON TABLE swb123.spark021109 to role sunwenbo_writer_role; 撤銷權限(結合GRANT可實現權限修改操做) REVOKE insert ON DATABASE sunwenbo FROM ROLE sunwenbo_writer_role; REVOKE insert ON TABLE swb123.spark021109 FROM ROLE sunwenbo_writer_role;
6.將role授予用戶組
GRANT ROLE sunwenbo_reader_role TO GROUP reader; GRANT ROLE sunwenbo_writer_role TO GROUP writer; 查看組受權角色 SHOW ROLE GRANT GROUP reader; SHOW ROLE GRANT GROUP writer; 查看全部role(管理員) SHOW ROLES; 查看指定用戶組的role SHOW ROLE GRANT GROUP reader; 查看當前認證用戶的role SHOW CURRENT ROLES; 查看指定ROLE的具體權限 SHOW GRANT ROLE admin_role;
1.爲reader、writer建立Kerberos主體、登錄192.168.10.181
kadmin.local -q "addprinc reader/reader" Authenticating as principal root/admin@HADOOP.COM with password. WARNING: no policy specified for reader/reader@HADOOP.COM; defaulting to no policy Enter password for principal "reader/reader@HADOOP.COM": (輸入密碼) Re-enter password for principal "reader/reader@HADOOP.COM": (輸入密碼) Principal "writer/writer@HADOOP.COM" created. kadmin.local -q "addprinc writer/writer" Authenticating as principal root/admin@HADOOP.COM with password. WARNING: no policy specified for writer/writer@HADOOP.COM; defaulting to no policy Enter password for principal "reader/reader@HADOOP.COM": (輸入密碼) Re-enter password for principal "writer/writer@HADOOP.COM": (輸入密碼) Principal "writer/writer@HADOOP.COM" created.
2.將keytab文件生成到指定目錄/root/all.keytab
kadmin.local -q "xst -k /root/all.keytab writer/writer@CDH6.COM reader/reader@CDH6.COM"
3.使用reader登陸HiveServer2,查詢sunwenbo庫下的任意一張表
kinit -kt /opt/all.keytab reader/reader@CDH6.COM beeline -u "jdbc:hive2://cdh6-krb5.senses-ai.com:10000/default;principal=hive/cdh6-krb5.senses-ai.com@CDH6.COM"
4.使用writer登陸HiveServer2,查詢sunwenbo庫下的任意一張表及swb123庫下的spark021109表
kinit -kt /opt/all.keytab reader/reader@CDH6.COM beeline -u "jdbc:hive2://cdh6-krb5.senses-ai.com:10000/default;principal=hive/cdh6-krb5.senses-ai.com@CDH6.COM"
5.sentry hive權限控制相關命令
#權限分爲 SELECT ,INSERT ,ALL #查看全部role show roles; #建立role create role role_name; #刪除role drop role role_name; #將某個數據庫讀權限授予給某個role GRANT SELECT ON DATABASE db_name TO ROLE role_name; #將test 表的 S1 列的讀權限受權給role_name (TABLE也能夠不寫) GRANT SELECT(s1) ON TABLE test TO ROLE role_name; #查看role_name 在數據庫db_name中權限 SHOW GRANT ROLE role_name ON DATABASE db_name; #查看role_name 在表test中的權限 SHOW GRANT ROLE role_name ON TABLE test; #將role_name 權限給予user_name用戶 GRANT ROLE role_name TO USER user_name; #將role_name 權限給予user_group用戶組 GRANT ROLE role_name TO GROUP user_group; #查看某個用戶下全部賦予的role權限 SHOW ROLE GRANT USER user_name; #查看某個用戶組下全部賦予的role權限 SHOW ROLE GRANT GROUP user_group; #查看某個role下的權限信息 SHOW GRANT ROLE role_name; #回收role_name對數據庫db_name的SELECT 權限 REVOKE SELECT ON DATABASE db_name FROM ROLE role_name; #回收role_name對錶test的SELECT 權限 revoke select on [table] test from role role_name; #回收某個group下role權限 REVOKE ROLE role_name [, role_name] FROM GROUP (groupName) [,GROUP (groupName)]