创建和管理用户与角色

用户与角色是操作数据库的主体。本节主要介绍 VexDB 数据库中创建与管理用户、角色的方式。

用户

VexDB 包含一个或多个已命名数据库。用户和角色在整个VexDB范围内是共享的,但是其数据并不共享。即用户可以连接任何数据库,但当连接成功后,任何用户都只能访问连接请求里声明的那个数据库。

非三权分立下,VexDB用户帐户只能由系统管理员、初始用户或拥有CREATEROLE属性的用户创建和删除。三权分立时,只允许系统管理员创建系统管理员,审计员创建审计用户,安全员创建安全用户。不需要再指定用户的管理类型标识。只允许系统管理员删除系统管理员,审计员删除审计用户,安全员删除安全用户。

在用户登录VexDB时会对其进行身份验证。用户可以拥有数据库和数据库对象(例如表),并且可以向用户和角色授予对这些对象的权限以控制谁可以访问哪个对象。除系统管理员外,具有CREATEDB属性的用户可以创建数据库并授予对这些数据库的权限。

创建、修改和删除用户

  • 要创建用户,请使用CREATE USER语句。
    例如:创建用户joe,并设置用户拥有CREATEDB属性。
    CREATE USER joe WITH CREATEDB PASSWORD "Vbase@123";
    
  • 要创建系统管理员,请使用带有 SYSADMIN 选项的CREATE USER语句 。
  • 要删除现有用户,请使用DROP USER语句。
  • 要更改用户帐户(例如,重命名用户或更改密码),请使用ALTER USER语句。
  • 要查看用户列表,请查询视图PG_USER:
    SELECT * FROM pg_user;
    
  • 要查看用户属性,请查询系统表PG_AUTHID:
    SELECT * FROM pg_authid;
    

普通用户口令

VexDB支持设置强制新建用户首次登录修改密码,可通过设置vb_enable_password_force_alter参数为on实现,参数默认启用。

  • 在password_force_alter参数为on时,管理员新建普通用户,为新建用户设置初始密码(初始密码复杂度受密码复杂度相关参数控制)。新建用户在首次登录时,必须修改密码后才可正常操作。
  • 在password_force_alter参数为on时,管理员可以按照密码复杂度要求修改普通用户密码。普通用户在使用管理员修改的密码首次登录后,必须修改密码方可正常操作。
  • 在password_force_alter参数为off时,对普通用户首次登录或连接不强制要求修改密码。

私有用户

对于有多个业务部门,各部门间使用不同的数据库用户进行业务操作,同时有一个同级的数据库维护部门使用数据库管理员进行维护操作的场景下,业务部门可能希望在未经授权的情况下,管理员用户只能对各部门的数据进行控制操作(DROP、ALTER、TRUNCATE),但是不能进行访问操作(INSERT、DELETE、UPDATE、SELECT、COPY)。即针对管理员用户,表对象的控制权和访问权要能够分离,提高普通用户数据安全性。

三权分立情况下,管理员对其他用户放在属于各自模式下的表无权限。但是,这种无权限包含了无控制权限,因此不能满足上面的诉求。为此,VexDB 提供了私有用户方案。即在非三权分立模式下,创建具有 INDEPENDENT 属性的私有用户。

CREATE USER user_independent WITH INDEPENDENT IDENTIFIED BY "Vbase@123";

针对该用户的对象,系统管理员和拥有 CREATEROLE 属性的安全管理员在未经其授权前,只能进行控制操作(DROP、ALTER、TRUNCATE),无权进行INSERT、DELETE、SELECT、UPDATE、COPY、GRANT、REVOKE、ALTER OWNER操作。

说明
  • PG_STATISTIC系统表和PG_STATISTIC_EXT系统表存储了统计对象的一些敏感信息,如高频值MCV。进行三权分立后系统管理员仍可以通过访问这两张系统表,得到统计信息里的这些信息。
  • 在某些特殊场景下,系统无法保证私有用户数据对初始用户或系统管理员绝对不可见。例如,初始用户或系统管理员通过解析本地数据文件或通过构造特殊函数或操作符被私有用户调用等方式,可能会获取私有用户数据。私有用户如果希望进一步提升数据的安全性,建议对数据进行加密保护。

永久用户

VexDB 提供永久用户方案,即创建具有 PERSISTENCE属性的永久用户。

仅允许初始用户创建、修改和删除具有 PERSISTENCE 属性的永久用户。

