CDH6 開啓kerberos Hive的Sentry 用戶權限分配

原理內容來之https://developer.aliyun.com/article/25491 數據庫

Sentry簡介:

Apache Sentry是Cloudera公司發佈的一個Hadoop開源組件,截止目前仍是Apache的孵化項目,它提供了細粒度級、基於角色的受權以及多租戶的管理模式。Sentry當前能夠和Hive/Hcatalog、Apache Solr 和Cloudera Impala集成,將來會擴展到其餘的Hadoop組件,例如HDFS和HBase。編程

  • 安全受權:Sentry能夠控制數據訪問,並對已經過驗證的用戶提供數據訪問特權。
  • 細粒度訪問控制:Sentry支持細粒度的Hadoop數據和元數據訪問控制。在Hive和Impala中Sentry的最初發行版本中,Sentry在服務器、數據庫、表和視圖範圍提供了不一樣特權級別的訪問控制,包括查找、插入等,容許管理員使用視圖限制對行或列的訪問。管理員也能夠經過Sentry和帶選擇語句的視圖或UDF,根據須要在文件內屏蔽數據。
  • 基於角色的管理:Sentry經過基於角色的受權簡化了管理,你能夠輕易將訪問同一數據集的不一樣特權級別授予多個組。
  • 多租戶管理:Sentry容許爲委派給不一樣管理員的不一樣數據集設置權限。在Hive/Impala的狀況下,Sentry能夠在數據庫/schema級別進行權限管理。
  • 統一平臺:Sentry爲確保數據安全,提供了一個統一平臺,使用現有的Hadoop Kerberos實現安全認證。同時,經過Hive或Impala訪問數據時能夠使用一樣的Sentry協議。將來,Sentry協議會被擴展到其它組件。
    如何工做:
    Apache Sentry的目標是實現受權管理,它是一個策略引擎,被數據處理工具用來驗證訪問權限。它也是一個高度擴展的模塊,能夠支持任何的數據模型。當前,它支持Apache Hive和Cloudera Impala的關係數據模型,以及Apache中的有繼承關係的數據模型。

Sentry提供了定義和持久化訪問資源的策略的方法。目前,這些策略能夠存儲在文件裏或者是能使用RPC服務訪問的數據庫後端存儲裏。數據訪問工具,例如Hive,以必定的模式辨認用戶訪問數據的請求,例如從一個表讀一行數據或者刪除一個表。這個工具請求Sentry驗證訪問是否合理。Sentry構建請求用戶被容許的權限的映射並判斷給定的請求是否容許訪問。請求工具這時候根據Sentry的判斷結果來容許或者禁止用戶的訪問請求。後端

Sentry受權包括如下幾種角色:安全

  • 資源。多是Server、Database、Table、或者URL(例如:HDFS或者本地路徑)。Sentry1.5中支持對列進行受權。
  • 權限。受權訪問某一個資源的規則。
  • 角色。角色是一系列權限的集合。
  • 用戶和組。一個組是一系列用戶的集合。Sentry 的組映射是能夠擴展的。默認狀況下,Sentry使用Hadoop的組映射(能夠是操做系統組或者LDAP中的組)。Sentry容許你將用戶和組進行關聯,你能夠將一系列的用戶放入到一個組中。Sentry不能直接給一個用戶或組受權,須要將權限受權給角色,角色能夠受權給一個組而不是一個用戶。
    架構圖:
    CDH6 開啓kerberos Hive的Sentry 用戶權限分配
    Sentry組件
    Sentry的體系結構中有三個重要的組件:一是Binding;二是Policy Engine;三是Policy Provider。

Binding
Binding實現了對不一樣的查詢引擎受權,Sentry將本身的Hook函數插入到各SQL引擎的編譯、執行的不一樣階段。
這些Hook函數起兩大做用:服務器

  • 一是起過濾器的做用,只放行具備相應數據對象訪問權限的SQL查詢;
  • 二是起受權接管的做用,使用了Sentry以後,grant/revoke管理的權限徹底被Sentry接管,grant/revoke的執行也徹底在Sentry中實現;
    對於全部引擎的受權信息也存儲在由Sentry設定的統一的數據庫中。這樣全部引擎的權限就實現了集中管理。

Policy Engine
這是Sentry受權的核心組件。Policy Engine斷定從binding層獲取的輸入的權限要求與服務提供層已保存的權限描述是否匹配。架構

Policy Provider
Policy Provider負責從文件或者數據庫中讀取出原先設定的訪問權限。Policy Engine以及Policy Provider其實對於任何受權體系來講都是必須的,所以是公共模塊,後續還可服務於別的查詢引擎。ide

Sentry策略存儲和服務將角色和權限以及組合角色的映射持久化到一個關係數據庫並提供編程的API接口方便建立、查詢、更新和刪除。這容許Sentry的客戶端並行和安全地獲取和修改權限。
CDH6 開啓kerberos Hive的Sentry 用戶權限分配函數

Sentry策略存儲能夠使用不少後端的數據庫,例如MySQL、Postgres等等,它使用ORM庫DataNucleus來完成持久化操做。Sentry支持kerberos認證,也能夠擴展代碼支持其餘認證方式。工具

安裝Sentry服務:
基於CDH 6.3.2oop

1.點擊添加服務
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
2.選擇sentry,點擊繼續
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
3.選擇HDFS,點擊繼續
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
4.選擇主機,點擊繼續
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
5.選擇數據庫,點擊測試,以後點擊繼續,一路下一步直至最後一步(這個操做必定要在添加服務以前操做)
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
6.返回主頁查看已添加的服務
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
7.hive中開啓sentry服務
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
勾選Hive Metastore Server Default Group
CDH6 開啓kerberos Hive的Sentry 用戶權限分配
取消hiveserver2,不然會有配置錯誤的報錯
CDH6 開啓kerberos Hive的Sentry 用戶權限分配

  1. impala開啓sentry服務
    CDH6 開啓kerberos Hive的Sentry 用戶權限分配

CDH6建立相關用戶權限:

1.在Hive集羣全部節點建立兩個組reader、writer,並分別在對應的組下建立reader、writer用戶

登錄cdh所在的服務器建立如下用戶
useradd reader -s /sbin/nologin
useradd writer -s /sbin/nologin
  1. 使用Sentry管理員用戶hive經過beeline客戶端鏈接HiveServer2
在這以前必定要安裝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;

Kerberos新增principal:

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)]
相關文章
相關標籤/搜索