在上一期 KWDB 数据库安全与审计中主要介绍了数据加密、身份鉴别和审计管理。今天我们将重点介绍安全与审计中的 “权限管理”。
KWDB 权限管理机制较为灵活,为用户提供了多层次、多维度的权限管理功能,具体包括:
-
基于角色的权限管理:管理员可以创建不同的角色,并为每个角色分配特定的权限。通过将用户和角色分配到适当的角色中,实现对用户权限的管理,从而简化权限管理流程,确保安全性。
-
细粒度的对象级权限控制:KWDB 允许管理员对数据库中的对象,例如数据库、表,进行细粒度的权限控制。管理员可以精确地指定哪些用户或角色可以访问特定的数据库对象,以及可以执行的操作类型。
-
动态权限调整:管理员可以随时根据需要调整用户或角色的权限,包括增加、修改或撤销权限,及时响应业务需求或安全策略的变化,保障系统的灵活性和安全性。
01 角色和成员管理
KWDB 使用角色(Role)来管理用户权限。角色是权限的集合,用户可以通过赋予角色来获得相应的权限。这样做简化了权限管理,方便对用户进行分组和管理。
✅ 创建角色
KWDB 使用 CREATE ROLE 语句来创建新角色,并为角色设置各种选项,如创建角色选项和登录选项。
前提条件:
-
用户拥有 CREATEROLE 选项或是 admin 角色的成员。
SQL 语法:
CREATE ROLE <name> [IF NOT EXISTS] [WITH ];
参数说明:
-
IF NOT EXISTS:可选关键字,如果设置了 IF NOT EXISTS,当要创建的角色不存在时,系统创建角色;如果已经存在,系统不会创建角色,但是不报错。如果未设置 IF NOT EXISTS,当要创建的角色不存在时,系统创建角色;如果已经存在,系统报错,提示角色已存在。
-
name:要创建的角色名称。角色名称不区分大小写;必须以字母或下划线开头;必须仅包含字母,数字或下划线;且必须介于 1 到 63 个字符之间。
-
role_options :可选参数,可以包含以下一个或多个选项:
-
-
CREATEROLE:创建角色。设置该选项的角色可以创建、修改或删除其他用户或角色。默认情况下,创建角色时不设置该选项。
-
NOCREATEROLE:创建角色时的默认选项,表示禁止创建角色。
-
LOGIN:允许登录,设置该选项的角色可以登录 KWDB 服务器,默认情况下,创建角色时不设置该选项。
-
NOLOGIN:创建角色时的默认选项,表示禁止登录。
-
PASSWORD
:设置角色密码,设置该选项的角色可以使用密码安全访问节点。密码必须是字符串的形式,并使用单引号(')将密码括起来,支持设置为 NULL。 -
VALID UNTIL
-
示例 1:创建默认角色
默认情况下,该角色未设置创建角色选项也不支持登录。
> CREATE ROLE role1;
CREATE ROLE
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | NOLOGIN | {}
root | CREATEROLE | {admin}
(3 rows)
示例 2:创建角色,并为该角色设置创建角色选项
> CREATE ROLE role2 WITH CREATEROLE;
CREATE ROLE
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | NOLOGIN | {}
role2 | CREATEROLE, NOLOGIN | {}
root | CREATEROLE | {admin}
(4 rows)
示例 3:创建角色,并为该角色设置登录选项
> CREATE ROLE role3 WITH LOGIN;
CREATE ROLE
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | NOLOGIN | {}
role2 | CREATEROLE, NOLOGIN | {}
role3 | | {}
root | CREATEROLE | {admin}
(5 rows)
示例 4:创建角色,并为该角色设置密码和密码有效期
> CREATE ROLE role4 WITH PASSWORD '11aa!!AA' VALID UNTIL '2024-01-01';
CREATE ROLE
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | NOLOGIN | {}
role2 | CREATEROLE, NOLOGIN | {}
role3 | | {}
role4 | NOLOGIN, VALID UNTIL=2024-01-01 00:00:00+00:00 | {}
root | CREATEROLE | {admin}
(6 rows)
✅ 查看角色
SHOW USERS 和 SHOW ROLES 语句均可用于查看已创建的角色。
示例:查看已创建的角色:
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | NOLOGIN | {}
role2 | CREATEROLE, NOLOGIN | {}
role3 | | {}
role4 | NOLOGIN, VALID UNTIL=2024-01-01 00:00:00+00:00 | {}
root | CREATEROLE | {admin}
(6 rows)
✅ 更改角色
ALTER ROLE 语句可用于更改角色的一个或多个选项,如更改登录密码等。每条语句只支持更改一个角色。
前提条件:
-
用户拥有 CREATEROLE 选项或是 admin 角色的成员。
SQL 语法:
ALTER ROLE [IF EXISTS] [WITH ];
参数说明:
-
IF EXISTS:可选关键字,若角色存在,则更改角色;若角色不存在,系统不报错。
-
role_name:要更改的角色名称,角色名不区分大小写;必须以字母或下划线开头,仅包含字母,数字或下划线;长度在 1 到 63 个字符之间。
-
role_options:可选参数,可同时设置多个选项
-
-
CREATEROLE:创建角色。设置该选项的角色可以创建、修改或删除其他用户或角色。默认情况下,创建角色时不设置该选项。
-
NOCREATEROLE:创建角色时的默认选项,表示禁止创建角色。
-
LOGIN:允许登录,设置该选项的角色可以登录 KWDB 服务器。默认情况下,创建角色时不设置该选项。
-
NOLOGIN:创建角色时的默认选项,表示禁止登录。
-
PASSWORD
:设置角色密码。设置该选项的角色可以使用密码安全访问节点。密码必须是字符串的形式,并使用单引号(')将密码括起来,支持设置为 NULL。 -
VALID UNTIL
-
示例 1:修改角色,为角色设置 CREATEROLE 选项
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | NOLOGIN | {}
role2 | CREATEROLE, NOLOGIN | {}
role3 | | {}
role4 | NOLOGIN, VALID UNTIL=2024-01-01 00:00:00+00:00 | {}
root | CREATEROLE | {admin}
(6 rows)
> ALTER ROLE role1 WITH CREATEROLE;
ALTER ROLE
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | CREATEROLE, NOLOGIN | {}
role2 | CREATEROLE, NOLOGIN | {}
role3 | | {}
role4 | NOLOGIN, VALID UNTIL=2024-01-01 00:00:00+00:00 | {}
root | CREATEROLE | {admin}
(6 rows)
示例 2:修改角色密码
> ALTER ROLE role2 WITH PASSWORD 'pas2doc';
ALTER ROLE
示例 3:修改角色密码的有效期
> ALTER ROLE role3 WITH VALID UNTIL '2025-12-31';
ALTER ROLE
> SHOW ROLES;
username | options | member_of
-----------+------------------------------------------------+------------
admin | CREATEROLE | {}
role1 | CREATEROLE, NOLOGIN | {}
role2 | CREATEROLE, NOLOGIN | {}
role3 | | {}
role4 | NOLOGIN, VALID UNTIL=2025-12-31 00:00:00+00:00 | {}
root | CREATEROLE | {admin}
(6 rows)
✅ 为角色添加成员
使用 GRANT
前提条件:
-
用户拥有 admin 权限。
SQL 语法:
GRANT TO [WITH ADMIN OPTION];
参数说明:
-
role_name:角色名。支持一次为多个角色添加同一成员,角色名之间使用逗号分隔。
-
user_name:要添加的成员,成员可以是用户或角色,支持一次为角色添加多个成员,成员名之间使用逗号分隔。
-
WITH ADMIN OPTION:将成员指定为角色的管理员。角色管理员可以授予或撤销角色的成员资格。
示例 1:为角色添加成员,默认无管理员权限
> GRANT role1 TO user1;
GRANT
> SHOW GRANTS ON ROLE role1;
role_name | member | is_admin
------------+--------+-----------
role1 | user1 | false
(1 row)
示例 2:为角色添加角色管理员
> GRANT role1 TO user1 WITH ADMIN OPTION;
GRANT
> SHOW GRANTS ON ROLE role1;
role_name | member | is_admin
------------+--------+-----------
role1 | user1 | true
(1 row)
✅ 从角色中删除成员
使用 REVOKE 语句将成员从角色中删除。
注意:无法将 root 用户从 admin 角色中删除。
前提条件:
-
用户拥有 admin 权限。
SQL 语法:
REVOKE [ADMIN OPTION FOR] FROM ;
参数说明:
-
ADMIN OPTION FOR:可选关键字,如果设置该关键字,只撤销用户的管理员角色,但不删除其成员资格;如果没有设置该关键字,删除角色成员。
-
role_name:要删除成员的角色。支持从多个角色中删除同一成员,多个角色之间使用逗号分隔。
-
user_name:要从角色中删除的成员,成员可以是用户或角色,支持一次删除多个用户或角色,多个成员之间使用逗号分隔。
示例 1:只撤销成员的管理员角色,不删除其成员资格
> SHOW GRANTS ON ROLE role1;
role_name|member|is_admin
---------+------+--------
role1 |role2 |false
role1 |user1 |true
(2 rows)
> REVOKE ADMIN OPTION FOR role1 FROM user1;
REVOKE
> SHOW GRANTS ON ROLE role1;
role_name|member|is_admin
---------+------+--------
role1 |role2 |false
role1 |user1 |false
(2 rows)
示例 2:删除角色的成员
> SHOW GRANTS ON ROLE role1;
role_name|member|is_admin
---------+------+--------
role1 |role2 |false
role1 |user1 |false
(2 rows)
> REVOKE role1 FROM user1;
REVOKE
> SHOW GRANTS ON ROLE role1;
role_name|member|is_admin
---------+------+--------
role1 |role2 |false
(1 row)
✅ 删除角色
使用 DROP ROLE 语句删除已创建的角色。每条语句支持删除多个角色。
前提条件:
-
用户拥有 CREATEROLE 选项或是 admin 角色的成员。
SQL 语法:
DROP ROLE [IF EXISTS] <name>;
参数说明:
-
IF EXISTS:可选关键字,设置了 IF EXISTS,如果角色存在,系统删除角色;如果角色不存在,系统不会删除角色,但不会报错。没有设置 IF EXISTS,如果角色存在,系统删除角色;如果角色不存在,系统报错,提示角色不存在。
-
name:要删除的角色名。支持同时删除多个角色,角色之间使用逗号分隔。
示例:删除角色 role1:
DROP ROLE role1;
02 权限管理
KWDB 支持对数据库和表在内的数据库对象的访问和操作权限进行管理,从而确保数据库安全性,具体支持的权限包括:
权限 |
说明 |
操作对象 |
---|---|---|
ALL |
对指定数据库对象执行所有操作 |
DATABASE TABLE SCHEMA(只适用于关系数据的自定义模式) |
CREATE |
创建新对象 |
DATABASE TABLE SCHEMA(只适用于关系数据的自定义模式) |
DROP |
删除指定对象 |
DATABASE TABLE SCHEMA(只适用于关系数据的自定义模式) |
GRANT |
授予指定用户特定权限 |
DATABASE TABLE SCHEMA(只适用于关系数据的自定义模式) |
SELECT |
对指定数据表执行查询操作 |
TABLE |
INSERT |
对指定数据表执行数据插入操作 |
TABLE |
DELETE |
删除指定数据表 |
TABLE |
UPDATE |
更新指定数据表 |
TABLE |
✅ 授予权限
权限授予是指将特定权限赋予用户或角色,使其能够执行相应的操作。权限可以授予多个用户或角色,也可以针对多个目标对象进行配置。
前提条件:
-
用户拥有 admin(ALL)权限
SQL 语法:
GRANT ON [TABLE | DATABASE | SCHEMA] To ;
参数说明:
-
privilege:权限名,支持同时授予多个权限,由逗号分隔,支持使用 ALL 表述授予所有权限。
-
target_name:目标对象名称。支持同时向多个目标对象授予权限,由逗号分隔。
-
user_name:用户或角色名称,支持同时多个用户或角色授予,由逗号分隔。
示例 1:授予用户特定数据库的创建权限
> GRANT CREATE ON DATABASE db1, defaultdb TO operatora;
✅ 撤销权限
权限撤销是指移除用户或角色的特定权限,以限制其对数据库对象的操作。撤销权限时,可以指定多个用户或角色,也可以针对多个目标对象进行配置。
前提条件:
-
用户拥有 admin(ALL)权限
SQL 语法:
REVOKE ON [TABLE | DATABASE | SCHEMA] FROM ;
参数说明:
-
privilege:权限名,支持同时撤销多个权限,用逗号分隔,支持使用 ALL 表述撤销所有权限。
-
target_name:目标对象名称。支持同时撤销多个目标对象的权限设置,用逗号分隔。
-
user_name:用户或角色名称,支持同时多个用户或角色撤销权限,用逗号分隔。
示例 1:撤销用户特定数据库的创建权限
> REVOKE CREATE ON DATABASE db1, defaultdb FROM user11;
示例 2:撤销用户指定表的删除权限
> REVOKE DELETE ON TABLE defaultdb.t1 FROM user11;
✅ 查询权限
查询权限是指查看当前数据库中用户或角色的权限分配情况,帮助管理员了解和管理权限配置。
前提条件:
-
当前用户拥有 admin(ALL)权限。
SQL 语法:
SHOW GRANTS [ON [ROLE | DATABASE | SCHEMA | TABLE] <name> [For ]];
参数说明
-
name:目标对象名称,支持查看多个对象的权限设置,名称之间使用逗号分隔。
-
user_name:可选参数,用户或角色名称,支持查看多个用户或角色,由逗号分隔。
示例 1:查看表与用户的权限关系
> SHOW GRANTS ON TABLE defaultdb.t1;
database_name|schema_name|table_name|grantee|privilege_type
-------------+-----------+----------+-------+--------------
defaultdb |public |t1 |admin |ALL
defaultdb |public |t1 |root |ALL
defaultdb |public |t1 |user11 |DELETE
(3 rows)
示例 2:查看库与用户的权限关系
> SHOW GRANTS ON DATABASE defaultdb;
database_name|schema_name |grantee|privilege_type
-------------+------------------+-------+--------------
defaultdb |information_schema|admin |ALL
defaultdb |information_schema|root |ALL
defaultdb |information_schema|user11 |CREATE
(3 rows)
示例 3:查看所有权限
> SHOW GRANTS;
以上就是 KWDB 数据库权限管理的全部内容,更多精彩后续欢迎关注我们!
往期推荐:
《一文讲透》第 4 期:KWDB 数据库运维(1) —— 日志系统解读
《一文讲透》第 4 期:KWDB 数据库运维(2) —— 集群参数
《一文讲透》第 4 期:KWDB 数据库运维(3) —— 安全与审计(上)
评论记录:
回复评论: