本文主要介绍大数据安全管理系统Apache Ranger的安全区Security Zone,根据官方文档人工翻译而来。

介绍

        Apache Ranger为很多Hadoop组件服务和非Hadoop服务提供授权和访问审计服务,比如HDFS、Hive、 HBase、YARN、 Kafka、Storm、 Knox、Atlas、NiFi、Solr等。另外,Apache Ranger可为服务组件提供可伸缩的密钥管理服务,比如为HDFS提供用于数据传输加密的密钥管理服务。并且支持Hive数据仓库的数据脱敏和行过滤策略。

        Apache Ranger可以管理授权策略,交互式查看同一部署环境中跨组件的资源访问情况,从一个集中的管理台界面操作使得管理更简单。同时,Apache Ranger提供丰富的Rest API接口,使得与其它应用的集成更简单。

        在本文中,我们将介绍一种新的特性“安全区”,它将允许分配一个服务中的资源到多个区域中,以便更好地进行安全策略管理。可以使多个管理员基于已赋予管理权限的区域为服务设置安全策略。

例如,让我们考虑两个安全区“财务”和“销售”:

  1. 安全区“财务”包含hive 仓库中名为“财务”的所有内容
  2. 安全区“销售”包含hive 仓库中名为“销售”的所有内容
  3. 用户和组的集合被指定为每个安全区的管理员
  4. 用户只能在他们作为管理员的安全区中设置策略 
  5. 安全区中定义的策略仅适用于区域中的资源
  6. 可以扩展区域以包括来自多个服务(例如HDFS,Hive,HBase,Kafka等)的资源,从而允许安全区管理员为所在组织服务拥有的资源设置策略。

在本文中我们将了解到安全区更详细的信息。

Apache Ranger授权

在我们深入研究安全区之前,让我们先简要了解一下Ranger的授权模型:

- Ranger 管理台, 一个WEB应用,提供UI控制台界面用于创建安全策略和交互地查看访问审计日志

- Ranger授权插件在服务组件中执行资源访问授权,比如HDFS、 Hive、 HBase、YARN、Kafka等服务,并且生成访问审计日志

- Ranger授权插件根据配置通过REST API调用Ranger管理台获得安全策略这些插件还定期从Ranger管理台拉取安全策略的变化信息。

- 每个服务(比如HDFS NameNode、HiveServer2)的安全策略在Ranger 管理台的“service”中定义。 Ranger授权插件根据配置使用指定服务的策略。

安全区

什么是安全区?

1. 安全区由一个或多个服务组件的资源设置组成。 安全区相关的例子如下:

区域: 财务 

服务: prod_hadoop; path=/finance/*, /taxes/*

服务: prod_hive; database=finance

服务: prod_kafka; topic=FIN_*

服务: test_hadoop; path=/finance/*, /taxes/*

区域: 销售

服务: prod_hadoop; path=/sales/*

服务: prod_hive; database=sales

服务: prod_kafka; topic=SALES_*

从上面可以看到,资源可以使用通配符指定 - 比如 FIN_*SALES_*

一个资源不能映射对应多个安全区,Ranger 不允许创建的安全区指定的资源匹配到另一个安全区的资源。

例如,尝试修改如上财务安全区指定HDFS资源路径为/sales/finance/* 是不允许的,因为这与销售安全区指定的HDFS 资源路径 - /sales/*冲突。

2. 用户和组的集合可以指定为每个安全区的管理员。这些用户可以为这个安全区的资源创建、修改、删除安全策略。

3. 用户和组的集合可以被授权查看访问安全区资源的审计日志。其它未授权用户不允许查看该区域资源的访问审计日志。

安全区管理

1. Ranger安全区只能由ROLE_SYS_ADMIN角色的用户创建、修改、删除。

2. 用户只能在拥有管理权限的安全区查看、获取、修改安全策略。

如何用安全区授权?

        当一个Ranger 授权插件授权一个资源访问请求时,首先判断待访问的资源属于哪个安全区。如果资源匹配到一个安全区,只有这个安全区的策略适用于访问授权。如果这个资源未匹配到任何安全区,那么用默认安全区unnamed策略进行访问授权

安全区标签策略

在给定的服务中,每个安全区可以配置从一个标签服务中的具体区域使用标签策略,这使得在资源所属的安全区可以使用不同的基于标签的授权策略。

审计日志

Ranger 授权插件生成审计日志包含访问资源所属的安全区名称,只有在本安全区拥有相应权限的用户可以查看这些审计日志。

APIs 

安全区管理

以下类捕获RangerSecurityZone 对象详情,用于REST APIs创建、获取、修改、删除安全区。Ranger安全区只能由ROLE_SYS_ADMIN角色的用户创建、修改、删除。

package org.apache.ranger.plugin.model;

public class RangerSecurityZone extends RangerBaseModelObject {

private String name;

private List<RangerSecurityZoneService> services;

private List<String> adminUsers;

private List<String> adminUserGroups;

private List<String> auditUsers;

private List<String> auditUserGroups;

}

public static class RangerSecurityZoneService {

private String serviceName;

private List<Map<String, String>> resources;

private String tagService;

private String tagServiceZone;

}

Ranger管理台提供以下 REST APIs 来管理安全区:

@Path("plugins")

@Component

public class SecurityZoneREST {

@POST

@Path("/zones")

public RangerSecurityZone createSecurityZone(RangerSecurityZone securityZone) {

// ...

}

@PUT

@Path("/zones/{name}")

public RangerSecurityZone updateSecurityZone(@PathParam("name") String zoneName,

RangerSecurityZone securityZone) {

// ...

}

@DELETE

@Path("/zones/{name}")

public void deleteSecurityZone(@PathParam("name") String zoneName) {

// ...

}

@GET

@Path("/zones/{name}")

public RangerSecurityZone getSecurityZoneByName(@PathParam("name") String zoneName) {

// ...

}

@GET

@Path("/zones/names")

public List<String> getAllZoneNames() {

// ...

}

}

根据需要将新增更多类似APIs。

策略APIs 

RangerPolicy 

RangerPolicy是用于在REST APIs 中处理策略的类。此类已更新为包含属性“zone”。如下所示:

public class RangerPolicy extends RangerBaseModelObject {

private String service;

private String zone;

private String name;

private Integer policyType;

private Integer policyPriority;

private String description;

}

在引入安全区之前创建的策略此属性设置为null策略如果未定义一个指定安全区,此属性将设置为null。请注意此属性的值是不可改变 的(immutable),即一个策略不能从一个安全区移动到另一个安全区。允许这样做可能会导致意想不到的后果,比如一个安全区中的通配符策略(如*或/*)移动到另一个安全区时将适用于另一组资源

服务REST API 

应更新对策略执行创建/更新/删除/获取操作的所有API,以强制执行安全区管理权限,即应该只允许安全区管理员更改策略和获取策略。

ServicePolicys

ServicePolicys是Ranger管理用来向Ranger授权插件发送策略的类。修改此类以包含与服务相关的安全区信息;这将由授权插件中的Ranger策略引擎用于选择授权访问资源的正确策略集。 

public class ServicePolicies implements java.io.Serializable {

private String serviceName;

private Long serviceId;

private Long policyVersion;

private Date policyUpdateTime;

private List<RangerPolicy> policies;

private RangerServiceDef serviceDef;

private String auditMode = RangerPolicyEngine.AUDIT_DEFAULT;

private TagPolicies tagPolicies;

private List<RangerSecurityZone> zones;

}

审计APIs

VXAccessAudit

VXAccessAudit是REST APIs中用于从Ranger 管理台获取访问审核详细信息的类  该类已更新为包含属性“zone” 访问资源所属的安全区名称,将由Ranger 授权插件填入值。

public class VXAccessAudit extends VXDataObject {

protected int auditType;

protected int accessResult = RangerConstants.ACCESS_RESULT_DENIED;

protected String accessType;

protected String zone;

}

XAuditREST 

获取审计日志的REST API被更新,以确保仅返回来自用户具有管理员权限的安全区的日志。

导出/导入变更 

除了对“service-name(s)”的现有支持外,还应更新导出模块以“zone-name(s)”作为参数,以便仅导出给定安全区中的策略

除了对重命名“service(s)”的现有支持外,还应更新导入模块以启用对“zone(s)”的重命名。

UI变更 (文本模型) 

考虑一个Ranger管理控制台示5个服务,如下所示:

 

以及2个安全区Sales Marketing如下所示:

Zone: Sales

prod_hdfs: /sales

prod_hbase: sales

prod_hive: sales

test_hive: sales

Zone: Marketing

prod_hdfs: /marketing

prod_hbase: marketing

prod_kafka: m_topic1, m_topic2

prod_hive: marketing

test_hive: marketing

Ranger 管理界面将显示以下内容请注意顶部的标签介绍每个安全区一个标签

 

Unzoned”选项卡显示所有服务,这些策略将适用于不属于任何安全区的资源。

 

Sales选项卡包括Sales安全区中含的服务,请注意此处未列出prod_kafka服务。服务中的策略仅适用于Sales安全区中的资源。Marketing 安全区同样如此

与前期版本的兼容

策略 APIs 

用户通过前期api创建/更新/获取/删除策略不知道安全区的概念Ranger 管理台将在默认(unnamed安全区处理API调用。

Grant/Revoke 

用于诸如Hive、HBase支持grant revoke 操作等服务的Ranger授权插件,这些操作在适当的服务中创建/更新策略。随着安全区的引入,应该增强Ranger管理台中的grant/revoke实现,以根据所涉及的资源选择要更新策略的安全区

来源于前期版本的Ranger授权插件

来源于前期版本的Ranger授权插件不知道安全区的概念,将不能识别安全区并评估安全区中的策略。但是它们应该继续使用默认(unnamed)安全区中的策略。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