0745-什麼是Apache Ranger - 3

  • 2020 年 2 月 10 日
  • 筆記

作者:Eric Lin (林晨輝), Cloudera高級售後技術支援工程師。畢業於Monash大學電腦科學, Sir John Monash的獎學金獲得者。曾就業於數據收集公司如Hitwise(現為Experian的子公司)和Effective Measure,擔任高級工程師,負責設計,開發和管理用於採集, 處理和報告網路數據的平台(基於PHP,Java和CDH)。現任職Cloudera, 擔任高級售後技術支援工程師,主要擅長解決在CDH生態系統中出現的各種疑難雜症。


在閱讀本文前,建議先閱讀前面的文章:

《0741-什麼是Apache Ranger - 1》

《0742-什麼是Apache Ranger - 2》

在本文中我會介紹Ranger的安全區域(Security Zone)功能,其工作方式以及如何在Ranger Admin UI中對其進行配置。以下內容假設你已經通過Ambari或Cloudera Manager7.x安裝了Apache Ranger。

首先我們來看看什麼是安全區域(Security Zone)

安全區域(Security Zone)在Ranger中提供了將資源策略分成不同區域的功能。這有助於簡化安全策略的管理,並允許在針對某些資源進行授權時檢查數量有限的策略,因為僅載入和檢查包含請求資源的特定區域下的策略。

最重要的是,它還使多個管理員可以根據分配給他們的區域來設置不同的策略。例如,銷售管理員只能為分配了HDFS中的/sales目錄或Hive中的銷售資料庫的銷售區域(Sales Zone)下的資源設置策略,而開發管理員只能為分配了HDFS中的/dev目錄或Hive中的開發資料庫的開發區域(Development Zone)下的資源設置策略。該功能在RANGER-2232有進行說明。

添加新的安全區域非常簡單,有關詳細資訊,您可以參考Cloudera的官方文檔:Adding a Ranger security zone。這裡我不會再做介紹, 但是,要記住的一件事是,只能將一個資源分配給一個安全區域。如果嘗試使用已分配給另一個區域的資源來創建新的安全區域,則會被被拒絕。參見下圖:

其實你也沒有任何理由需要擁有同一個資源去映射到兩個不同的安全區域,這也違反了安全區域(Security Zone)的原始設計。

現在,我已經創建了兩個安全區域,讓我們繼續:

在接下來的文章中,我想演示以下內容:

如果某些資源的策略在分配給其他資源的安全區域下已經被定義,你依舊可以在其他安全區域下成功創建這些資源的策略,不過這個策略會被忽略,即不會生效。

以下是我的設置:

  • 2個區域,一個是「Sales」,另一個是「Development」
  • HDFS目錄/sales分配給Sales安全區域
  • HDFS目錄/dev分配給Development安全區域
  • 創建了2個組:sales和dev
  • 同時創建了2個用戶:user1屬於sales組,user2屬於dev組
$ groups user1  user1 : user1 sales    $ groups user2  user2 : user2 dev  

如果不設置任何策略,每個用戶都不能訪問他們的部門數據:

$ sudo -u user1 hdfs dfs -mkdir /sales/user1  mkdir: Permission denied: user=user1, access=WRITE, inode="/sales":hdfs:supergroup:drwxr-xr-x    $ sudo -u user2 hdfs dfs -mkdir /dev/user2  mkdir: Permission denied: user=user2, access=WRITE, inode="/dev":hdfs:supergroup:drwxr-xr-x  

創建Ranger策略也同樣很簡單,可以參見Cloudera官網的文檔:Configure a resource-based policies。我已經創建了2個策略,每個安全區域下有一個用於HDFS。參見下圖,Dev HDFS策略在Development Security Zone下,Sales HDFS策略是在Sales Security Zone下:

現在,我可以確認每個用戶都可以在自己的部門的HDFS路徑下創建目錄:

$ sudo -u user1 hdfs dfs -mkdir /sales/user1  $ sudo -u user1 hdfs dfs -ls /sales  Found 1 items  drwxr-xr-x   - user1 supergroup          0 2020-01-26 10:41 /sales/user1    $ sudo -u user2 hdfs dfs -mkdir /dev/user2  $ sudo -u user2 hdfs dfs -ls /dev  Found 1 items  drwxr-xr-x   - user2 supergroup          0 2020-01-26 10:42 /dev/user2  

為簡單起見,我沒有在實驗室中啟用Kerberos,因此僅使用「 sudo -u {username}」作為目標用戶運行命令,僅用於演示。

