Kingbase安全之用户管理

用户管理 

您可以通过多种方式管理 KingbaseES 数据库用户的安全性。

3.1.1. 关于用户安全 

您可以通过设置口令和指定特殊限制来保护用户帐户。 KingbaseES 数据库初始化完成后,会创建三个用户:数据库管理员、安全管理员(sso)、审计管理员(sao)。还可以创建普通用户来访问数据库,运行数据库应用。若要查找这些用户的状态,请查询相关的数据字典视图。

每个 KingbaseES 数据库都有一个有效数据库用户的列表。开启数据库实例服务后,使用数据库中定义的有效用户名连接到数据库实例。 创建用户帐户时,可以指定对用户帐户的限制。您可以对用户设置过期时间、连接数等限制。KingbaseES 数据库提供了一组数据库视图,您可以查询这些视图以查找资源和会话信息等信息。

3.1.2. 预定义管理用户 

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. 相关限制 
  1. CREATE

    sao和sso不可以创建用户及普通对象

  2. ALTER

    sao和sso不可以修改对象定义

  3. DROP

    sao和sso不可以删除对象

  4. ALTER USER/ROLE

    sao和sso只可以修改自己的密码

  5. GRANT/REVOKE

    1. sao不可以进行授权操作

    2. 不可以为sao和sso授权和撤权

    3. 不允许其他用户成为sao和sso的成员

    4. 不允许sao和sso成为其他用户的成员

  6. DROP USER/ROLE

    依赖于是否有CREATE ROLE的权限,并且sao和sso不可以被删除。

  7. SHOW

    sao和sso允许使用SHOW命令

  8. ALTER SYSTEM SET

    1. 系统管理员和普通用户不可以修改审计和安全的参数

    2. 审计员只可以修改审计参数

    3. 安全员只可以修改安全参数

  9. SET/RESET

    sao和sso不允许使用SET/RESET命令

3.1.2.2.5. 插件增强支持 

通过加载可选的sso_update_user插件可以满足某些特殊场景的三权分立需求,对管理员和安全员的权限做出进一步的划分。

  1. 加载插件

修改kingbase.conf文件中 shared_preload_libraries 参数后重启数据库,创建插件并切换用户为安全管理员sso,打开插件开关。

shared_preload_libraries = 'sso_update_user'

\c - system
create extension sso_update_user;

\c - sso
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;

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 行记录)

  1. 参数配置

sso_update_user.sso_update_user_enable 默认为关闭状态。

  1. 卸载插件

修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库。

shared_preload_libraries = ''

  1. 参数开关开启后限制

    1)CREATE ROLE/USER: 系统管理员用户在创建普通用户时不可指定密码等选项。

    2)ALTER ROLE/USER: 只有sso和普通用户本身可以更改普通用户的密码。

    3)ALTER ROLE/USER: 系统管理员只能修改超级用户,或超级用户权限选项。

3.1.2.3. 受限DBA 

受限DBA可以对当前DBA的权限进行一定限制。当功能开启后DBA将不能读取、更改和执行不属于他的以下对象:

  1. Table

  2. Database

  3. Function

  4. Language

  5. large object

  6. Namespace

  7. Tablespace

  8. Foreign data wrapper

  9. Foreign server

  10. Type

  11. Relation

  12. Operator

  13. Operator class

  14. search dictionary

  15. search configuration

  16. conversion

  17. extension

  18. schema

KingbaseES通过插件的方式来进行受限DBA。这种方式更为灵活,当数据库的实用场景需要进行受限DBA管理时,加载插件即可。而不需要该功能时,卸载插件即可。

KingbaseES通过 1 个全局级参数配合插件来实现受限DBA管理。详情参见插件 restricted_dba 

3.1.2.3.1. 加载插件 

修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库,创建插件并切换用户为安全管理员sso打开受限DBA开关。

shared_preload_libraries = 'restricted_dba'

\c - system
create extension restricted_dba;

show restricted_dba.restricted_enable;
restricted_dba.restricted_enable
----------------------
off
(1 行记录)

\c - sso
alter system set restricted_dba.restricted_enable = true;

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 行记录)

\c - sso
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 行记录)

\c - system
create user u1 with password '123456';
\c - u1
create table t1 (a int);
\c - system
select * from t1;
错误:  对表 t1 权限不够

3.1.2.3.3. 卸载插件 

修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库。

shared_preload_libraries = ''

3.1.3. 创建用户 

