ProtonBase 权限管理体系
概述
ProtonBase 实现了与 PostgreSQL 高度兼容的权限管理体系,但在云原生架构下进行了优化和扩展。本文档将详细介绍 ProtonBase 的权限管理机制,以及与标准 PostgreSQL 的主要差异。
ProtonBase 与 PostgreSQL 权限体系的主要差异
1. 用户管理范围
PostgreSQL:
- 用户是全局的,所有数据库实例共享同一套用户体系
- 在一个 PostgreSQL 实例中创建的用户可以在所有数据库中使用
ProtonBase:
- 每个数据库需要独立创建用户
- 用户管理是数据库级别的,不同数据库之间的用户相互独立
2. 云平台账号集成
PostgreSQL:
- 没有平台层面的账号概念
- 用户管理完全在数据库层面进行
ProtonBase:
- 作为云服务,具有云账号体系
- 使用云账号创建 Warebase 时,会默认将当前云账号加入到数据库中
- 云账号与数据库用户之间存在映射关系
ProtonBase 权限体系架构
ProtonBase 的权限体系包含以下几个层次:
1. 全局用户管理 (Global User Management)
全局用户是在 ProtonBase 平台层面注册的用户,可以在多个 Data Cloud 实例间使用统一身份。
2. 数据库用户管理 (Database User Management)
每个数据库实例可以独立管理本地用户和角色,这些用户仅在当前数据库内可见。
3. 角色权限管理 (Role-based Access Control)
通过预定义角色和自定义角色实现精细化权限控制。
用户和角色类型
Global User (全局用户)
- 在整个 ProtonBase 平台可见
- 可以在任何数据库中引用
- 密码存储在平台服务中,不能通过 SQL 管理
- 不能被授权给其他用户或角色(只能作为权限的最终接收者)
Local User (本地用户)
- 仅在当前数据库内可见
- 可以设置密码并通过 SQL 管理
- 可以被授权给角色组,也可以作为角色组的成员
Local Role (本地角色)
- 仅在当前数据库内可见
- 无密码属性
- 主要用于权限分组和角色继承
权限管理最佳实践
1. 最小权限原则
只授予用户完成工作所需的最小权限,避免过度授权。
2. 角色复用
创建通用角色,避免为每个用户单独设置权限,便于后续维护。
3. 定期审查
定期审查用户权限分配,及时清理不需要的权限。
4. 安全审计
记录权限变更日志,便于安全审计和问题追踪。
实际应用示例
在实际的企业环境中,合理的权限管理对于数据安全和业务运营至关重要。以下场景展示了在不同业务需求下如何使用 ProtonBase 的权限管理体系来满足安全和管理要求。
场景一:企业级权限管理
场景需求: 一家电商企业需要为不同的团队成员设置不同的数据访问权限:
- 数据分析师:只需要读取特定业务数据的权限,用于生成业务报表
- BI报表系统:需要读取源数据和写入报表数据的权限,用于自动化报表生成
- 数据库管理员:需要完全访问权限,负责数据库的日常维护和安全管理
实现方案:
首先为不同职责创建专门的角色,并分配相应的权限:
-- 创建不同职责的角色
CREATE ROLE data_analyst;
CREATE ROLE bi_system;
为数据分析师角色分配对public模式下所有表的只读权限:
-- 为data_analyst角色分配SELECT权限,使其可以读取public模式下的所有表、视图和物化视图
GRANT SELECT ON ALL TABLES IN SCHEMA public TO data_analyst;
-- 授予USAGE权限,允许访问public模式
GRANT USAGE ON SCHEMA public TO data_analyst;
同时,为数据分析师角色设置对未来创建的表也具有只读权限:
-- 设置默认权限,使data_analyst角色对今后在public模式下创建的表也具有SELECT权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO data_analyst;
为BI系统角色创建专用的报表模式,并分配相应权限:
-- 为BI系统创建专用的报表模式
CREATE SCHEMA bi_reports;
-- 授予对bi_reports模式下所有表的完全访问权限
GRANT ALL ON ALL TABLES IN SCHEMA bi_reports TO bi_system;
-- 授予USAGE和CREATE权限,允许使用和在该模式下创建对象
GRANT USAGE, CREATE ON SCHEMA bi_reports TO bi_system;
为BI系统角色设置对未来创建对象的权限:
-- 设置默认权限,使bi_system角色对今后在bi_reports模式下创建的表具有完全访问权限
ALTER DEFAULT PRIVILEGES IN SCHEMA bi_reports GRANT ALL ON TABLES TO bi_system;
创建具体的用户账户(注意:这些用户需要先在ProtonBase平台注册):
CREATE USER "analyst@company.com";
CREATE USER "bi-system@company.com";
将角色分配给相应的用户:
GRANT data_analyst TO "analyst@company.com";
GRANT bi_system TO "bi-system@company.com";
权限验证:
配置完成后,需要验证权限是否正确设置:
-- 以数据分析师身份连接数据库后执行
-- 应该成功
SELECT * FROM products LIMIT 1;
SELECT * FROM sales_view LIMIT 1;
-- 应该失败(权限不足)
INSERT INTO products VALUES (1, 'Test Product');
UPDATE products SET name = 'New Name' WHERE id = 1;
DELETE FROM products WHERE id = 1;
-- 以BI系统身份连接数据库后执行
-- 应该成功
SELECT * FROM source_data LIMIT 1;
CREATE TABLE bi_reports.monthly_summary AS SELECT * FROM source_data;
INSERT INTO bi_reports.report_table VALUES (1, 'Report Data');
-- 应该失败(不能在public模式下创建表)
CREATE TABLE public.new_table (id int);
场景二:简单权限模型
场景需求: 初创公司或小型团队需要快速建立权限管理体系,同时希望简化权限管理的复杂性:
- 开发人员:需要开发环境的读写权限,用于应用开发和测试
- 数据分析师:只需要读取权限,用于数据分析和报表制作
- 管理员:需要完整的权限,包括用户管理和权限分配能力
实现方案:
首先创建四个基础角色,分别对应不同的权限级别:
-- 创建预定义角色
CREATE ROLE database_admin WITH CREATEROLE;
CREATE ROLE database_devops;
CREATE ROLE database_writer;
CREATE ROLE database_reader;
接下来为这些角色分配相应的数据访问权限:
-- database_reader 角色拥有所有数据的只读权限
GRANT pg_read_all_data TO database_reader;
-- database_writer 角色拥有所有数据的读写权限
GRANT pg_write_all_data TO database_writer;
同时,为这些角色设置对未来创建对象的默认权限:
-- 为database_reader角色设置默认权限,使其对今后创建的表、视图和物化视图具有只读权限
ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES TO database_reader;
-- 为database_writer角色设置默认权限,使其对今后创建的表具有读写权限
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO database_writer;
-- 为database_writer角色设置默认权限,使其对今后创建的序列具有完全访问权限
ALTER DEFAULT PRIVILEGES GRANT ALL ON SEQUENCES TO database_writer;
建立角色之间的继承关系,使高级角色自动拥有低级角色的权限:
-- database_devops 角色继承 database_reader 和 database_writer 的权限
GRANT database_reader TO database_devops;
GRANT database_writer TO database_devops;
-- database_devops 角色还拥有监控权限
GRANT pg_monitor TO database_devops;
为管理员角色分配对其他角色的管理权限:
-- database_admin 角色拥有对其他角色的管理权限(包括继续授权的能力)
GRANT database_writer TO database_admin WITH ADMIN OPTION;
GRANT database_reader TO database_admin WITH ADMIN OPTION;
GRANT database_devops TO database_admin WITH ADMIN OPTION;
权限验证:
配置完成后,需要验证权限是否正确设置:
-- 以database_reader角色用户身份连接数据库
-- 应该成功
SELECT * FROM any_table LIMIT 1;
SELECT * FROM any_view LIMIT 1;
-- 应该失败(权限不足)
INSERT INTO any_table VALUES (1, 'Test');
UPDATE any_table SET column = 'value';
DELETE FROM any_table;
-- 以database_devops角色用户身份连接数据库
-- 应该成功
SELECT * FROM any_table LIMIT 1;
INSERT INTO any_table VALUES (1, 'Test');
UPDATE any_table SET column = 'value';
DELETE FROM any_table;
CREATE TABLE new_table (id int);
CREATE FUNCTION test_function() RETURNS int AS $$ BEGIN RETURN 1; END; $$ LANGUAGE plpgsql;
-- 以database_admin角色用户身份连接数据库
-- 应该成功执行所有操作,包括用户管理
CREATE USER new_user WITH PASSWORD 'password';
GRANT database_reader TO new_user;
REVOKE database_reader FROM existing_user;
权限验证
在完成权限配置后,验证授权是否成功是确保系统安全的重要步骤。通过适当的验证方法,可以确认用户和角色是否具有预期的访问权限。
验证用户权限
可以使用以下方法验证用户是否具有正确的权限:
1. 使用 psql 连接数据库验证
# 以特定用户身份连接数据库
psql -U username -d database_name -h hostname -p port
2. 查看当前用户权限
连接数据库后,可以执行以下SQL命令查看当前用户的权限:
-- 查看当前用户信息
SELECT current_user, session_user;
-- 查看当前用户的角色成员关系
SELECT rolname FROM pg_roles WHERE pg_has_role(current_user, oid, 'member');
3. 查看对象权限
-- 查看特定表的权限
SELECT grantee, privilege_type
FROM information_schema.table_privileges
WHERE table_name = 'table_name';
-- 查看模式权限
SELECT grantee, privilege_type
FROM information_schema.schema_privileges
WHERE schema_name = 'schema_name';
验证角色权限
1. 查看角色定义
-- 查看角色属性
SELECT rolname, rolsuper, rolcreatedb, rolcreaterole
FROM pg_roles
WHERE rolname = 'role_name';
2. 查看角色继承关系
-- 查看角色成员关系
SELECT
r1.rolname AS member,
r2.rolname AS role
FROM pg_auth_members m
JOIN pg_roles r1 ON r1.oid = m.member
JOIN pg_roles r2 ON r2.oid = m.roleid
WHERE r1.rolname = 'user_name' OR r2.rolname = 'role_name';
3. 查看默认权限
-- 查看默认权限设置
SELECT
pg_get_userbyid(defaclrole) AS owner,
nspname AS schema,
defaclobjtype AS object_type,
array_to_string(defaclacl, ', ') AS privileges
FROM pg_default_acl
LEFT JOIN pg_namespace n ON n.oid = defaclnamespace;
权限验证最佳实践
- 定期验证:定期检查权限配置,确保符合安全要求
- 最小权限验证:验证用户是否仅具有完成工作所需的最小权限
- 角色继承验证:验证角色继承关系是否正确设置
- 默认权限验证:验证默认权限是否正确应用于新创建的对象
- 审计日志检查:检查权限相关操作的审计日志
通过以上验证方法,可以确保ProtonBase数据库的权限配置正确有效,保障数据安全。
与 PostgreSQL 兼容性说明
尽管 ProtonBase 在用户管理范围和云平台集成方面与 PostgreSQL 存在差异,但在以下方面保持高度兼容:
- SQL 语法:
CREATE USER
,CREATE ROLE
,GRANT
,REVOKE
等命令语法与 PostgreSQL 一致 - 权限模型:
SELECT
,INSERT
,UPDATE
,DELETE
等权限类型和行为与 PostgreSQL 相同 - 角色继承:角色继承机制和权限传递方式与 PostgreSQL 一致
- 预定义角色:
pg_read_all_data
,pg_write_all_data
等预定义角色与 PostgreSQL 相同
故障排除
常见问题
- 用户未注册错误:确保用户已在 ProtonBase 平台注册后再创建数据库用户
- 权限不足错误:检查用户是否具有执行操作所需的权限
- 连接拒绝错误:确认用户是否具有数据库连接权限
排查步骤
- 确认用户是否已在平台注册
- 检查用户是否已被正确授权到相应角色
- 验证数据库中是否已创建对应用户
- 检查安全组和网络配置是否正确