Apache Ranger安全区介绍
本文主要介绍大数据安全管理系统Apache Ranger的安全区Security Zone,根据官方文档人工翻译而来。介绍Apache Ranger为很多Hadoop组件服务和非Hadoop服务提供授权和访问审计服务,比如HDFS, Hive, HBase, YARN, Kafka, Storm, Knox, Atlas, NiFi, Solr等。另外,Apache Ra...
本文主要介绍大数据安全管理系统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接口,使得与其它应用的集成更简单。
在本文中,我们将介绍一种新的特性“安全区”,它将允许分配一个服务中的资源到多个区域中,以便更好地进行安全策略管理。可以使多个管理员基于已赋予管理权限的区域为服务设置安全策略。
例如,让我们考虑两个安全区“财务”和“销售”:
- 安全区“财务”包含hive 仓库中名为“财务”的所有内容
- 安全区“销售”包含hive 仓库中名为“销售”的所有内容
- 用户和组的集合被指定为每个安全区的管理员
- 用户只能在他们作为管理员的安全区中设置策略
- 安全区中定义的策略仅适用于区域中的资源
- 可以扩展区域以包括来自多个服务(例如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)安全区中的策略。
更多推荐
所有评论(0)