使用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的基于标签的控制策略来控制谁可以访问数据以及如何屏蔽数据。
- 在Java中如何实现“Pless presss any key to continue.”
- 震惊小伙伴的Python单行代码
- 如何打造一款可靠的WAF(Web应用防火墙)
- 为啥我的Python这么慢 (一)
- 矩阵的基本知识构造重复矩阵的方法——repmat(xxx,xxx,xxx)构造器的构造方法单位数组的构造方法指定公差的等差数列指定项数的等差数列指定项数的lg等差数列sub2ind()从矩阵索引==》
- 简单的Writer和ReaderWriter的主要方法Writer工作原理Reader的主要方法readLine():String
- 为啥我的Python这么慢 - 项查找 (二)
- 初识字节流+实现缓冲字节流OutputStream的主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回的是Int型而不是
- Properties+重温Map+本地计数器Map方法Properties的方法用Properties的好处
- SequenceInputStreamSequenceInputStream构造方法读关流刷新
- 怎么实现关闭窗口
- java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
- 不可不知的一点Python陷阱
- 10个应该早点知道的Python技巧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android开发之OpenGL绘制2D图形的方法分析
- Android实现RecyclerView下拉刷新效果
- 详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题
- Android Shader应用开发之雷达扫描效果
- Android开发之绘制平面上的多边形功能分析
- Android Surfaceview的绘制与应用
- Android SQLite数据库版本升级的管理实现
- Android自定义view实现拖拽选择按钮
- Android 中ViewPager中使用WebView的注意事项
- Android IPC机制Messenger实例详解
- Android开发之文本内容自动朗读功能实现方法
- 深入理解Android中View绘制的三大流程
- Android LocationManager获取经度与纬度等地理信息
- springboot+freemarker+bootstrap快速实现分页功能(含java源码)
- Android 中Volley二次封装并实现网络请求缓存