原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
南大通用 GBase 8c 数据库的权限管理机制清晰且灵活,旨在保障数据安全并支持精细化的访问控制。其核心主要包括默认权限机制、多种管理员角色、三权分立模式以及角色与用户管理。本文以特定实践场景为例,介绍GBase 8c权限管理的功能及配置方法。
1. 背景与目标
应用场景:某不同用户需要共享同一模式下的表,新建表时也希望自动继承访问权限。
问题:手动 GRANT 只能作用于已有对象,未来新建的表需要再次授权,容易遗漏。
解决思路:通过 ALTER DEFAULT PRIVILEGES 设置默认权限,确保未来对象自动继承权限。
目标:验证 ALTER DEFAULT PRIVILEGES 的双向授权效果,实现用户间表的互访。
2. 环境准备
2.1 环境信息
正常部署GBase 8c数据库集群后,创建testpri库,连接端口为15400。
数据库用户名为serceruser、clientuser
模式名为test_privileges
2.2 清理旧环境
-- 清理旧环境
gsql -r -d postgres -p 15400
clean connection to all force for database testgrant;
drop database if exists testgrant;
drop user if exists serveruser;
drop user if exists clientuser;
2.3 创建新环境
创建数据库
-- 创建新数据库
create database testgrant;
创建测试用户
-- 创建测试用户
create user serveruser with login password '********';
create user clientuser with login password '********';
3. 权限配置流程
在权限配置过程中,需要用到如下语法:
| 命令 | 作用 | 注意点 |
|---|---|---|
| ALTER DEFAULT PRIVILEGES | 设置未来对象默认权限 | 用户级别,需分别执行 |
| GRANT ALL ON SCHEMA | 授予模式管理权限 | 包含对象创建与删除 |
| GRANT ALL ON ALL TABLES | 授予已有表权限 | 仅对当前存在的表生效 |
| SET search_path | 设置模式搜索路径 | 影响对象创建和查询位置 |
| clean connection | 清理数据库连接 | 生产环境慎用 |
3.1 模式权限配置
GBase 8c数据库中,使用GRANT ALL ON SCHEMA 语法为模式进行权限配置,授予用户对模式的完全控制权,包含创建/修改/删除对象、注释、使用等权限。
\c testgrant
create schema test_privileges;
-- 授予模式所有权
grant all on schema test_privileges to serveruser;
grant all on schema test_privileges to clientuser;
3.2 已有表权限配置
GBase 8c数据库中,使用GRANT ALL ON ALL TABLES 语法为所有表进行权限配置,仅对现有表生效, 包含SELECT/INSERT/UPDATE/DELETE/TRUNCATE等权限。
-- 授予现有表权限
grant all on all tables in schema test_privileges to serveruser;
grant all on all tables in schema test_privileges to clientuser;
3.3 默认权限配置
GBase 8c数据库中,使用ALTER DEFAULT PRIVILEGES IN SCHEMA xxx GRANT ALL ON TABLES TO xxx ;语法修改默认权限配置。
说明
- 仅影响执行命令的用户所建对象
- 需在两个用户会话中分别执行
- 确保未来新建表自动继承权限
-- serveruser用户执行赋权给clientuser
ALTER DEFAULT PRIVILEGES IN SCHEMA test_privileges
GRANT ALL ON TABLES TO clientuser;
-- clientuser用户执行赋权给serveruser
ALTER DEFAULT PRIVILEGES IN SCHEMA test_privileges
GRANT ALL ON TABLES TO serveruser;
4. 权限验证测试
4.1 serceruser 用户测试
-
切换到serceruser 用户会话,测试其权限,应支持表的创建和数据插入。对其他用户可见。
-
创建表 a1 并插入数据
-
预期结果:表成功创建并可插入,后续clientuser用户应能访问此表
执行命令:
gsql -r -d testgrant -p 15400 -U serveruser -W "********"
set search_path = test_privileges;
-- 创建测试表
create table a1(username varchar(20));
insert into a1 values('serveruser');
4.2 clientuser 用户测试
- 跨用户访问表 a1
- 创建表 b1 并插入数据
- 预期结果:成功访问serveruser用户的表 a1,能新建表 b1,新建表应能被serveruser访问
gsql -r -d testgrant -p 15400 -U clientuser -W "********"
set search_path = test_privileges;
-- 跨用户访问测试
insert into a1 values('clientuser');
select * from a1;
-- 创建反向测试表
create table b1(username varchar(20));
insert into b1 values('clientuser');
4.3 双向访问验证
- serceruser 访问 b1
- 预期结果:双向插入和查询成功
5. 总结最佳实践及注意事项
在生产环境中,仍需结合最小权限原则进行合理的权限控制。建议权限管理应考虑以下几个方面:
- 最小化授权:生产环境避免使用 ALL,根据业务需求细化到 SELECT/INSERT 等。
- 定期权限审计:使用 \dp 检查当前权限分配情况。
- 新用户维护:有新用户加入时需更新默认权限。
- 模式隔离:不同业务独立使用模式,降低权限风险。
- 密码策略:定期更换数据库用户密码。
注意事项
- ALTER DEFAULT PRIVILEGES 只对执行命令的用户后续创建的对象生效。
- 如果表在执行前已存在,需要额外执行 GRANT ALL ON TABLES。
- 权限修改不会影响已创建的连接,可能需要重新登录。
原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。