管理角色¶
1. 关于角色¶
角色是一组权限的集合,使用角色让权限管理的工作更加简单有效。数据库管理员可以将角色授予用户或者其他角色,有创建角色(CREATE ROLE)的系统权限的用户可以将自己创建的角色授予给用户和其他角色。创建一个新的用户时,其默认角色为空,但可通过ALTER USER 指定该用户的默认角色。一个用户只能有一个默认角色。当该用户连接数据库时,自动激活该角色。当不再需要一个角色时,可以删除这个角色。
一个初始化的数据库系统总是包含一个预定义角色,默认是一个”superuser”,并且在默认情况下(除非在运行 initdb 时修改)角色的名字和初始化数据库集簇的操作系统用户相同。习惯上,这个角色将被命名为SYSTEM。若想创建更多角色,首先必须以初始角色的身份连接数据库。
每一个到数据库服务器的连接都是使用某个特定角色名建立的,并且这个角色决定发起连接的命令的初始访问权限。用于特定数据库连接的角色名称由以特定于应用程序的方式启动连接请求的客户端指示。例如,ksql程序使用-U命令行选项来指定以哪个角色连接。很多应用假定该名字默认是当前操作系统用户(包括createuser 和 ksql)。因此在角色和操作系统用户之间维护一个名字对应关系通常是很方便的。
一个给定客户端连接能够用来连接的数据库角色的集合由该客户端的认证设置决定,详见 用户的客户端认证 (因此,一个客户端不止限于以匹配其操作系统用户的角色连接,就像一个人的登录名不需要匹配他的真实名字一样)。因为角色身份决定一个已连接客户端可用的权限集合,在设置一个多用户环境时要小心地配置权限。
2. 安装预定义角色¶
KingbaseES提供了一组默认角色,它们提供对特定的、通常需要的、需要特权的功能和信息的访问。管理员可以把这些角色 GRANT 给其环境中的用户或者其他角色,让这些用户能够访问指定的功能和信息。
角色 | 描述 |
---|---|
sys_read_all_settings | 读取所有配置变量,甚至是那些通常只对超级用户可见的变量。 |
sys_read_all_stats | 读取所有的sys_stat_*视图并且使用与扩展相关的各种统计信息,甚至是那些通常只对超级用户可见的信息。 |
sys_stat_scan_tables | 执行可能会在表上取得 ACCESS SHARE 锁的监控函数(可能会持锁很长时间)。 |
sys_monitor | 读取/执行各种监控视图和功能。这个角色是sys_read_all_settings 、sys_read_all_stats和sys_stat_scan_tables 的成员 |
sys_signal_backend | 通知另一个后端取消查询或终止其会话. |
sys_read_server_files | 允许使用 COPY 以及其他文件访问函数从服务器上该数据库可访问的任意位置读取文件。 |
sys_write_server_files | 允许使用COPY以及其他文件访问函数在服务器上该数据库可访问的任意位置中写入文件。 |
sys_execute_server_program | 允许用运行该数据库的用户执行数据库服务器上的程序来配合 COPY 和其他允许执行服务器端程序的函数。 |
3. 创建角色¶
CREATE ROLE 向KingbaseES数据库集簇增加一个新的角色。创建角色必须具有 CREATEROLE特权或者成为 超级管理员。角色是定义在数据库集簇层面上的,并且因此在集簇中的所有数据库中都可用。例如:
CREATE ROLE name;
4. 角色授权类型¶
一个数据库角色可以有一些属性,它们定义角色的权限并且与客户端认证系统交互。
-
login privilege
只有具有 LOGIN 或 ACCOUNT UNLOCK 属性的角色才能被用于一个数据库连接的初始角色名称。一个带有 LOGIN 或 ACCOUNT UNLOCK 属性的角色可以被认为和一个“数据库用户”相同。要创建一个带有登录权限的角色,使用三者之一:
CREATE ROLE name LOGIN; CREATE USER name; CREATE USER name ACCOUNT UNLOCK; (CREATE USER 和 CREATE ROLE 等效,除了 CREATE USER 默认假定有 LOGIN,而 CREATE ROLE 没有)。
-
superuser status
一个数据库超级用户会绕开所有权限检查,除了登入的权限。这是一个危险的权限并且应该小心使用,最好用一个不是超级用户的角色来完成大部分工作,您必须作为一个超级用户来完成这些。要创建一个新数据库超级用户,使用:
CREATE ROLE name SUPERUSER;
-
database creation
一个角色必须被显式给予权限才能创建数据库(除了超级用户,因为它们会绕开所有权限检查)。要创建这样一个角色,使用:
CREATE ROLE name CREATEDB;
-
role creation
一个角色必须被显式给予权限才能创建更多角色(除了超级用户,因为它们会绕开所有权限检查)。要创建这样一个角色,使用
CREATE ROLE name CREATEROLE;
一个带有 CREATEROLE权限的角色也可以修改和删除其他角色,还可以授予或回收角色中的成员关系。然而,要创建、修改、删除或修改一个超级用户角色的成员关系,需要以超级用户的身份操作。CREATEROLE 不足以完成这一切。
-
initiating replication
一个角色必须被显式给予权限才能发起流复制(除了超级用户,因为它们会绕开所有权限检查)。一个被用于流复制的角色必须也具有 LOGIN 权限。要创建这样一个角色,使用:
CREATE ROLE name REPLICATION LOGIN;
-
password
只有当客户端认证方法要求用户在连接数据库时提供一个口令时,一个口令才有意义。password 和 md5 认证方法使用口令。数据库口令与操作系统命令独立。在角色创建时指定一个口令:
CREATE ROLE name PASSWORD “string“;
5. 修改角色¶
ALTER ROLE 更改一个KingbaseES角色的属性。数据库超级用户能够更改任何角色的任何这些设置。具有 CREATEROLE特权的角色能够更改任何这些设置,但是只能为非超级用户和非复制角色修改。普通角色只能更改它们自己的口令。示例如下:
更改一个角色的口令:
ALTER ROLE test WITH PASSWORD 'hu8jmn3';
让一个角色能够创建其他角色和新的数据库:
ALTER ROLE test CREATEROLE CREATEDB;
更改一个口令的失效日期,指定该口令应该在2015年5月4日中午(在一个比UTC快1小时的时区)过期:
ALTER ROLE test VALID UNTIL 'May 4 12:00:00 2015 +1';
6. 删除角色¶
DROP ROLE 删除一个数据库角色。删除角色需要注意以下几点:
-
删除一个数据库管理员角色,必须本身就是一个数据库管理员。
-
删除一个非数据库管理员角色,必须具有 CREATEROLE特权。
-
如果一个角色仍然被集簇中任何数据库中引用,它就不能被移除。如果尝试删除将会抛出一个错误。在删除该角色前,必须删除(或者重新授予所有权)它所拥有的所有对象并且收回该已经授予给该角色的在其他对象上的特权。
-
没有必要删除涉及该角色的角色成员关系。DROP ROLE 会自动收回目标角色在其他角色中的成员关系,以及其他角色在目标角色中的成员关系。其他角色不会被删除也不会被影响。
例如,要删除一个角色:
DROP ROLE test;
7. 角色启用禁用¶
在不删除角色的前提下,在本地库内使角色失效,使失效的角色再生效。详见插件 roledisable 。
7.1. 加载插件¶
修改 kingbase.conf 文件中 shared_preload_libraries
参数。
shared_preload_libraries = 'roledisable' create extension roledisable;
7.2. 查看角色状态¶
SYSTEM 可以通过roledisable.sys_role_status视图来查看系统所有角色在当前库内的启用/禁用状态。
SELECT * FROM roledisable.sys_role_status;
字段说明
oid
角色在数据库内的ID。
rolename
角色在数据库内的名称。
status
角色的状态 Enable表示角色被启用,Disable 表示角色被禁用。
7.3. 启用角色¶
将角色设置为启用状态。
ALTER ROLE rolename ENABLE;
-
执行权限: 需要以系统管理员权限执行,以非系统管理员执行时报告错误。
-
角色要求:被启用的角色需事先存在。
-
新建角色:新创建的角色默认为启用状态。
7.4. 禁用角色¶
将角色设置为禁用状态。
ALTER ROLE rolename DISABLE;
-
执行权限:需要以系统管理员权限执行,以非系统管理员执行时报告错误。
-
角色要求:被禁用的角色需事先存在。
-
系统内置角色;系统内置角色无法被禁用。如初始化用户、sao、sso等无法被禁用。
7.5. 被禁用角色的表现¶
-
当角色被禁用后,断开权限继承关系,不能从该角色直接和间接继承权限,间接使用被禁用角色的权限时应该报角色被禁用或权限错误。
-
以 SET ROLE 切换到被禁用的角色时报告错误。
-
当会话使用的系统管理员角色被禁用时,因系统管理员绕过权限检查因此不会对其造成权限的影响。
-
当前会话使用的非系统管理员角色被禁用时,被禁用角色对权限继承关系产生影响因缓存机制可能不会立即生效,当切换角色权限检查或重新登录后生效。
-
角色在使用期间被禁用时,以被禁用角色(非系统管理员)执行需检查权限的操作时,报当前角色被禁用错误。
-
角色被禁用状态下,可以修改角色权限和角色关系。如使用 GRANT 和 REVOKE 对其操作,使用 ALTER ROLE 对其操作。