使用CREATE USER语句创建用户,用户帐户可以具有默认角色和表空间限制等限制。本节内容包括:

  • 创建用户的权限

    被授予CREATEROLE系统权限的用户可以创建用户。

  • 新用户的默认权限

    创建新用户帐户时,默认此用户有连接(LOGIN)数据库的权限。

  • 用户名的限制

    创建指定用户名的用户时,请注意命名名称是否唯一等限制,而且用户名的长度不可以大于63字节。

  • 用户密码

    使用PASSWORD关键字为用户设置密码。

  • 用户的默认角色

    用户建立连接后即具有默认角色的所有权限。

3.1.3.1. 创建用户的权限 

已被授予CREATE ROLE 的系统权限的用户可以创建用户帐户。如果要创建自己有权创建用户的用户,需要授予CREATEROLE权限,例如:

ALTER USER test CREATEROLE;

CREATEROLE是一种特殊系统权限,不允许转授。通常只有数据库管理员或安全管理员具有此系统特权。

3.1.3.2. 新用户的默认权限 

创建新的用户帐户时,应允许此用户访问数据库。

  1. 使用 CREATE USER 语句创建新的用户帐户。例如:

CREATE USER test WITH PASSWORD '123456';

  1. 新建用户默认有LOGIN权限,也可以使用sql授予用户连接权限,例如:

ALTER USER test LOGIN;

3.1.3.3. 用户名的限制 

为用户帐户指定名称时,需要注意一些限制。

  • 用户名的唯一性

    每个数据库中的用户名都是唯一的,不能创建同名的用户账号。在创建用户前,您可以通过系统视图 sys_user 查询当前数据库已存在的用户账号。

  • 用户名的大小写

    KingbaseES数据库不区分用户名大小写,默认用户名称都会转成小写。

3.1.3.4. 用户密码 

KingbaseES使用PASSWORD关键字为用户账户设置密码,密码使用单引号括起来。例如:

CREATE USER test WITH PASSWORD '123456';

3.1.3.5. 用户的默认角色 

用户建立连接后即具有默认角色的所有权限,新建用户没有设置默认角色时,其默认角色为空。用户可通过 SET ROLE 语句改变当前生效的角色,通过 ALTER ROLE 语句修改用户的默认角色。

3.1.4. 修改用户 

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)的用户密码只能由自己修改。

3.1.5. 删除用户 

DROP USER语句可以删除用户。本节内容包括:

3.1.5.1. 关于删除用户 

删除用户需要有CREATEROLE 特权。如果一个用户的对象在任何数据库中被引用,它就不能被删除,如果尝试删除将会抛出一个错误。 删除用户时,KingbaseES数据库会从数据字典中删除用户相关信息。

3.1.5.2. 终止用户会话 

当数据库中还有用户连接的会话时,则无法删除此用户。必须先终止用户会话或者用户可以退出会话,然后才能删除用户。如果需要强制终止会话,可以使用以下步骤:

  1. 查询动态会话视图 sys_stat_activity ,找到用户的会话 PID。

例如,查询test用户的会话:

SELECT  datname,pid FROM sys_stat_activity WHERE datname='test';

datname |pid  |
--------+-----+
test    |1336 |

  1. 使用系统函数 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. 用户资源限制 

3.1.6.1. 用户访问控制 

在KingbaseES 中,可以配置用户连接数限制,以及限制账号的使用期限。

3.1.6.1.1. 用户连接数限制 

在创建用户的时候指定 CONNECTION LIMIT 参数设置用户连接数限制。如果用户有登录权限,此参数可以指定该用户能建立多少并发连接。-1表示无限制。当GUC参数connections_limit_per_user设置为true时,普通用户默认连接数限制为5,超级用户默认连接数限制为8。connections_limit_per_user设置为false时,所有用户默认的最大连接限制均为-1,并且超级用户不受连接数限制。注意这个限制仅针对于普通连接,预备事务和后台工作者连接都不受这一限制管辖。

3.1.6.1.2. 用户使用期限 

在创建用户的时候指定 VALID UNTIL 参数设置用户使用期限, VALID UNTIL 机制设置一个日期和时间,在该时间点之后角色的口令将会失效。默认为不设置,口令将总是有效。

3.1.6.1.3. 用户连接期限 

