Apache Ranger:运维管理的神兵利器

2021年09月15日 阅读数:1
这篇文章主要向大家介绍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