真 · 列级权限控制

  使用配置
内容纲要

概要描述


– 在很多数据敏感行业,需要更细粒度的权限控制,比较普遍的需求是 行级权限控制 和 列级权限控制。高版本的Guardian服务,可以实现界面化配置如此细粒度的权限管控。

  • 如银行数据仓库,操作人员在查询带有敏感信息的表时,需要对敏感字段进行脱敏显示。

  • 如银行数据仓库,操作人员可能属于不同的支行,他们只应该看到其所属支行的数据。比较传统的做法是,将一张大表按支行切分成多个小表或者创建多个View,但是这种做法在表或者View的管理上相当繁琐,并且无法对 update, delete 操作做行级权限控制。

这里,我们先列举下 列权限的行为:

如果需要列级权限控制, 请开启开关, 开关必须写死在hive-site.xml中, 在session中直接set不能生效:
set inceptor.security.column.authorization.enabled=true;

SELECT / DESC TABLE / SHOW CREATE TABLE / SHOW / COLUMS FROM TABLE / CREATE TABLE AS SELECT
这写操作都涉及到表中的所有列或部分列, 行为是:

  • 有表/库权限, 就有全部列权限
  • 没有表/库权限,则检查列权限,
    对于筛选所有列的语句(SELECT * FROM tab), 返回有权限的列.
    对于筛选某些特定列的语句(SELECT col1 FROM tab), 检查所有指定列的权限. 如果缺少某一个列的权限则报错.

INSERT / UPDATE / MERGE (目前MERGE是检查INSERT权限)

  • 有表/库权限, 就有全部列权限
  • 没有表/库权限,则检查列权限.

取消了COLUMN上的DELETE这项权限

  • DELETE操作都是对于所有列的, 所以检查表权限就好

CREATE TABLE LIKE 0224tab;

  • 这个操作需要表的权限,不需要到列级别的权限

详细说明


下面我们对列级权限控制进行具体测试:

  • 环境准备:Argodb5.2.3

Inceptor开启guardian之后可以进行权限控制. TDH7.0/Argodb2.0之前, 暂时不支持列级别的权限控制. 本次添加对列级别的权限控制.

1. 添加全局参数 inceptor.security.column.authorization.enabled

在inceptor/quark 参数页面,添加自定义参数 inceptor.security.column.authorization.enabled,值设置为true,配置文件为hive-site.xml,然后配置服务,重启服务。

file

2. 数据准备

使用hive用户创建测试表,并插入测试数据。

create database db_col;
use db_col;
drop table if exists t_col_orc;
create table t_col_orc (id int, name varchar2(20), age varchar2(20)) clustered by (age) into 7 buckets stored as orc_transaction;
insert into t_col_orc select 1,"transwarp",1 from system.dual;

drop table if exists t_col_orc1;
create table t_col_orc1 (id int, name varchar2(20), age varchar2(20)) clustered by (age) into 7 buckets stored as orc_transaction;
insert into t_col_orc1 select 1,"transwarp",2 from system.dual;
insert into t_col_orc1 select 1,"transwarp",3 from system.dual;

3. 创建测试用户lkw

暂时不赋任何的权限

4. 测试SELECT

[root@kv1~]# beeline -u jdbc:hive2://172.22.23.2:10000/default -n lkw -p 123456 --maxWidth=10000 --maxColumnWidth=1000
...
0: jdbc:hive2://172.22.23.2:10000/default> use db_col;
No rows affected (0.335 seconds)
--下面的告警信息需要优化
0: jdbc:hive2://172.22.23.2:10000/default> select * from t_col_orc; 
Error: COMPILE FAILED: Semantic error: [Error 10002] Line 0:0 Invalid column reference. Error encountered near token 'TOK_ALLCOLREF' (state=42000,code=10002)

在Guardian界面上对db_col.t_col_orc.id列赋SELECT权限,查询只返回id列

0: jdbc:hive2://172.22.23.2:10000/default> select * from t_col_orc;
+-----+
| id  |
+-----+
| 1   |
+-----+
1 row selected (8.941 seconds)

5. 测试DESC TABLE

DESC操作需要的也是SELECT权限, 将只会返回有权限的列

0: jdbc:hive2://172.22.23.2:10000/default> desc t_col_orc;
+-----------+------------+----------------+-----------+---------+----------+
| col_name  | data_type  | default_value  | not_null  | unique  | comment  |
+-----------+------------+----------------+-----------+---------+----------+
| id        | int        | NULL           | No        | No      |          |
+-----------+------------+----------------+-----------+---------+----------+
1 row selected (0.498 seconds)

6. 测试INSERT

在Guardian界面上对db_col.t_col_orc.id列赋INSERT权限

--单独插入name列,成功
0: jdbc:hive2://172.22.23.2:10000/default> insert into t_col_orc (name) values ("tdh");
1 row affected (1.362 seconds)
--对其他列,比如age列进行插入,失败
0: jdbc:hive2://172.22.23.2:10000/default> insert into t_col_orc (age) values (1);
Error: COMPILE FAILED: Internal error HiveAccessControlException: [Error 20388] Permission denied: Principal [name=lkw, type=USER] does not have following privileges for operation QUERY [[INSERT] on Object [type=COLUMN, name=db_col.t_col_orc[age], action=INSERT]] (state=42000,code=20388)

7. 测试UPDATE

在Guardian界面上对db_col.t_col_orc.name 赋上UPDATE权限(以下的sql还需要确保age上有SELECT权限)

0: jdbc:hive2://172.22.23.2:10000/default> update t_col_orc set name = 5 where age = 1;
1 row affected (6.463 seconds)
0: jdbc:hive2://172.22.23.2:10000/default> update t_col_orc set name = 1;
2 rows affected (3.738 seconds)
0: jdbc:hive2://172.22.23.2:10000/default> update t_col_orc set id = 5 where age = 1; 
Error: COMPILE FAILED: Internal error HiveAccessControlException: [Error 20388] Permission denied: Principal [name=lkw, type=USER] does not have following privileges for operation QUERY [[UPDATE] on Object [type=COLUMN, name=db_col.t_col_orc[id]]] (state=42000,code=20388)
0: jdbc:hive2://172.22.23.2:10000/default> update t_col_orc t set name = 5 where exists(select 1 from t_col_orc1 t1 where t.id=t1.id);
1 row affected (4.463 seconds)

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。