CREATE USER user_persistence WITH persistence IDENTIFIED BY "Admin@123";

角色

角色是一组用户的集合。通过GRANT把角色授予用户后,用户即具有了角色的所有权限。推荐使用角色进行高效权限分配。例如,可以为设计、开发和维护人员创建不同的角色,将角色GRANT给用户后,再向每个角色中的用户授予其工作所需数据的差异权限。在角色级别授予或撤消权限时,这些更改将作用到角色下的所有成员。

VexDB 提供了一个隐式定义的拥有所有角色的组:PUBLIC,所有创建的用户和角色默认拥有PUBLIC所拥有的权限。关于PUBLIC默认拥有的权限请参考GRANT。要撤销或重新授予用户和角色对PUBLIC的权限, 可通过在GRANT和REVOKE指定关键字PUBLIC实现。

注意事项

  • 以gs_role_开头的角色名作为数据库的内置角色保留名,禁止新建以 gs_role_ 开头的用户或角色,也禁止将已有的用户或角色重命名为以 gs_role_ 开头。
  • 禁止对内置角色的ALTER和DROP操作。
  • 内置角色默认没有LOGIN权限,不设预置密码。
  • vsql 元命令 \du\dg 不显示内置角色的相关信息,但若显示指定了 pattern 为特定内置角色则会显示。
  • 三权分立关闭时,初始用户、具有SYSADMIN权限的用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。三权分立打开时,初始用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。例如:
    GRANT gs_role_signal_backend TO user1;
    REVOKE gs_role_signal_backend FROM user1;
    

查询角色

要查看所有角色,请查询系统表PG_ROLES:

SELECT * FROM PG_ROLES;

创建、修改和删除角色

非三权分立时,只有系统管理员和具有CREATEROLE属性的用户才能创建、修改或删除角色。三权分立下,只有初始用户和具有CREATEROLE属性的用户才能创建、修改或删除角色。

  • 要创建角色,请使用CREATE ROLE语句。
  • 要在现有角色中添加或删除用户,请使用ALTER ROLE语句。
  • 要删除角色,请使用DROP ROLE语句。DROP ROLE只会删除角色,并不会删除角色中的成员用户帐户。

启用/禁用角色

VexDB 支持数据库角色的启用和禁用,若角色被禁用,则被禁用角色的成员角色将无法使用被禁用角色所拥有的权限。启用/禁用语法如下:

  • 启用角色
    SELECT vb_set_role(‘ROLE_NAME’,0);
    
  • 禁用角色
    SELECT vb_set_role(‘ROLE_NAME’,1);
    

内置角色

VexDB 提供了一组默认角色,以gs_role_开头命名。它们提供对特定的、通常需要高权限的操作的访问,可以将这些角色GRANT给数据库内的其他用户或角色,让这些用户能够使用特定的功能。在授予这些角色时应当非常小心,以确保它们被用在需要的地方。表1 描述了内置角色允许的权限范围:

表1 内置角色权限描述

角色 权限描述
gs_role_copy_files 具有执行 copy … to/from filename 的权限,但需要先打开 GUC 参数 enable_copy_server_files。
gs_role_signal_backend 具有调用函数 pg_cancel_backend、pg_terminate_backend 和 pg_terminate_session 来取消或终止其他会话的权限,但不能操作属于初始用户和 PERSISTENCE 用户的会话。
gs_role_tablespace 具有创建表空间(tablespace)的权限。
gs_role_replication 具有调用逻辑复制相关函数的权限,例如 kill_snapshot、pg_create_logical_replication_slot、pg_create_physical_replication_slot、pg_drop_replication_slot、pg_replication_slot_advance、pg_create_physical_replication_slot_extern、pg_logical_slot_get_changes、pg_logical_slot_peek_changes、pg_logical_slot_get_binary_changes、pg_logical_slot_peek_binary_changes。
gs_role_account_lock 具有加解锁用户的权限,但不能加解锁初始用户和 PERSISTENCE 用户。
gs_role_pldebugger 具有执行 dbe_pldebugger 模式下的 A 调试函数的权限。
gs_role_directory_create 具有执行创建 directory 对象的权限,但需要先打开 GUC 参数 enable_access_server_directory。
gs_role_directory_drop 具有执行删除 directory 对象的权限,但需要先打开 GUC 参数 enable_access_server_directory。

用户权限设置

直接授予权限

给用户直接授予某对象的权限,请使用 GRANT。

