Apache Ranger:運維管理的神兵利器

Ranger的中文釋義是「園林管理員」。正如其名,Apache Ranger很好的承擔了Hadoop這個大園林的管理員職責。Ranger提供了一個集中式的安全管理框架,用戶能夠經過操做Ranger控制檯來配置各類策略,從而實現對Hadoop生態組件如HDFS、Hive、HBase、Yarn等進行細粒度的數據訪問控制。java

根據Apache Ranger官網所述,Ranger主要實現如下功能:web

(1)經過統一的中心化管理界面或者REST接口來管理全部安全任務,從而實現集中化的安全管理;
(2)經過統一的中心化管理界面,對Hadoop組件/工具的操做/行爲進行細粒度級別的控制;
(3)提供了統一的、標準化的受權方式;
(4)支持基於角色的訪問控制、基於屬性的訪問控制等多種訪問控制手段;
(5)支持對用戶訪問和(與安全相關的)管理操做的集中審計。shell

目前,Ranger的最新版本是2.1.0,普遍使用的版本是1.2.0。數據庫

(一)Ranger的架構

Ranger主要由如下三個組件構成:
(1)Ranger Admin:Ranger Admin是Ranger的核心模塊,它內置了一個Web管理頁面,用戶能夠經過這個Web管理界面或者REST接口來制定安全策略。
(2)Agent Plugin:Agent Plugin是嵌入到Hadoop生態組件中的插件,它按期從Ranger Admin拉取策略並執行,同時記錄操做記錄以供審計。
(3)User Sync:User Sync將操做系統用戶/屬組(Users/Groups)的權限數據同步到Ranger的數據庫中。apache

它們之間的關係以下圖所示:
Apache Ranger:運維管理的神兵利器json

(二)Ranger的工做流程

Ranger Admin是Apache Ranger和用戶交互的主要界面。當用戶登陸Ranger Admin時,能夠針對不一樣的Hadoop組件制定不一樣的安全策略;當策略制定好並保存以後,Agent Plugin按期(默認是30秒)從Ranger Admin拉取該組件配置的全部策略,並緩存到本地。這樣,當有用戶來請求Hadoop組件的數據服務時,Agent Plugin就提供鑑權服務,並將鑑權結果反饋給相應的組件,從而實現了數據服務的權限控制功能。當用戶在Ranger Admin中修改配置策略後,Agent Plugin會拉取新策略並更新;若是用戶在Ranger Admin中刪除了配置策略,那麼Agent Plugin的鑑權服務也沒法繼續使用。api

以Hive爲例。Hive提供了2個接口給開發者實現本身的受權策略,分別是org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizerFactory和org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizer。其中,HiveAuthorizerFactory用來生成HiveAuthorizer的相關實例。HiveAuthorizer在初始化時,會啓動一個PolicyRefresher線程定時的從Ranger Admin拉取全部Hive相關的策略,寫入本地臨時json文件並更新緩存,當須要受權時直接根據緩存的策略進行受權。具體流程以下圖所示:緩存

Apache Ranger:運維管理的神兵利器

(三)Ranger運維實戰

人員,角色和權限一直是系統設計和運維重點關注的領域。若是不創建一套完善的人員、角色和權限關係,那麼一個「非法用戶」就有可能輕易地訪問甚至篡改系統的資源和數據。相比於Unix/Linux系統簡單的用「用戶/用戶組」來設定權限,Apache Ranger提供了界面更友好的、操做更方便的Web頁面來創建一套完善的人員、角色和權限關係,讓通過受權的用戶能夠合法地訪問已受權的資源和數據,而將那些未經受權的「非法用戶」完全「拒之門外」。安全

此外Ranger還支持臨時策略建立,實現對其餘用戶的臨時受權。當臨時受權的用戶完成相關操做後,再刪除這些臨時策略,從而方便、快捷地實現用戶的臨時受權。架構

以HDFS爲例。咱們在Ranger Admin中選擇Services Manager,而後再點擊HDFS組件,就能進入HDFS策略編輯頁面。以下圖所示:
Apache Ranger:運維管理的神兵利器

點擊Add New Policy按鈕,就能夠開始制定安全策略了。在實際生產環境上,咱們制定的一個具體安全策略以下圖所示:

Apache Ranger:運維管理的神兵利器

從上圖能夠看到,這個策略是容許應用系統的admin、test0822-2等用戶,訪問HDFS組件的/user、/user/rangerpath/、/user/rangerpath/data、/user/rangerpath/data/allday等路徑、並在路徑下執行命令的策略。須要注意的是,因爲咱們在制定策略時未打開recursive(遞歸)開關,因此用戶能訪問/user目錄,並不能保證他有權限訪問該目錄的下一層目錄。所以咱們依次指定了這些用戶能訪問的具體目錄。
在Audit標籤,咱們能夠很清晰的看到審計和狀態信息,如系統登陸記錄、策略鑑權記錄、Agent Plugin狀態等,以下圖所示:

Apache Ranger:運維管理的神兵利器

Ranger對Hive的支持也很是完善。它不只支持表級的訪問控制,還能細化到字段級的訪問控制。同時,Ranger還支持字段級的加密和行級別的過濾。這些手段很是適合臨時受權時,限制臨時用戶的訪問權限。

制定Hive策略的方式與HDFS基本一致。咱們制定的訪問策略以下圖所示:

Apache Ranger:運維管理的神兵利器

