目录
您可以通过设置口令和指定特殊限制来保护用户帐户。 KingbaseES 数据库初始化完成后,会创建三个用户:数据库管理员、安全管理员(sso)、审计管理员(sao)。还可以创建普通用户来访问数据库,运行数据库应用。若要查找这些用户的状态,请查询相关的数据字典视图。
每个 KingbaseES 数据库都有一个有效数据库用户的列表。开启数据库实例服务后,使用数据库中定义的有效用户名连接到数据库实例。 创建用户帐户时,可以指定对用户帐户的限制。您可以对用户设置过期时间、连接数等限制。KingbaseES 数据库提供了一组数据库视图,您可以查询这些视图以查找资源和会话信息等信息。
3.1.2.1. 管理用户定义
在KingbaseES中,除了在系统初始化过程中可以创建的三个用户:数据库管理员、安全管理员、审计管理员外,还可以创建普通用户来访问数据库,运行数据库应用。为了方便,这三个初始化用户也可以简称为管理员、审计员、安全员。
3.1.2.2. 三权分立
KingbaseES 安全版本支持将管理特权三权分立为三个管理员,并在初始化的时候创建数据库管理员、安全管理员和审计管理员。三权分立的安全管理体制是为了解决数据库超级用户权力过度集中的问题,参照行政、立法、司法三权分立的原则来设计的安全管理机制。
KingbaseES中,由于三权分立的约束,数据库管理员,安全管理员,审计管理员各自维护自己权限许可范围内的用户,不同目的的用户应由相应的管理员创建。即:数据库管理员用户不能创建和修改安全员和审计员,也不能将一个普通用户修改为安全员或者审计员,安全管理员只能创建和修改安全员并且不能将安全员修改为非安全员,审计管理员只能创建和修改审计员并且不能将审计员修改为非审计员。
3.1.2.2.1. 特权用户
系统管理员(system)
主要负责执行数据库日常管理的各种操作和自主存取控制。
安全管理员(sso)
主要负责强制访问规则的制定和管理,监督审计管理员和普通用户的操作,不能创建和操作普通对象。
审计管理员(sao)
主要负责数据库的审计,监督系统管理员和安全管理员的操作,不能创建和操作普通对象。
3.1.2.2.2. 与其他模块关系
审计
系统管理员
系统管理员不可以修改审计参数,不可以定义审计策略,也不可以查看审计记录。
安全管理员
安全管理员只可以设置及删除对审计管理员和普通用户的审计策略,只可以查看普通用户和审计管理员的审计结果记录。
审计管理员
只可以由审计管理员开启和关闭审计的GUC参数。审计管理员可以设置及删除对安全管理员和系统管理员的审计策略,只可以查看安全管理员和系统管理员的审计结果记录。
安全
系统管理员
不可以进行安全功能的操作。
安全管理员
只可以由安全员开启安全开关GUC参数。只可以由安全员设置及删除标记,策略等安全功能。
审计管理员
不可以进行安全功能的操作。
3.1.2.2.3. 相关参数
sepapower.separate_power_grant
是否由sso用户控制使用DCL语句,默认值为false。
3.1.2.2.4. 相关限制
CREATE
sao和sso不可以创建用户及普通对象
ALTER
sao和sso不可以修改对象定义
DROP
sao和sso不可以删除对象
ALTER USER/ROLE
sao和sso只可以修改自己的密码
GRANT/REVOKE
sao不可以进行授权操作 不可以为sao和sso授权和撤权 不允许其他用户成为sao和sso的成员 不允许sao和sso成为其他用户的成员
DROP USER/ROLE
依赖于是否有CREATE ROLE的权限,并且sao和sso不可以被删除。
SHOW
sao和sso允许使用SHOW命令。
ALTER SYSTEM SET
系统管理员和普通用户不可以修改审计和安全的参数 审计员只可以修改审计参数 安全员只可以修改安全参数
SET/RESET
sao和sso不允许使用SET/RESET命令。
3.1.2.2.5. 插件增强支持
通过加载可选的sso_update_user插件可以满足某些特殊场景的三权分立需求,对管理员和安全员的权限做出进一步的划分。
加载插件
修改kingbase.conf文件中
shared_preload_libraries
参数后重启数据库,创建插件并切换用户为安全管理员sso,打开插件开关。
shared_preload_libraries = 'sso_update_user' create extension sso_update_user; CREATE EXTENSION show sso_update_user.sso_update_user_enable; sso_update_user.sso_update_user_enable -------------------------------------- off (1 行记录) alter system set sso_update_user.sso_update_user_enable = true; ALTER SYSTEM select sys_reload_conf(); sys_reload_conf ----------------- t (1 行记录) show sso_update_user.sso_update_user_enable; sso_update_user.sso_update_user_enable -------------------------------------- on (1 行记录)
参数配置
sso_update_user.sso_update_user_enable
默认为关闭状态。
卸载插件
修改 kingbase.conf 文件中
shared_preload_libraries
参数后重启数据库。
shared_preload_libraries = ''
参数开关开启后限制
1)CREATE ROLE/USER: 系统管理员用户在创建普通用户时不可指定密码等选项。
2)ALTER ROLE/USER: 只有sso和普通用户本身可以更改普通用户的密码。
3)ALTER ROLE/USER: 系统管理员只能修改超级用户,或超级用户权限选项。
3.1.2.3. 受限DBA
受限DBA可以对当前DBA的权限进行一定限制。当功能开启后DBA将不能更改以下对象:
Table
Database
Function(by name)
Language
large object
Namespace(by name)
Tablespace(by name)
Foreign data wrapper
Foreign server
Type(by name)
Relation(by oid)
Type(by oid)
Operator(by oid)
Function(by oid)
Namespace(by oid)
Tablespace(by oid)
Operator class(by oid)
search dictionary(by oid)
search configuration(by oid)
database(by oid)
conversion(by oid)
extension(by oid)
KingbaseES通过插件的方式来进行受限DBA。这种方式更为灵活,当数据库的实用场景需要进行受限DBA管理时,加载插件即可。而不需要该功能时,卸载插件即可。
KingbaseES通过 1 个全局级参数配合插件来实现受限DBA管理。
3.1.2.3.1. 加载插件
修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库,创建插件并切换用户为安全管理员sso打开受限DBA开关。
shared_preload_libraries = 'restricted_dba' create extension restricted_dba; CREATE EXTENSION show restricted_dba.restricted_enable; restricted_dba.restricted_enable ---------------------- off (1 行记录) alter system set restricted_dba.restricted_enable = true; ALTER SYSTEM select sys_reload_conf(); sys_reload_conf ----------------- t (1 行记录) show restricted_dba.restricted_enable; restricted_dba.restricted_enable ---------------------------------- on (1 行记录)
3.1.2.3.2. 参数配置
restricted_dba.restricted_enable
受限DBA开关,默认为关闭状态。
show restricted_dba.restricted_enable; restricted_dba.restricted_enable ---------------------- off (1 行记录) alter system set restricted_dba.restricted_enable = true; ALTER SYSTEM select sys_reload_conf(); sys_reload_conf ----------------- t (1 行记录) show restricted_dba.restricted_enable; restricted_dba.restricted_enable ---------------------------------- on (1 行记录)
3.1.2.3.3. 卸载插件
修改 kingbase.conf 文件中 shared_preload_libraries
参数后重启数据库。
shared_preload_libraries = ''
使用CREATE USER语句创建用户,用户帐户可以具有默认角色和表空间限制等限制。本节内容包括:
创建用户的权限 被授予CREATEROLE系统权限的用户可以创建用户。
新用户的默认权限 创建新用户帐户时,默认此用户有连接(LOGIN)数据库的权限。
用户名的限制 创建指定用户名的用户时,请注意命名名称是否唯一等限制。
用户密码 使用PASSWORD关键字为用户设置密码
3.1.3.1. 创建用户的权限
已被授予CREATE ROLE 的系统权限的用户可以创建用户帐户。如果要创建自己有权创建用户的用户,需要授予CREATEROLE权限,例如:
alter user test CREATEROLE;
CREATEROLE是一种特殊系统权限,不允许转授。通常只有数据库管理员或安全管理员具有此系统特权。
3.1.3.2. 新用户的默认权限
创建新的用户帐户时,应允许此用户访问数据库。
使用 CREATE USER 语句创建新的用户帐户。例如:
create user test with password '123456';
新建用户默认有LOGIN权限,也可以使用sql授予用户连接权限,例如:
alter user test LOGIN;
3.1.3.3. 用户名的限制
为用户帐户指定名称时,需要注意一些限制。
用户名的唯一性
每个数据库中的用户名都是唯一的,不能创建同名的用户账号。在创建用户前,您可以通过系统视图sys_user查询当前数据库已存在的用户账号。
用户名的大小写
KingbaseES V8R6数据库不区分用户名大小写,默认用户名称都会转成小写。
3.1.3.4. 用户密码
KingbaseES使用PASSWORD关键字为用户账户设置密码,密码使用单引号括起来。例如:
create user test with password '123456';
3.1.3.5. 用户的默认角色
用户建立连接后即具有默认角色的所有权限,新建用户没有设置默认角色时,其默认角色为空。用户可通过SET ROLE 语句改变当前生效的角色,通过ALTER ROLE 语句修改用户的默认角色。
ALTER USER语句可以修改用户帐户,本节内容包括:
3.1.4.1. 关于修改用户
在大多数情况下,您可以使用 SQL 语句修改用户,例如,用户可以修改自己的密码。修改用户访问控制一般影响的是新建会话,而不会影响当前会话。例如,将test用户的连接数限制设置成1000:
alter user test connection limit 1000;
3.1.4.2. 修改管理员和普通用户的密码
一般情况下,系统管理员可以修改所有普通用户密码。普通用户可以修改自己的密码,但不能修改其他用户的密码,除非有CREATEROLE权限。使用alter user password语句修改密码,例如:
--授予权限 alter user test CREATEROLE; --修改管理员密码 alter user system password 'system12345'; --修改普通用户密码 alter user test password '123';
当数据库开启三权分立状态后,sso_update_user_enable参数处于打开状态时,只有sso 和普通用户本身可以更改普通用户的密码。系统管理员只能修改超级用户,或超级用户权限选项。
3.1.4.3. 修改sso和sao用户的密码
安全管理员(sso)和审计管理员(sao)的用户密码只能由自己修改。
DROP USER语句可以删除用户。本节内容包括:
3.1.5.1. 关于删除用户
删除用户需要有CREATEROLE 特权。如果一个用户的对象在任何数据库中被引用,它就不能被删除,如果尝试删除将会抛出一个错误。 删除用户时,KingbaseES数据库会从数据字典中删除用户相关信息。
3.1.5.2. 终止用户会话
当数据库中还有用户连接的会话时,则无法删除此用户。必须先终止用户会话或者用户可以退出会话,然后才能删除用户。如果需要强制终止会话,可以使用以下步骤:
查询动态会话视图sys_stat_activity,找到用户的会话 PID。
例如,查询test用户的会话:
select datname,pid from sys_stat_activity where datname='test'; datname |pid | --------|-----| test |1336 |
使用系统函数sys_terminate_backend强行终止test用户会话:
call sys_terminate_backend('1336');
用户与数据库断开连接后,就可以使用DROP USER语句删除该用户。
3.1.5.3. 删除用户对象
如果用户的对象还存在引用关系,被其他对象依赖,需要删除依赖对象后才能删除用户。
DROP OWNED 常常被用来为移除一个或者多个用户做准备。因为DROP OWNED 只影响当前数据库中的对象,通常需要在包含将被删除用户所拥有的对象的每一个数据库中都执行这个命令。使用CASCADE 选项可能导致这个命令递归去删除由其他用户所拥有的对象。REASSIGN OWNED 命令是另一种选择,它可以把一个或多个用户所拥有的所有数据库对象重新授予给其他用户。不过,REASSIGN OWNED 不处理其他对象的特权。例如,删除test用户下的对象:
DROP OWNED BY TEST CASCADE;
3.1.6.1. 用户访问控制
在KingbaseES 中,可以配置用户连接数限制,以及限制账号的使用期限。
3.1.6.1.1. 用户连接数限制
在创建用户的时候指定CONNECTION LIMIT 参数设置用户连接数限制。如果用户有登录权限,此参数可以指定该用户能建立多少并发连接。-1(默认值)表示无限制。注意这个限制仅针对于普通连接,预备事务和后台工作者连接都不受这一限制管辖。
3.1.6.1.2. 用户使用期限
在创建用户的时候指定VALID UNTIL参数设置用户使用期限,VALID UNTIL 机制设置一个日期和时间,在该时间点之后角色的口令将会失效。默认为不设置,口令将总是有效。
3.1.6.2. 用户CPU限制
限制使用的CPU资源,KingbaseES中通过kdb_resource_group插件来实现用户限额功能,通过sys_space_quota实现用户表空间限额。
3.1.6.2.1. 使用用户限额需要开启资源组
资源组依赖于操作系统的cgroup功能,所以必须安装cgroup并正确挂载和启动,对应的挂载的子系统目录给予操作用户写入和读取权限。
需要将动态库添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启数据库。
shared_preload_libraries = 'kdb_resource_group' # (change requires restart)
在 kingbase.conf 文件中设置参数,开启资源组功能,默认是off为关闭状态
resource_group_activated = on
在 kingbase.conf 文件中扩展内的非必选参数,设置cgroup的挂载主目录,默认为'/sys/fs/cgroup',修改后需要重启数据库生效
kdb_resource_group.resource_group_path = '/sys/fs/cgroup' #(change requires restart)
在 kingbase.conf 文件中扩展内的非必选参数,设置kingbase可使用操作系统CPU的总量,默认为100,取值范围1~100,修改后需要删除cgroup下的kingbase节点,命令如下:cgdelete -r cpu:kingbase。并重启数据库生效。
kdb_resource_group.resource_group_total_cpu = 100 #(change requires restart)
3.1.6.2.2. 资源组管理
创建一个资源组
CREATE RESOURCE GROUP group_name WITH (resource_name = value);
group_name为创建的资源组名称, 一个数据库内唯一,该对象不属于某个模式下。 resource_name为设置控制资源类型的名称,目前支持cpu_shares和cpu_cfs_quota_us。 value为资源的值,为数字类型。
不同参数取值范围不同,非值域报错。
修改一个资源组的限制值
ALTER RESOURCE GROUP group_name SET (resource_name = value);
删除一个资源组
DROP RESOURCE GROUP group_name;
查看资源组信息
select * from sys_resgroup;
查看资源组资源值,通过系统表sys_resgroupcapability来查看资源组关联的相关值限制。 系统表 sys_resgroupcapability,任何用户都可以查询。
select * from sys_resgroupcapability;
reslimittype | 属性名 | 含义 |
---|---|---|
3 4 | cpu_cfs_quota_us cpu_shares | 绝对CPU使用率 相对CPU使用率 |
设置一个资源组的相对CPU使用率
ALTER RESOURCE GROUP group_name SET (cpu_shares = value);
value 默认值: 10000 取值范围:10-10000
设置一个资源组的CPU绝对使用率限制
ALTER RESOURCE GROUP group_name SET (CFS_QUOTA_US = value);
value 默认值:100,不限制cpu使用 取值范围:整数,1-100。
3.1.6.2.3. 资源组关联用户
ALTER RESOURCE GROUP rgroup2 set (user='user1');
此SQL语句将user1用户加入到rgroup2资源组中,user1用户将受到rgroup2中资源组的资源使用控制。
查看资源组与用户关联关系,通过系统表sys_resauthid可查询数据库用户和资源组的关联
select * from sys_resauthid;
开启资源组后连接数据库报错或警告时,确认GUC参数设置,以及cgroup目录的权限和拥有者,可以使用以下命令清除资源组的kingbase节点,然后重新连接数据库会再次创建cgroup的kingbase节点。
cgdelete -r cpu:kingbase
KingbaseES数据库提供了一组数据字典视图,这些视图提供有关用于创建用户和配置用户的信息。
3.1.7.1. 常见的用户信息系统视图
一些常见的关于用户的系统视图如下表所示:
视图 | 描述 |
---|---|
ALL_OBJECTS | 描述当前用户可访问的所有对象 |
ALL_USERS | 列出对当前用户可见的用户,但不对其进行描述 |
DBA_OBJECTS | 描述数据库中的所有对象 |
DBA_USERS | 描述数据库的所有用户 |
USER_OBJECTS | 描述当前用户拥有的所有对象 |
USER_USERS | 仅描述当前用户 |
sys_user | 描述关于数据库用户的信息 |
sys_roles | 描述关于数据库角色的信息 |
SYS_STAT_ACTIVITY | 列出当前数据库会话的会话信息 |
3.1.7.2. 查询所有用户和相关信息
sys_user系统视图提供关于数据库所有用户的信息,如下所示:
select * from "sys_user"; usename |usesysid |usecreatedb |usesuper |userepl |usebypassrls |passwd |valuntil |useconfig | --------|---------|------------|---------|--------|-------------|---------|---------|----------| system |10 |true |true |true |true |******** | |NULL | sao |9 |false |false |false |false |******** | |NULL | sso |8 |false |false |false |false |******** | |NULL | ads |16601 |false |false |false |false |******** | |NULL | u1 |16603 |false |false |false |false |******** | |NULL | t1 |16604 |false |false |false |false |******** | |NULL | sa |16605 |true |false |false |false |******** | |NULL | test |16394 |false |false |false |false |******** | |NULL |
3.1.7.3. 查询数据库用户会话情况
SYS_STAT_ACTIVITY系统动态视图列出了当前数据库中所有用户会话的情况,例如,查询test用户下运行sql的内容:
select datid,datname,pid,query from SYS_STAT_ACTIVITY where datname='test'; datid |datname |pid |query | ------|--------|------|-----------------------------------------------------------------------------------| 15022 |test |15872 |SELECT t.oid,t.* FROM pg_catalog.pg_type t WHERE typnamespace=$1 ORDER by t.oid |