使用ABAC控制数据访问

时间:2022-07-23
本文章向大家介绍使用ABAC控制数据访问,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文档编写目的

Cloudera数据平台(CDP)利用用于数据安全性和治理的最佳工具-Apache Atlas和Apache Ranger。管理员可以轻松地基于Atlas元数据标签定义安全策略,并将安全策略实时应用于实体的整个层次结构,包括数据库、表和列。

本教程将学习如何对数据进行分类,谁可以访问数据以及如何屏蔽数据。

内容概述

1) 测试环境构建

2) 通过Atlas创建分类

3) 通过Ranger创建基于标签的策略

4) 测试验证

测试环境

1) CM和Cloudera Runtime版本为7.1.1

2) Redhat7.7

3) 拥有Cloudera Manager的管理员账号

4) CDP-DC集群已经构建完成

5) 集群已启用Kerberos

测试环境搭建

我们用于测试的环境包括:

• 一个Hive表(employee_data)-专注于salary列。

• 平台上有三个数据处理和分析用户(您的环境将有所不同)

• etl_user,用户/管理员;属于etl组

• joe_analyst,用户; 属于analyst和us_employee组

• ivanna_eu_hr,用户;属于hr和eu_employee组

目前平台如下:

建表

使用etl_user用户登录hue,并切换到Hive引擎

通过hue的hive创建表并添加初始化数据。

CREATE DATABASE IF NOT EXISTS dbgr;
CREATE TABLE IF NOT EXISTS dbgr.employee_data (
 id INT,
 first_name  STRING,
 last_name   STRING,
 email       STRING,
 title       STRING,
 salary      DECIMAL(10,2)
);

INSERT INTO dbgr.employee_data
 SELECT INLINE(array(
struct(1  ,  "Patty"     ,  "Harvison"   ,  "PattyHarvison@somewhere.com"     ,  "Accountant I"              ,  48532.04)
,struct(2  ,  "Abbey"     ,  "Ledingham"  ,  "AbbeyLedingham@somewhere.com"    ,  "Marketing Assistant"       ,  58700.35)
,struct(3  ,  "Tricia"    ,  "Budgey"     ,  "TriciaBudgey@somewhere.com"      ,  "Nuclear Power Engineer"    ,  48081.25)
,struct(4  ,  "Saraann"   ,  "Corwin"     ,  "SaraannCorwin@somewhere.com"     ,  "Professor"                 ,  49246.32)
,struct(5  ,  "Reese"     ,  "Bownes"     ,  "ReeseBownes@somewhere.com"       ,  "Marketing Manager"         ,  70615.84)
,struct(6  ,  "Jennee"    ,  "Hawson"     ,  "JenneeHawson@somewhere.com"      ,  "Clinical Specialist"       ,  61017.10)
,struct(7  ,  "Malinde"   ,  "Kabsch"     ,  "MalindeKabsch@somewhere.com"     ,  "Developer I"               ,  48767.52)
,struct(8  ,  "Darline"   ,  "Wagstaffe"  ,  "DarlineWagstaffe@somewhere.com"  ,  "Quality Engineer"          ,  61330.88)
,struct(9  ,  "Rhona"     ,  "Damarell"   ,  "RhonaDamarell@somewhere.com"     ,  "Legal Assistant"           ,  42030.92)
,struct(10 ,  "Dagmar"    ,  "Sandom"     ,  "DagmarSandom@somewhere.com"      ,  "Staff Scientist"           ,  74302.82)
,struct(11 ,  "Debora"    ,  "Bielfelt"   ,  "DeboraBielfelt@somewhere.com"    ,  "Assistant Media Planner"   ,  59329.91)
,struct(12 ,  "Yule"      ,  "Morigan"    ,  "YuleMorigan@somewhere.com"       ,  "Systems Administrator II"  ,  72053.94)
,struct(13 ,  "Clarette"  ,  "Naptine"    ,  "ClaretteNaptine@somewhere.com"   ,  "GIS Technical Architect"   ,  74593.99)
,struct(14 ,  "Leonard"   ,  "Petrik"     ,  "LeonardPetrik@somewhere.com"     ,  "Financial Analyst"         ,  49876.08)
,struct(15 ,  "Colver"    ,  "Scudamore"  ,  "ColverScudamore@somewhere.com"   ,  "Media Manager IV"          ,  55048.58)
));

查询数据,验证数据是否插入成功

select * from dbgr.employee_data;

可以看到有我们刚插入的15条数据。

通过atlas创建分类

使用admin用户登录atlas:

2.点击Classification,点击+号,来新建一个分类

我们这里创建一个sensitive的分类

1) Name sensitive

2) Description holds sensitive data

然后点击create,创建分类:

搜索我们要分配此新分类的表。

使用以下搜索条件:

1) Basic search

2) Search By Type hive_table

3) Search By Text employee_data

4) Click on Search

5) Click on table name - employee_data

让我们为salary字段分配新的sensitive分类:

1) 单击Schema

2) 单击salary字段旁边的+号

3) 选择sensitive和Propagate选项

4) 点击Add

通过Ranger创建基于标签的策略

使用admin用户打开ranger

创建基于标签的策略

让我们创建一个基于标签的策略,也称为基于访问的属性控制(ABAC)。

1) 点击Access Manager

2) 选择 Tag Based Policies

3) 单击cm_tag 以编辑现有服务

注意:您的服务名称可能与我们的名称不同。

我们有两种策略类型可供选择:Access和Masking。让我们看看两者。

访问策略允许我们对特别标记的数据列施加限制。在此示例中,我们将敏感分类列仅限制为etl组和 joe_analyst用户 。没有其他用户应该能够访问或读取标记为敏感的数据。

选择Access选项卡,然后选择添加新策略。

使用以下方法添加新策略:

1) 策略类型 Access

2) 策略名称: sensitive_access

3) 标签 :sensitive

4) 描述: access to sensitive classified columns

5) 审核记录:是

6) 已启用

7) 允许条件#1:>选择组> etl

8) 允许条件#1:>组件权限> 配置单元(所有权限)

9) 允许条件2:>选择用户> joe_analyst

10) 允许条件2:>组件权限> 配置单元(仅select权限)

11) 拒绝所有其他访问 True

12) 点击添加

创建基于资源的策略

我们先创建一个基于资源的策略,是的三个用户所在的组对dbgr库都有查询和操作权限。

点击Access Manager

选择Resource based Policies

找到Hadoop SQL服务,点击Hadoop SQL,进行基于资源的策略设置。

我们有三种策略类型可供选择:Access、Masking和Row Level Filter。让我们看看Access。

点击Add New Policy,查询一个对dbqr的访问策略。

使用以下方法添加新策略:

1) 策略类型 Access

2) 策略名称 access_dbgr

3) Database: dbgr

4) Table:*

5) Column:*

6) 审核记录:是

7) 已启用

8) 允许条件#1:>选择组> etl,analyst,hr

9) 允许条件#1:>Permission> 配置单元(所有权限)

10) 拒绝所有其他访问 True

11) 点击添加

验证测试

依次通过etl_user/joe_analyst/ivanna_eu_hr用户执行下面的语句:

SELECT * FROM dbgr.employee_data;

使用joe_analyst用户验证

可以查询到所有数据,接着尝试数据更新:

update dbgr.employee_data
set salary=61330.44
where first_name='Darline';

基于标签的访问控制只给了joe_analyst用户select权限,没有赋update权限,即使基于资源的访问控制赋给了该用户所有权限,该用户仍然无法进行数据更新。

使用ivanna_eu_hr用户验证

Ivanna_eu_hr用户没有访问*的权限,去除salary字段再次进行查询:

select id,first_name,last_name,email,title from dbgr.employee_data;

因为salary是敏感字段,配置了该敏感标签的ABAC,禁止了其他用户访问,因此ivanna_eu_hr的无法进行访问。

使用etl_user用户验证

进行salary数据更新测试

etl_user有全部操作权限,因此可以进行数据的更新。

Disable ABAC的policy

进入Ranger,依次Access Manager,Tag Based Policy,找到我们之前设置的sensitive_access policy,点击编辑:

将Policy Name旁边的enable修改成disable,然后保存:

使用ivenna_eu_hr用户进行验证

对应的策略关闭后,用户的操作就不受该策略的影响。

总结

通过Ranger和Atlas,可以使用Atlas设置的分类,通过Ranger的基于标签的控制策略来控制谁可以访问数据以及如何屏蔽数据。