Apache Sentry架构介绍
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
cdh版本的hadoop在對數據安全上的處理通常采用Kerberos+Sentry的結構。
kerberos主要負責平臺用戶的權限管理,sentry則負責數據的權限管理。
下面我們來依次了解一下:
Kerberos包含一個中心節(jié)點和若干從節(jié)點,所有節(jié)點的Kerberos認證信息都要與中心節(jié)點的規(guī)則配置文件/etc/krb5.conf保持一致。安全認證均需通過中心節(jié)點,配置了安全認證的用戶可以登錄到集群內的 機器。
Kerberos的配置文件有兩個:
1、/var/kerberos/krb5kdc/kdc.conf:包括KDC的配置信息。默認放在 /usr/local/var/krb5kdc。或者通過覆蓋KRB5_KDC_PROFILE環(huán)境變量修改配置文件位置。
2、/etc/krb5.conf:包含Kerberos的配置信息
Kerberos的管理對象稱為principal(規(guī)則), 與HDFS中的用戶一一對應。一般我們將hdfs設置為principal的管理員,它可以創(chuàng)建刪除其他的principal,還可以生成其他成員的keytab。keytab是每個principal對應的密鑰文件,當kerberos認證使用keytab時,可以不需要輸入密碼,類似于SSH的信任機制。
當我們配置Kerberos的時候,系統(tǒng)會默認生成用戶,格式一般為【用戶名/hostname@domain_name】,一般情況下我們使用自己定義的用戶,不要對系統(tǒng)生成的用戶加以修改。
輸入kadmin.local 進入Kerberos的交互命令行。
生成keytab: xst –k testuser.keytab testuser@HTHADOOP.COM,將對應的keytab拷貝至其他位置或服務器,則相應的節(jié)點則可以通過testuser的principal連接進HDFS.
登錄到管理員賬戶: 如果在本機上,可以通過kadmin.local直接登錄。其它機器的,先使用kinit進行驗證。
kadmin.local ?kinit admin/adminkadmin
增刪改查賬戶:在管理員的狀態(tài)下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令。
kamdin:addprinc -randkey hdfs/hadoop1kamdin:delprinc hdfs/hadoop1kamdin:listprincs命令
生成keytab:使用xst命令或者ktadd命令
kadmin:xst -k /xxx/xxx/kerberos.keytab hdfs/hadoop1
創(chuàng)建一個新的principal: addprinc testuser@HADOOP.COM,并輸入密碼
用戶操作
查看當前的認證用戶:klist
認證用戶:kinit -kt /xx/xx/kerberos.keytab hdfs/hadoop1
刪除當前的認證的緩存: kdestroy
Apache Sentry的目標是實現授權管理,它是一個策略引擎,被數據處理工具用來驗證訪問權限。它也是一個高度擴展的模塊,可以支持任何的數據模型。當前,它支持Apache Hive和Cloudera Impala的關系數據模型,對hue的數據權限控制也有應用。
Sentry的管理對象有三個,數據庫,角色,和組。數據庫是在hive中創(chuàng)建的數據庫,角色在impala中創(chuàng)建,而組是操作系統(tǒng)的用戶組。
Sentry的權限管理操作,都通過impala語句完成。只有啟動了sentry服務,impala服務才能正常運行。
使用impala-shell進入交互終端:
show roles列出所有的角色
show databases列出所有的數據庫
create role test_role創(chuàng)建角色
drop role test_role刪除角色
可以直接輸入show命令會提示可以跟接的關鍵字
grant all on database ana_clientact to role admin_role 將一個數據庫賦權給一個角色
revoke all on database from role admin_role取消權限
如果數據庫中的是外部表,需要同時給角色賦予uri權限:
grant all on uri 'hdfs://192.168.2.121:8020/mydata' to role admin_role
列出某角色的權限:show grant role admin_role
將角色賦給一個組:grant role admin_role to group hive
完成以上操作以后,用戶組即具有了相應數據庫的操作權限。此時需要執(zhí)行invalidate metadata操作,才會生效。
當一個新的操作系統(tǒng)用戶加入這個用戶組,用戶即具有對應的數據庫權限。反之,將用戶從這個組中去掉,用戶對數據庫的操作權限即消失。
新建用戶組時要保證集群內組和用戶保持一致。
在HUE中配置權限
在HUE中,用戶的權限是分為兩個層次實現的,一個層次是HUE平臺各模塊的權限,這個通過HUE中組和權限實現的,另一個層次是HUE訪問hive,impala數據庫的權限,這個和sentry是統(tǒng)一的,HUE中的用戶和操作系統(tǒng)中的用戶一一映射,HUE通過尋找相同用戶名的操作系統(tǒng)用戶來確定對應的sentry權限。
這里需要注意一點,HUE中的組和操作系統(tǒng)的組沒有關系,HUE中的組只綁定HUE平臺自己的權限。
Apache Sentry?是Cloudera公司發(fā)布的一個Hadoop開源組件,截止目前還是Apache的孵化項目,它提供了細粒度級、基于角色的授權以及多租戶的管理模式。Sentry當前可以和Hive/Hcatalog、Apache Solr 和Cloudera Impala集成,未來會擴展到其他的Hadoop組件,例如HDFS和HBase。
特性
Apache Sentry為Hadoop使用者提供了以下便利:
- 能夠在Hadoop中存儲更敏感的數據
- 使更多的終端用戶擁有Hadoop數據訪問權
- 創(chuàng)建更多的Hadoop使用案例
- 構建多用戶應用程序
- 符合規(guī)范(例如SOX,PCI,HIPAA,EAL3)
在Sentry誕生之前,對于授權有兩種備選解決方案:?粗粒度級的HDFS授權?和?咨詢授權?,但它們并不符合典型的規(guī)范和數據安全需求,原因如下:
- 粗粒度級的HDFS授權?:安全訪問和授權的基本機制被HDFS文件模型的粒度所限制。五級授權是粗粒度的,因為沒有對文件內數據的訪問控制:用戶要么可以訪問整個文件,要么什么都看不到。另外,HDFS權限模式不允許多個組對同一數據集有不同級別的訪問權限。
- 咨詢授權?:咨詢授權在Hive中是一個很少使用的機制,旨在使用戶能夠自我監(jiān)管,以防止意外刪除或重寫數據。這是一種“自服務”模式,因為用戶可以為自己授予任何權限。因此,一旦惡意用戶通過認證,它不能阻止其對敏感數據的訪問。
通過引進Sentry,Hadoop目前可在以下方面滿足企業(yè)和政府用戶的RBAC需求:
- 安全授權?:Sentry可以控制數據訪問,并對已通過驗證的用戶提供數據訪問特權。
- 細粒度訪問控制?:Sentry支持細粒度的Hadoop數據和元數據訪問控制。在Hive和Impala中Sentry的最初發(fā)行版本中,Sentry在服務器、數據庫、表和視圖范圍提供了不同特權級別的訪問控制,包括查找、插入等,允許管理員使用視圖限制對行或列的訪問。管理員也可以通過Sentry和帶選擇語句的視圖或UDF,根據需要在文件內屏蔽數據。
- 基于角色的管理?:Sentry通過基于角色的授權簡化了管理,你可以輕易將訪問同一數據集的不同特權級別授予多個組。
- 多租戶管理?:Sentry允許為委派給不同管理員的不同數據集設置權限。在Hive/Impala的情況下,Sentry可以在數據庫/schema級別進行權限管理。
- 統(tǒng)一平臺?:Sentry為確保數據安全,提供了一個統(tǒng)一平臺,使用現有的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中支持對?列?進行授權。
- 權限?。授權訪問某一個資源的規(guī)則。
- 角色?。角色是一系列權限的集合。
- 用戶和組?。一個組是一系列用戶的集合。Sentry 的組映射是可以擴展的。默認情況下,Sentry使用Hadoop的組映射(可以是操作系統(tǒng)組或者LDAP中的組)。Sentry允許你將用戶和組進行關聯,你可以將一系列的用戶放入到一個組中。Sentry不能直接給一個用戶或組授權,需要將權限授權給角色,角色可以授權給一個組而不是一個用戶。
架構
下面是Sentry架構圖,圖片來自《?Apache Sentry architecture overview?》。
Sentry的體系結構中有三個重要的組件:一是Binding;二是Policy Engine;三是Policy Provider。
Binding
Binding實現了對不同的查詢引擎授權,Sentry將自己的Hook函數插入到各SQL引擎的編譯、執(zhí)行的不同階段。這些Hook函數起兩大作用:一是起過濾器的作用,只放行具有相應數據對象訪問權限的SQL查詢;二是起授權接管的作用,使用了Sentry之后,grant/revoke管理的權限完全被Sentry接管,grant/revoke的執(zhí)行也完全在Sentry中實現;對于所有引擎的授權信息也存儲在由Sentry設定的統(tǒng)一的數據庫中。這樣所有引擎的權限就實現了集中管理。
Policy Engine
這是Sentry授權的核心組件。Policy Engine判定從binding層獲取的輸入的權限要求與服務提供層已保存的權限描述是否匹配。
Policy Provider
Policy Provider負責從文件或者數據庫中讀取出原先設定的訪問權限。Policy Engine以及Policy Provider其實對于任何授權體系來說都是必須的,因此是公共模塊,后續(xù)還可服務于別的查詢引擎。
基于文件的提供者使用的是ini格式的文件保存元數據信息,這個文件可以是一個本地文件或者HDFS文件。下面是一個例子:
?[groups]
# Assigns each Hadoop group to its set of roles
manager = analyst_role, junior_analyst_role
analyst = analyst_role
admin = admin_role
[roles]
analyst_role = server=server1->db=analyst1, \
server=server1->db=jranalyst1->table=*->action=select, \
server=server1->uri=hdfs://ha-nn-uri/landing/analyst1, \
server=server1->db=default->table=tab2
# Implies everything on server1.
admin_role = server=server1
基于文件的方式不易于使用程序修改,在修改過程中會存在資源競爭,不利于維護。Hive和Impala需要提供工業(yè)標準的SQL接口來管理授權策略,要求能夠使用編程的方式進行管理。
Sentry策略存儲和服務將角色和權限以及組合角色的映射持久化到一個關系數據庫并提供編程的API接口方便創(chuàng)建、查詢、更新和刪除。這允許Sentry的客戶端并行和安全地獲取和修改權限。
Sentry策略存儲可以使用很多后端的數據庫,例如MySQL、Postgres等等,它使用ORM庫DataNucleus來完成持久化操作。Sentry支持kerberos認證,也可以擴展代碼支持其他認證方式。
使用
和Hive集成
Sentry策略引擎通過hook的方式插入到hive中,hiveserver2在查詢成功編譯之后執(zhí)行這個hook。
這個hook獲得這個查詢需要以讀和寫的方式訪問的對象,然后Sentry的Hive binding基于SQL授權模型將他們轉換為授權的請求。
策略維護:
策略維護包括兩個步驟。在查詢編譯期間,hive調用Sentry的授權任務工廠來生產會在查詢過程中執(zhí)行的Sentry的特定任務行。這個任務調用Sentry存儲客戶端發(fā)送RPC請求給Sentry服務要求改變授權策略。
和HCatalog集成
Sentry通過pre-listener hook集成到Hive Metastore。metastore在執(zhí)行metadata維護請求之前執(zhí)行這個hook。metastore binding為提交給metastore和HCatalog客戶端的metadata修改請求創(chuàng)建一個Sentry授權請求。
一、Sentry CDH配置
安裝Sentry
使用Cloudera Manager來安裝,非常簡單,需要注意的是安裝前要在/opt/cloudera/parcels/CDH/jars目錄下放入MySQL的驅動包。
添加服務 –> Sentry
?
Sentry Database Create:
#為Sentry建數據庫sentry
mysql>create database sentry DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
1
2
Sentry集成其它組件
Sentry 集成其它組件
補充:
添加 Hive, Impala, HUE, HUE 默認超級管理員組到 Sentry admin 組
在 Clouder Manager 對 Sentry 進行配置,修改 Admin Group,添加hive,impala, hue,admin(hue的默認超級管理員),重啟 Sentry 服務。
添加admin組的原因是,我們使用admin登錄Hue,然后對角色權限進行控制。當然使用上面添加的hive、impala、hue也可以。
二、Sentry授權步驟
1.在所有節(jié)點的機器上創(chuàng)建用戶和組
2.在hue建用戶和組,這里的用戶和組要求和第一部linux的用戶和組是一樣
3.登錄管理員用戶,給其他用戶付權限
4.建role,和給role付權限
如下圖,點擊Sentry進入編輯頁面,選上test1用戶
點擊右側的 addrole
填角色名稱,角色所屬的組,和角色的權限
5.用對應的test1登錄,可以看到自己權限的數據表
四、linux加用戶組
# groupadd ?g1
# useradd ? u1
# usermod -g ? g1 u1
impala授權
SHOW CREATE table hue.auth_permission;
ALTER TABLE hue.auth_permission DROP FOREIGN KEY content_type_id_refs_id_id value;
DELETE FROM hue.django_content_type;
ALTER TABLE hue.auth_permission ADD FOREIGN KEY (content_type_id) REFERENCES django_content_type (id);
為HDFS定義URI時,還必須指定NameNode。例如:
GRANT ALL ON URI文件:/// path / to / dir TO <role>
GRANT ALL ON URI hdfs:// namenode:port / path / to / dir TO <role>
GRANT ALL ON URI hdfs:// ha -nn-uri / path / to / dir TO <role>
管理用戶的權限示例
在此示例中,SQL語句授予 entire_server 角色服務器中的數據庫和URI的所有特權。
CREATE ROLE whole_server;
GRANT ROLE whole_server TO GROUP admin_group;
GRANT ALL ON SERVER server1 TO ROLE whole_server;
具有特定數據庫和表的權限的用戶
如果用戶具有特定數據庫中特定表的權限,則用戶可以訪問這些內容,但不能訪問其他內容。他們可以在輸出中看到表及其父數據庫 顯示表格 和 顯示數據庫, 使用 適當的數據庫,并執(zhí)行相關的行動(選擇 和/或 插)基于表權限。要實際創(chuàng)建表需要所有 數據庫級別的權限,因此您可以為用戶設置單獨的角色,以設置架構以及對表執(zhí)行日常操作的其他用戶或應用程序。
CREATE ROLE one_database;
GRANT ROLE one_database TO GROUP admin_group;
GRANT ALL ON DATABASE db1 TO ROLE one_database;
CREATE ROLE instructor;
GRANT ROLE instructor TO GROUP trainers;
GRANT ALL ON TABLE db1.lesson TO ROLE instructor;
# This particular course is all about queries, so the students can SELECT but not INSERT or CREATE/DROP.
CREATE ROLE student;
GRANT ROLE student TO GROUP visitors;
GRANT SELECT ON TABLE db1.training TO ROLE student;
使用外部數據文件的權限
通過數據插入數據時 負載數據 語句,或從普通Impala數據庫目錄之外的HDFS位置引用,用戶還需要對與這些HDFS位置對應的URI的適當權限。
在這個例子中:
該 external_table 角色可以插入并查詢Impala表, external_table.sample。
該 STAGING_DIR角色可以指定HDFS路徑/用戶/ Cloudera的/ external_data與負載數據聲明。當Impala查詢或加載數據文件時,它會對該目錄中的所有文件進行操作,而不僅僅是單個文件,因此任何Impala都可以位置 參數指的是目錄而不是單個文件。
CREATE ROLE external_table;?
GRANT ROLE external_table TO GROUP cloudera;?
GRANT ALL ON TABLE external_table.sample TO ROLE external_table;?
CREATE ROLE staging_dir;?
GRANT ROLE staging TO GROUP cloudera;?
GRANT ALL ON URI'hdfs://127.0.0.1:8020 / user / cloudera / external_data'TO ROLE staging_dir;
將管理員職責與讀寫權限分開
要創(chuàng)建數據庫,您需要該數據庫的完全權限,而對該數據庫中的表的日常操作可以在特定表上使用較低級別的權限執(zhí)行。因此,您可以為每個數據庫或應用程序設置單獨的角色:可以創(chuàng)建或刪除數據庫的管理角色,以及只能訪問相關表的用戶級角色。
在此示例中,職責分為3個不同組中的用戶:
CREATE ROLE training_sysadmin;
GRANT ROLE training_sysadmin TO GROUP supergroup;
GRANT ALL ON DATABASE training1 TO ROLE training_sysadmin;
CREATE ROLE instructor;
GRANT ROLE instructor TO GROUP cloudera;
GRANT ALL ON TABLE training1.course1 TO ROLE instructor;
CREATE ROLE visitor;
GRANT ROLE student TO GROUP visitor;
GRANT SELECT ON TABLE training1.course1 TO ROLE student;
server=server_name->db=database_name->table=table_name->action=SELECT
server=server_name->db=database_name->table=table_name->action=ALL
server=impala-host.example.com->db=default->table=t1->action=SELECT
server=impala-host.example.com->db=*->table=audit_log->action=SELECT
server=impala-host.example.com->db=default->table=t1->action=*
轉載于:https://my.oschina.net/hblt147/blog/2987614
總結
以上是生活随笔為你收集整理的Apache Sentry架构介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python全栈_007_Python3
- 下一篇: Flutter组件学习(二)—— Ima