在创建用户的时候指定 CONNECTION INTERVALS 'time1 TO time2' 子句来设置用户连接期限。 CONNECTION INTERVALS 'time1 TO time2' 设置一个时间段, 超出限制的时间段,用户将无法连接数据库。限制的是每天的时间段,例如 '09:00:00 TO 12:00:00' 代表限制用户在每天的9点到12点之间,才被允许登录数据库。示例如下:

CREATE USER u1 WITH CONNECTION INTERVALS '09:00:00 TO 10:00:00';

警告

由于三元用户拥有较高和特殊权限,如果三元用户设置了时间限制,那么在非允许的时间段内,无其他办法或替代方法可以用三元用户登录系统,这样会降低针对突发情况的应对能力,故建议针对三元用户需要慎重设置。

3.1.7. 用户状态管理 

3.1.7.1. 用户的只读状态 

在KingbaseES数据库中,除了对用户授予特定的对象的select权限方法外,还可以将事务设置成只读状态。在该状态下,用户不能执行数据库操作种类的操作,极大的限制了用户除了select权限以外操作,从而表现为只读用户的特征。当用户处于只读事务状态,其本身对于数据库对象的权限没有改变。当改变用户的只读状态后,即可恢复用户的各种权限。

KingbaseES提供系统存储过程alteruserreadonly来设置用户的只读状态。

alteruserreadonly储存过程

语法:

PROCEDURE alteruserreadonly(database VARCHAR, username VARCHAR, isReadOnly BOOLEAN)

参数说明:

database 数据库名称,为空时表示全部数据库。

Username 用户名。

isReadOnly 是否为只读。

示例:

test=# \c test system
You are now connected to database "test" as userName "system".
test=# create user u1 with password '12345678ab';
CREATE ROLE
test=# create user u2 with password '12345678ab';
CREATE ROLE
test=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于
----------+--------------------------------------------+----------
 kcluster | 无法登录                                   | {}
 sao      | 没有继承                                   | {}
 sso      | 没有继承                                   | {}
 system   | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 u1       |                                            | {}
 u2       |                                            | {}


test=# \c - u1
You are now connected to database "test" as userName "u1".
test=> create table t1(id int);
CREATE TABLE
test=> insert into t1 values (1);
INSERT 0 1
test=> \c test system
You are now connected to database "test" as userName "system".
test=# call alteruserreadonly ('','u1',true);
CALL
test=# \c - u2
You are now connected to database "test" as userName "u2".
test=> create table a(id int);
CREATE TABLE
test=> grant select on a to u1;
GRANT
test=> \c - u1
You are now connected to database "test" as userName "u1".
test=> create table t1(id int);
ERROR:  ReadOnlyUser cannot execute CREATE TABLE.
test=> show default_transaction_read_only ;
 default_transaction_read_only
-------------------------------
 on
(1 行记录)


test=> show transaction_read_only ;
 transaction_read_only
-----------------------
 on
(1 行记录)


test=> show read_only_user ;
 read_only_user
----------------
 on
(1 行记录)


test=> select * from a;
 id
----
(0 行记录)


test=> select * from t1;
 id
----
  1
(1 行记录)


test=> insert into t1 values (2);
ERROR:  ReadOnlyUser cannot execute INSERT.
test=> insert into A values (1);
ERROR:  ReadOnlyUser cannot execute INSERT.
test=> \c test system
You are now connected to database "test" as userName "system".
test=# call alteruserreadonly ('','u1',false);
CALL
test=# drop table t1,a;
DROP TABLE
test=# drop user u1,u2;
DROP ROLE

3.1.8. 用户的数据字典视图 

KingbaseES数据库提供了一组数据字典视图,这些视图提供有关用于创建用户和配置用户的信息。

3.1.8.1. 常见的用户信息系统视图 

一些常见的关于用户的系统视图如下表所示:

视图

描述

ALL_OBJECTS

描述当前用户可访问的所有对象

ALL_USERS

列出对当前用户可见的用户,但不对其进行描述

DBA_OBJECTS

描述数据库中的所有对象

DBA_USERS

描述数据库的所有用户

USER_OBJECTS

描述当前用户拥有的所有对象

USER_USERS

仅描述当前用户

sys_user

描述关于数据库用户的信息

sys_roles

描述关于数据库角色的信息

sys_stat_activity

列出当前数据库会话的会话信息

另请参阅

更多系统视图参见 静态数据词典视图 

3.1.8.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.8.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 sys_catalog.sys_type t WHERE typnamespace=$1  ORDER by t.oid |

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值