将 Schema 中的表或者视图对象授权给其他用户或角色时,需要将表或视图所属 Schema 的 USAGE 权限同时授予该用户或角色。否则用户或角色将只能看到这些对象的名称,并不能实际进行对象访问。

例如,下面示例将 Schema tpcds(tpcds Schema 已提前创建)的权限赋给用户 joe 后,将表 tpcds.web_returns 的 select 权限赋给用户 joe。

GRANT USAGE ON SCHEMA tpcds TO joe; 
GRANT SELECT ON TABLE tpcds.web_returns to joe;

指定用户继承角色的权限

给用户指定角色,使用户继承角色所拥有的对象权限。

  1. 创建角色。
    新建一个角色lily,同时给角色指定系统权限CREATEDB:
    CREATE ROLE lily WITH CREATEDB PASSWORD "Vbase@123";
    
  2. 给角色赋予对象权限。
    例如,将模式 tpcds 的权限赋给角色 lily 后,将表 tpcds.web_returns 的 select 权限赋给角色 lily。
    GRANT USAGE ON SCHEMA tpcds TO lily; 
    GRANT SELECT ON TABLE tpcds.web_returns to lily;
    
  3. 将角色的权限赋予用户。
    GRANT lily to joe;
    

    当将角色的权限赋予用户时,角色的属性并不会传递到用户。

回收权限

回收用户权限,请使用REVOKE。

REVOKE {privileges_options} [ON ... ] FROM username;

数据库权限

表2 数据库权限说明

权限 说明
SELECT 允许对指定的表、视图、序列执行 SELECT 命令,UPDATE 或 DELETE 时也需要对应字段上的 SELECT 权限。
INSERT 允许对指定的表执行 INSERT 命令。
UPDATE 允许对声明的表中任意字段执行 UPDATE 命令。

通常,UPDATE 命令也需要 SELECT 权限来查询出哪些行需要更新。SELECT… FOR UPDATE 和 SELECT… FOR SHARE 除了需要 SELECT 权限外,还需要 UPDATE 权限。
DELETE 允许执行 DELETE 命令删除指定表中的数据。通常,DELETE 命令也需要 SELECT 权限来查询出哪些行需要删除。
TRUNCATE 允许执行 TRUNCATE 语句删除指定表中的所有记录。
REFERENCES 允许创建一个外键约束,必须拥有参考表和被参考表的 REFERENCES 权限。
TRIGGER 允许创建触发器。
CREATE CREATE 行为根据级别而不同,包括:
  • 对于数据库级别的 CREATE 权限,允许在数据库里创建新的模式。
  • 超级用户和数据库所有者默认拥有此权限。
  • 对于模式级别的 CREATE 权限,允许在模式中创建新的对象。例如表、视图、索引、函数、数据类型等。模式所有者和超级用户默认拥有此权限。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的 CREATE 权限。
  • 对于表空间级别的 CREATE 权限,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。超级用户默认拥有此权限。
  • CONNECT 允许用户连接到指定的数据库。
    TEMPORARY 允许在指定的数据库中创建临时表。
    EXECUTE 允许使用指定的函数,以及利用这些函数实现的操作符。
    USAGE
  • 对于过程语言,允许用户在创建函数的时候指定过程语言。
  • 对于模式,USAGE 允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。
  • 对于序列,USAGE 允许使用 nextval 函数。
  • 对于 Data Source 对象,USAGE 是指访问权限,也是可赋予的所有权限,即 USAGE 与 ALL PRIVILEGES 等价。
  • ALTER 允许用户修改指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。
    DROP 允许用户删除指定的对象。
    COMMENT 允许用户定义或修改指定对象的注释。
    INDEX 允许用户在指定表上创建索引,并管理指定表上的索引,还允许用户对指定表执行 REINDEX 和 CLUSTER 操作。
    VACUUM 允许用户对指定的表执行 ANALYZE 和 VACUUM 操作。
    ALL PRIVILEGES 一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行 GRANT ALL PRIVILEGES。
    ANY ANY 权限是一类特殊的权限,被授予 ANY 权限的用户可以在数据库范围内执行上述权限允许的操作。例如,被授予 CREATE ANY TABLE 权限的用户能够在数据库范围内创建数据库。
    说明:被授予 CREATE ANY TABLE 权限的用户在同名 schema 下创建表,则该表的属主是该 schema 的属主。ANY 权限与原有的权限相互无影响。

    需要帮助?

    扫码添加企业微信
    获得专业技术支持

    企业微信二维码
    🎯 快速响应💡 专业解答