現在如果你進入Ranger Admin UI的Audits頁面,你可以查看我先前運行命令的審計歷史。我過濾了一下只顯示user1:

你可以看到第一次嘗試創建「/sales/user1」路徑時被拒絕。通過上圖的最後一欄「Zone Name」,可以發現資源/sales確實位於Sales Zone下,但我們尚未創建策略,因此Ranger沒有應用任何授權,而是退回到HDFS ACL,查看上圖「Access Enforcer」欄位的值是「hadoop-acl」。

在創建「Sales HDFS」策略以允許sales組下的所有用戶都可以訪問HDFS的/sales路徑後,我們可以看到Ranger接管了授權並授予「 user1」可以創建/sales/user1目錄 。我們還可以看到,Ranger記錄了在此過程中用於檢查的策略,查看上圖第一個欄位「Policy ID」的值為58。最後,它還授予了「 user1」執行「 -ls」操作的許可權,如上圖第一行。

現在,我將嘗試創建一個新策略,以允許user1訪問HDFS的/dev路徑,但仍位於Sales Zone下,並查看其是否生效。參見下圖:

我可以確認策略已經保存成功,但是訪問還是被拒絕。

$ sudo -u user1 hdfs dfs -mkdir /dev/user1  mkdir: Permission denied: user=user1, access=WRITE, inode="/dev":hdfs:supergroup:drwxr-xr-x  

你可以看到,Ranger嘗試檢查Development Zone下的策略,但是沒有找到任何內容(Policy ID欄的值為空),因為我們剛剛為此類訪問創建的策略實際上在另一個安全區域中,因此它將被忽略,然後Ranger回退到使用hadoop-acl。

因此你如果在做troubleshooting,一件非常重要的事是你需要確保策略是放置在正確的安全區域下。常去Ranger Admin的Audit頁面看看Ranger使用了什麼策略。

需要注意的一件事是,當根據請求的資源未找到安全區域時,Ranger將使用在安裝過程中設置的「Default」區域。這個「Default」區域沒有名稱,但存在於Ranger資料庫的Security Zone表中。

id          | 1  create_time | 2020-01-21 00:51:01.622843  update_time | 2020-01-21 00:51:01.622843  added_by_id | 1  upd_by_id   | 1  version     | 1  name        |  jsondata    |  description | Unzoned zone    id          | 2  create_time | 2020-01-25 00:56:00.276  update_time | 2020-01-25 00:56:00.283  added_by_id | 1  upd_by_id   | 1  version     | 1  name        | Sales  jsondata    | {"name":"Sales","services":{"cm_hdfs":{"resources":[{"path":["/sales"]}]},"cm_hive":{"resources":[{"database":["sales"],"column":["*"],"table":["*"]}]}},"tagServices":["cm_tag"],"adminUsers":["Eric Lin"],"adminUserGroups":[],"auditUsers":["Eric Lin"],"auditUserGroups":[],"description":"For Sales Department","id":-1,"isEnabled":true}  description | For Sales Department  jsondata    | {"name":"Sales","services":{"cm_hdfs":{"resources":[{"path":["/sales"]}]},"cm_hive":{"resources":[{"database":["sales"],"column":["*"],"table":["*"]}]}},"tagServices":["cm_tag"],"adminUsers":["Eric Lin"],"adminUserGroups":[],"auditUsers":["Eric Lin"],"auditUserGroups":[],"description":"For Sales Department","id":-1,"isEnabled":true}  description | For Sales Department    id          | 3  create_time | 2020-01-25 01:02:28.233  update_time | 2020-01-25 01:02:28.234  added_by_id | 1  upd_by_id   | 1  version     | 1  name        | Development  jsondata    | {"name":"Development","services":{"cm_hdfs":{"resources":[{"path":["/dev"]}]},"cm_hive":{"resources":[{"database":["dev"],"column":["*"],"table":["*"]}]}},"tagServices":["cm_tag"],"adminUsers":["Eric Lin"],"adminUserGroups":[],"auditUsers":["admin"],"auditUserGroups":[],"description":"For Development department","id":-1,"isEnabled":true}  description | For Development department  

你可以看到「 x_security_zone」表中存儲了一個具有「 id」為1但「name」為空的區域,這張表是Ranger用於在其Web UI中展示安全區域(Security Zone)數據的。未分配給用戶創建的安全區域的所有策略將默認為該區域。這意味著對於與任何區域都不匹配的資源,Ranger將檢索分配給該默認區域的所有策略以進行授權過程。

原文參考:

https://www.ericlin.me/2020/01/introduction-to-apache-ranger-part-iii/

Tags: