本篇文章主要介绍如何在CDP DC7.0.3集群中使用Ranger在Hive中进行行过滤及列脱敏,行级别的过滤相当于一个强制性的where子句,例如在订单表中,员工仅被允许查看自己所在地区的订单,其他区域的无法查看。列脱敏可以对某些敏感信息的列进行数据屏蔽,例如身份证号可以屏蔽中间的八位。
测试环境
1.操作系统Redhat7.6
2.CDP DC7.0.3
3.集群已启用Kerberos
4.使用root用户操作
使用Ranger配置Hive中的行过滤2.1 对表配置单个行过滤条件
在配置Hive中的行过滤前,需要确保授权的用户/用户组已有对要过滤的表的访问权限,即在授权给ranger_user1用户对表t1的行过滤策略前,ranger_user1需要对t1有访问权限。
1.配置ranger_user1对表t1的访问策略
配置完成后保存
2.使用ranger_user1查询t1表
用户ranger_test1对表t1有select权限,一共查询出7条记录
3.配置行过滤策略
配置完成后保存
4.使用用户ranger_test1再次访问t1表
可以看到,此时name=Tom的那条数据已经被过滤,查询结果只有6条数据。
2.2 对表配置多个行过滤条件
针对同一个表中可以配置多个行过滤条件,例如每个租户只能看到自己的数据行,下面测试对同一个表配置多个行过滤条件。
1.在所有节点创建一个新的测试用户ranger_user2,并创建Kerberos用户
2.修改访问表t1的策略,以及行过滤策略
·访问策略修改,加入ranger_user2
·行过滤策略修改,加入对ranger_user2的过滤条件
3.使用ranger_user2查询t1表
可以看到ranger_user2无法查看到name=Eric的这一条数据
4.再次使用ranger_user1查询t1表
可以看到ranger_user1仍然无法查看到name=Tom的这一条数据
由此可见,针对同一个表配置的多个行过滤条件均生效。
使用Ranger配置Hive中的列脱敏Ranger的列屏蔽功能可以近乎实时地保护Hive中的敏感数据,可以通过设置策略,动态屏蔽或匿名化敏感的数据列,例如可以屏蔽一列的前四个或后四个字符,也可以将整列数据都屏蔽,下面会演示屏蔽的各种规则。
准备一张测试表,数据如下:
3.1 Redact
该方式是将所有字母用x代替,所有的数字字符用n代替。
1.新建列脱敏策略,使用password列进行测试
点击Add添加策略
2.使用ranger_user1进行测试,需要注意的是列脱敏的策略也是基于该用户能够访问t1表的前提才能生效。
可以看到,除了一行数据中的特殊字符外,其余的数字和字母都进行了相应的替换
3.2 Partial mask: show last 4
该方式是仅显示最后四个字符
1.修改策略,使用phone数据列进行测试
修改完成后保存策略
2.查询t1表进行测试
由上图可见,手机号这一列只显示了最后四个字符
3.3 Partial mask: show first 4
该方式是仅显示最前面四个字符
1.修改策略,使用phone列进行测试
2.查询t1表进行测试
3.4 Hash
将所有字符替换为整个单元格的值对应的哈希
1.修改策略,使用name列进行测试
修改完成后保存策略
2.查询t1表进行测试
3.5 Nullify
将所有字符替换为NULL值
1.修改策略,使用name列进行测试
2.查询t1表进行测试
3.6 Date
仅显示日期字符串的年份部分,并且默认月份和日期为01/01
1.修改策略,使用create_date列进行测试
2.查询t1表进行测试
由上图可见,日期一列只显示了年份,月份和日期使用了01-01进行代替。
3.7 Custom
该方式指定自定义的值或表达式,同时也可以使用任何有效的自定义的UDF
1.修改策略,使用phone列进行测试,屏蔽掉中间的四位数字
2.查询t1表进行测试
如上图可见,phone对应的数据中间的四位数字都被屏蔽了。
总结1.Hive的行过滤可以对同一张表针对不同用户配置多个条件,可以满足实际场景的很多需要,例如在访问该表时不同的租户只能看到自己的数据。
2.Hive的行过滤有助于简化Hive查询。配置了行过滤相当于提供默认的where子句,Hive每次尝试访问数据时都会应用该条件,这有助于简化Hive查询的编写,不需要再将where子句添加到原本的查询语句中。
3.Hive的列脱敏中每个列都应具有单独的屏蔽策略,同一个策略只能针对一个列,在处理访问请求时,会按照策略中条件的顺序进行屏蔽。
4.Hive的列脱敏不支持通配符的匹配。如表和字段不能配置为*值。
5.在使用Date进行列脱敏时,Hive中对应字段的格式需要是时间类型,在测试中使用的date类型。
6.在对列进行脱敏时,除了使用指定的选项外,还可以用自定义的表达式或者UDF来进行脱敏。