最近尝试对trino查询的不同用户授予不同权限,并对数据进行脱敏。
但是翻阅官网的资料比较简单并且没有特别详尽的示例,现在我对其进行了汇总总结。
由于此处只是做了一些测试汇总,其余资料请参照官网链接:基于文件的访问控制 — Trino 444 文档
一、准备配置文件
1. 用户组配置
官网文档:File group provider — Trino 444 Documentation
配置文件:
etc/group-provider.properties
group-provider.name=file
# 用户组配置文件
file.group-file=/mnt/disk1/superior/trino/trino375/etc/group.txt# 文件刷新时间(无需重启trino服务)
file.refresh-period=5s
etc/group.txt
hive:test,zwp
admin:root,admin
guest:guest
human_resources:human_resources
这是进行访问控制的第一步,准备必要的用户
2.系统级访问控制文件
etc/access-control.properties
# default,allow-all,read-only,file
access-control.name=file
# 规则json本地文件
security.config-file=etc/rules.json
# etc/rules.json文件的自动的refresh的周期
security.refresh-period=1s
3.访问规则配置文件
etc/rules.json
{
"catalogs": [
{
"role": "admin",
"catalog": ".*",
"allow": "all"
},
{
"user": "root",
"catalog": "(mysql|hive|system)",
"allow": true
},
{
"group": "human_resources|guest",
"catalog": "(system|hive|mysql)",
"allow": true
},
{
"catalog": "system",
"allow": "none"
},
{
"user": "test",
"catalog": "(system|hive|mysql)",
"allow": true
},
{
"user": "zwp",
"catalog": "hive",
"allow": "all"
}
],
"schemas": [
{
"role": "admin",
"schema": ".*",
"owner": true
},
{
"user": "human_resources",
"owner": false
},
{
"user": "test",
"schema": "db_2",
"owner": false
},
{
"catalog": "mysql",
"schema": ".*",
"owner": true
},
{
"catalog": "hive",
"schema": "domain_20230930",
"owner": true
}
],
"tables": [
{
"role": "admin",
"privileges": ["SELECT", "INSERT", "DELETE", "UPDATE", "OWNERSHIP"]
},
{
"user": "zwp",
"privileges": []
},
{
"catalog": "hive",
"schema": "domain_20230930",
"table": "cbs_d_person",
"privileges": ["SELECT"],
"filter": "customer_no < '00010'",
"filter_environment": {
"user": "test"
}
},
{
"catalog": "hive",
"schema": "domain_20230930",
"table": "cbs_d_card",
"privileges": ["SELECT"],
"columns": [
{
"name": "account_key",
"allow": false
},
{
"name": "card_no",
"mask": "substring(card_no, -4)"
}
]
},
{
"catalog": "mysql",
"schema": "db_1",
"table": "raw_trades",
"privileges": ["SELECT"],
"columns" : [
{
"name": "item_price",
"allow": false
},
{
"name": "dispatch_province",
"mask": "substring(dispatch_province, -2)",
"mask_environment": {
"user": "test"
}
}
]
}
]
}
二、规则配置文件详解及规范
erc/rules.json主要分为三部分:catalogs,schemas,tables
权限控制规范
1. catalogs 级别
选择 role,需要配置 catalog 必填 allow (一般只有一个role如admin ,catalog为 .* , allow为all ,拥有所有权限)
选择 group(可多选),需要配置 catalog(可多选) 必填 allow 。
选择 user(可多选), 需要配置 catalog(可多选) 必填 allow。
选择 catalog (可多选),必填 allow 。
allow值说明:
allow必填, 可选all / read-only / none ,none为默认值; allow选择 true 等同于 all, false 等同于 none,为统一规范,allow最好不用true 和 false。
需要注意的是,配置时 最好 role 最前,group,user, catalog 依次向后,避免权限冲突配置失败。
在Trino中,访问控制规则的优先级通常是按照它们在规则文件中出现的顺序来确定的。后者访问规则将覆盖之前的规则。
冲突示例:
{
"catalog": "system|mysql",
"allow": "none"
},
{
"user": "test",
"catalog": "(system|hive|mysql)",
"allow": true
}
如上,test用户就无法访问 system 的 catalog。
2. schemas 级别
选择 role,需要配置 catalog schema owner(一般默认配置 role拥有所有权限)。
选择 group(可多选),可选 catlog 必须配置 schema owner。
选择 user(可多选),可选 catlog 必须配置 schema owner。
选择 catalog(可多选) ,必须配置 schema owner。
上述所有如果不选择catalog 直接写 schemas 然后 owner 为true,表示拥有所有的catlog的同名schema 权限(所以最好是写上catalog,保证权限精确控制)。
3. tables 级别权限
选择 role,配置 privileges(必填,内容可选) (一般默认配置 role拥有所有权限)
选择 group(可多选), 配置 privileges(必填,内容可选)
选择 user(可多选) ,配置 privileges(必填,内容可选)
重点:单表或者多表权限控制
选择 catalog 必须配置 schema table privileges(必填,内容可选)
过滤表内容
必填 filter(过滤条件,如 customer_no < '00010') ,filter_environment(可选,一般配置具体的user;不填时对所有user生效)
{
"catalog": "hive",
"schema": "domain_20230930",
"table": "cbs_d_person",
"privileges": ["SELECT"],
"filter": "customer_no < '00010'",
"filter_environment": {
"user": "test"
}
}
字段级别控制
选择 columns 必填 name(字段名)
禁止访问某字段
必填 allow (值为false)
某字段脱敏
必填mask(脱敏规则) ,mask_environment(可选,一般配置具体的user;不填时对所有user生效)
{
"catalog": "mysql",
"schema": "db_1",
"table": "raw_trades",
"privileges": ["SELECT"],
"columns" : [
{
"name": "item_price",
"allow": false
},
{
"name": "dispatch_province",
"mask": "substring(dispatch_province, -2)",
"mask_environment": {
"user": "test"
}
}
]
}
对于多选例子参考:
"group": "finance|human_resources"
"user": "alice|zwp"
"catalog": "mysql|system"
配置文件详解
1.catalogs 级别
"catalogs": [
{
"role": "admin",
"catalog": ".*",
"allow": "all"
},
{
"user": "root",
"catalog": "(mysql|hive|system)",
"allow": true
},
{
"group": "human_resources|guest",
"catalog": "(system|hive|mysql)",
"allow": true
},
{
"catalog": "system",
"allow": "none"
},
{
"user": "test",
"catalog": "(system|hive|mysql)",
"allow": true
},
{
"user": "zwp",
"catalog": "hive",
"allow": "all"
}
]
role:admin 角色拥有所有catalogs的权限
user:root 用户拥有 mysql|hive|system 三个catalogs权限
group:human_resources|guest 用户组 拥有 mysql|hive|system 三个catalogs权限
这里的拥有指 show catalogs 时可见的 catalog。
2. schemas 级别 与 tables 级别
"schemas": [
{
"role": "admin",
"schema": ".*",
"owner": true
},
{
"group": "human_resources",
"owner": false
},
{
"user": "test",
"schema": "db_2",
"owner": false
},
{
"catalog": "mysql",
"schema": ".*",
"owner": true
},
{
"catalog": "hive",
"schema": "domain_20230930",
"owner": true
}
],
"tables": [
{
"role": "admin",
"privileges": ["SELECT", "INSERT", "DELETE", "UPDATE", "OWNERSHIP"]
},
{
"user": "zwp",
"privileges": []
},
{
"catalog": "hive",
"schema": "domain_20230930",
"table": "cbs_d_person",
"privileges": ["SELECT"],
"filter": "customer_no < '00010'",
"filter_environment": {
"user": "test"
}
},
{
"catalog": "hive",
"schema": "domain_20230930",
"table": "cbs_d_card",
"privileges": ["SELECT"],
"columns": [
{
"name": "account_key",
"allow": false
},
{
"name": "card_no",
"mask": "substring(card_no, -4)"
}
]
},
{
"catalog": "mysql",
"schema": "db_1",
"table": "raw_trades",
"privileges": ["SELECT"],
"columns" : [
{
"name": "item_price",
"allow": false
},
{
"name": "dispatch_province",
"mask": "substring(dispatch_province, -2)",
"mask_environment": {
"user": "test"
}
}
]
}
]
由于,tables 级别权限 会影响到 schemas 级别的权限,所以这里一同说明 。
权限生效问题:rules.json 文件是自上而下读取,依次生效的,但是更具体的权限会覆盖到上一级。
如schemas里,对某个schema设置owner权限,比某个用户或者用户组设置 catalog owner权限更具体,所以前者配置在后者配置的后面时正常生效。
但是在catalogs里,system catalog 的权限 要比 后面设置的 user的 catalogs 权限更具体,所以前者配置哪怕在后者配置前,也不会被后者的配置覆盖。这里的权限指可见性 show。
schemas 权限解释
role: admin 为超级管理员,三级权限一般都默认设置为全部。
group:human_resources 用户组在 schemas 的 owner 为false,意味着没有任何的 schemas 权限,但是后面又设置了mysql所有的 schemas 和 hive的 domain_20230930 的owner为true ,
所以 show schemas in mysql 可以看到所有的 mysql schemas, show schemas in hive可以看到 domain_20230930。
catlog:hive 的 domain_20230930 的 owner 为true,意味着所有的user 都在 show schemas in hive可以看到 domain_20230930。
tables 权限解释
group:human_resources 用户组在schemas的设置权限不如具体表的设置权限更具体,所以他也可以查询tables级别设置的表。
user:zwp 用户不具备对任何表的任何权限,虽然后续的表权限设置更具体,但是只能让它 show tables 时看到该表,而不具备select 权限。
user: test 用户在select 查询 hive.domain_20230930.cbs_d_person 时,数据会过滤筛选到符合filter条件的数据
tables: hive.domain_20230930.cbs_d_card 该表对任何用户都具有查询权限,同时查询时,会对字段card_no脱敏,字段account_key不可查询。
具体记录就这么多,可能会有没有记录的东西可以找我沟通。