在Masking標籤頁,能夠制定字段級的加密策略。以下圖所示:

Apache Ranger:運維管理的神兵利器

在上圖中,咱們制定的策略是:不讓Hadoop屬組的damp用戶,看到foodmart數據庫customer表lname字段的真實數據。這個字段的數據,將以hash值的方式展示給damp用戶。當damp訪問這張表時,他查詢的結果以下圖所示:

Apache Ranger:運維管理的神兵利器

在Row Level Filter標籤頁,咱們能夠制定行級的過濾策略。咱們制定了一個簡單的策略:不讓damp用戶,看到customer表fname是Sheri的記錄,以下圖所示:
Apache Ranger:運維管理的神兵利器

此時,damp用戶沒法看到customer表fname=’Sheri’的記錄:

Apache Ranger:運維管理的神兵利器
須要注意的是,Ranger經過Usersync組件,將操做系統的用戶同步到了hive組件中。所以在配置Hive組件的策略時,須要用hive管理員對應的操做系統帳號登陸Ranger Admin,才能配置成功。不然會提示:
Apache Ranger:運維管理的神兵利器

(四)Ranger策略的批量操做

隨着信息化進程的加快和深刻,信息系統的應用範圍逐步拓寬,信息系統的使用人員也愈來愈多,對用戶權限的需求也愈來愈多。此外,大數據思惟逐漸深刻人心,對數據的臨時訪問需求也隨之增多。若是用傳統手工的方式逐一添加安全策略,會形成極大的人力浪費,也很容易發生錯誤。針對這一場景,咱們用java程序,對Ranger的安全策略進行批量的增、刪、改、查,極大的提高了運維效率。

咱們先實現一個訪問Ranger Api的基礎類,代碼以下所示:

public ApiResult execRangerApi(String url, String method, String requestBody) {
    HadoopConfig.Ranger ranger = this.hadoop.getRanger();
    String baseUrl = ranger.getApiBaseUrl();
    String user = ranger.getUser();
    String password = ranger.getPassword();
    String fullUrl = baseUrl + url;
    String auth = user + ":" + password;
    String authInfo = DatatypeConverter.printBase64Binary(auth.getBytes());
    HttpRequest request = null;
    if (method.equalsIgnoreCase("GET")) {
      request = HttpRequest.get(fullUrl);
    } else if (method.equalsIgnoreCase("POST")) {
      request = HttpRequest.post(fullUrl);
    } else if (method.equalsIgnoreCase("PUT")) {
      request = HttpRequest.put(fullUrl);
    } else if (method.equalsIgnoreCase("DELETE")) {
      request = HttpRequest.delete(fullUrl);
    } 
    ((HttpRequest)((HttpRequest)((HttpRequest)request.header("Authorization", "Basic " + authInfo))
      .header("Accept", "application/json"))
      .header("Content-Type", "application/json"))
      .header("X-XSRF-HEADER", "valid");
    if (requestBody != null && !requestBody.isEmpty())
      request.body(requestBody); 
    HttpResponse response = request.execute();
    ApiResult result = new ApiResult(this);
    result.setHttpCode(response.getStatus());
    result.setBodyRaw(response.body());
    return result;
  }

基於這個基礎類,咱們能夠進一步設計出增長、刪除、修改和查詢Ranger策略的實現類,基礎代碼以下:

public void savePolicy(String policyName, List<String> paths, boolean isPathAdd, String appUser, List<PolicyAccess> accesses, boolean isReclusive) {
    ApiResult result = null;
    Policy policy = getPolicyByName(policyName);
    ......
    Gson gson = new Gson();
    if (isNewPolicy) {
      logger.info("create policy, content:" + gson.toJson(policy));
      result = execRangerApi("/public/v2/api/policy/", "POST", gson.toJson(policy));
      if (result.getHttpCode() != 200)
        throw new DMCException(String.format("create policy failed! ranger return : %d, %s", new Object[] { Integer.valueOf(result.getHttpCode()), result.getBodyRaw() })); 
      logger.info("create policy ok! " + policyName);
    } else {
      logger.info("edit policy, content:" + gson.toJson(policy));
      result = execRangerApi("/public/v2/api/policy/" + policy.getId(), "PUT", gson.toJson(policy));
      if (result.getHttpCode() != 200)
        throw new DMCException(String.format("edit policy failed! ranger return : %d, %s", new Object[] { Integer.valueOf(result.getHttpCode()), result.getBodyRaw() })); 
      logger.info("edit policy ok! " + policyName);
    } 
  }

最後,咱們能夠經過curl命令,將咱們制定的安全策略傳給Ranger Admin,從而實現安全策略的批量處理。參考命令以下所示:

curl -H "Content-Type:application/json" -H "X-Token:token-name" -X POST "http://web-url&appUser=user-name" -d"[\"ranger-policy"]"

綜上所述,Apache Ranger提供了豐富的Hadoop組件,幫助咱們更好地實現各類安全策略。同時,Ranger策略的定製方便快捷、簡單易懂,而且能夠「用後即焚」,很是適用於臨時受權的場景。咱們有理由相信,隨着Hadoop生態圈的不斷擴大,Ranger會受到愈來愈多運維人員的青睞和使用。

參考資料:
1.http://ranger.apache.org/
2.ZTE中興,Ranger培訓材料

原文來自:http://dwz-9.cn/3p42b

相關文章
相關標籤/搜索