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;

权限验证最佳实践

  1. 定期验证:定期检查权限配置,确保符合安全要求
  2. 最小权限验证:验证用户是否仅具有完成工作所需的最小权限
  3. 角色继承验证:验证角色继承关系是否正确设置
  4. 默认权限验证:验证默认权限是否正确应用于新创建的对象
  5. 审计日志检查:检查权限相关操作的审计日志

通过以上验证方法,可以确保ProtonBase数据库的权限配置正确有效,保障数据安全。

与 PostgreSQL 兼容性说明

尽管 ProtonBase 在用户管理范围和云平台集成方面与 PostgreSQL 存在差异,但在以下方面保持高度兼容:

  1. SQL 语法CREATE USER, CREATE ROLE, GRANT, REVOKE 等命令语法与 PostgreSQL 一致
  2. 权限模型SELECT, INSERT, UPDATE, DELETE 等权限类型和行为与 PostgreSQL 相同
  3. 角色继承:角色继承机制和权限传递方式与 PostgreSQL 一致
  4. 预定义角色pg_read_all_data, pg_write_all_data 等预定义角色与 PostgreSQL 相同

故障排除

常见问题

  1. 用户未注册错误:确保用户已在 ProtonBase 平台注册后再创建数据库用户
  2. 权限不足错误:检查用户是否具有执行操作所需的权限
  3. 连接拒绝错误:确认用户是否具有数据库连接权限

排查步骤

  1. 确认用户是否已在平台注册
  2. 检查用户是否已被正确授权到相应角色
  3. 验证数据库中是否已创建对应用户
  4. 检查安全组和网络配置是否正确