Skip to content

docs: role and privilege #215

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions dir.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,22 @@
- title_en: TLS
title_cn: TLS
path: user-security/tls
- title_en: Access Control
title_cn: 访问控制
collapsed: true
children:
- title_en: Overview
title_cn: 概述
path: user-security/access-control/overview
- title_en: User Management
title_cn: 用户管理
path: user-security/access-control/user
- title_en: Privileges
title_cn: 权限管理
path: user-security/access-control/privilege
- title_en: Role Management
title_cn: 角色管理
path: user-security/access-control/role
- title_en: Release Notes
title_cn: 版本发布说明
collapsed: true
Expand Down
Empty file.
Empty file.
Empty file.
Empty file.
40 changes: 40 additions & 0 deletions zh_CN/user-security/access-control/overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 访问控制概述

访问控制系统是数据库安全的核心,它决定了哪些用户可以连接到数据库以及他们被允许执行哪些操作。Datalayers 的访问控制系统主要围绕用户、权限、角色三个核心概念构建。

## 用户

用户是指连接到 Datalayers 数据库服务器的客户端。每个用户都由一个用户账户标识,用户账户由用户名和主机名构成,例如 `'user'@'127.0.0.1'` 表示用户名为 `user` 的用户从本机连接到服务器。通过这种用户名和主机名结合的方式,可以为从不同主机登录的用户设置不同的权限。

更多有关用户账户的信息请参照:[用户管理](./user.md)。

## 权限

权限定义了用户可以在数据库中执行的具体操作。Datalayers 提供了三种类型的权限:

- 全局权限:适用于服务器中所有对象的权限,以及与系统管理相关的权限,例如:在任意数据库中建表的权限,向集群中添加节点的权限等。

- 数据库权限:适用于指定的数据库及其包含的所有对象的权限。例如:在数据库中建表、删表的权限,访问数据库中某张表的权限等。

- 对象权限:适用于数据库中的特定对象的权限,当前 Datalayers 仅支持表级权限,例如:访问某张表的权限。

通过授予和撤销这些权限,数据库管理员可以精确控制用户对数据的访问和操作能力。

更多有关权限的信息请参照:[权限管理](./privilege.md)。

## 角色

角色是权限的集合,也可以将其视为一个没有直接登录能力的特殊用户。角色可以被授予一组预定义的权限,然后将该角色授予一个或多个用户。用户被授予角色后,可以直接使用角色被授予的权限。

角色的主要作用在于将权限分组,从而简化权限管理,尤其是在用户众多、权限需求复杂的环境中。通过创建不同的角色来代表不同的职责或访问级别(例如,一个 `read_only` 角色只拥有查询权限,一个 `app_user` 角色拥有数据读写权限),数据库管理员可以避免为每个用户单独授予和撤销大量权限,只需将相应的角色授予用户即可。


更多有关角色的信息请参照:[角色管理](./role.md)。

## 访问控制流程

当一个用户尝试连接到 Datalayers 服务器并执行某个操作时,访问控制系统会进行以下检查:

1. 身份验证:检查客户端传递的用户名与主机名是否存在于系统中,以及对应的密码是否正确。若是则连接成功,否则拒绝该连接。

2. 请求验证:连接成功后,对于客户端发起的后续请求,系统会检查是否符合相应的权限要求,例如是否具有建表的权限。此过程是自上而下的,即按照全局权限、数据库权限、对象权限的顺序检查,只要在任何一个级别中具备相关权限,请求将被接受。
159 changes: 159 additions & 0 deletions zh_CN/user-security/access-control/privilege.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# 权限管理

权限是指角色或用户访问数据库对象的能力。

## 权限类型

Datalayers 中支持的权限包括:

| 权限名称 | 权限类型 | 描述 |
| ------------------ | ---------------- | ------------------------------------ |
| ALL \[PRIVILEGES\] | 全局 | 授予所有权限,通常用于管理员账户 |
| CREATE ROLE | 全局 | 允许创建新的角色 |
| CREATE USER | 全局 | 允许创建新用户 |
| DROP ROLE | 全局 | 允许删除角色 |
| RELOAD | 全局 | 允许重新加载系统表或配置文件 |
| SHOW DATABASES | 全局 | 允许查看数据库列表 |
| SUPER | 全局 | 允许执行高权限操作 |
| USAGE | 全局 | 表示没有权限,通常表示默认权限 |
| ALTER | 全局、表 | 允许修改表结构,如添加、删除列等 |
| DELETE | 全局、表 | 允许删除表中的数据 |
| INDEX | 全局、表 | 允许创建和删除索引 |
| INSERT | 全局、表 | 允许向表中插入数据 |
| SELECT | 全局、表 | 允许查询表中的数据 |
| UPDATE | 全局、表 | 允许更新表中的数据 |
| CREATE | 全局、数据库、表 | 允许创建数据库、表或索引等数据库对象 |
| DROP | 全局、数据库、表 | 允许删除数据库、表或视图 |
| GRANT | 全局、数据库、表 | 允许将权限授予其他用户 |

## 授予权限

可以通过如下命令授予用户或角色权限:

```sql
GRANT priv_type [, priv_type] ...
ON priv_level
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
```

- `priv_type`:权限类型,如 SELECT, INSERT, UPDATE 等。

- `priv_level`:权限级别,表明权限的作用范围
- `*.*`:全局权限,针对数据库中所有数据对象
- `db_name.*`:数据库级权限,针对某数据库下所有对象
- `db_name.tbl_name`:表级权限,针对某数据库中的某表

- `user_or_role`:用户账户或角色名,其中的主机名部分支持通配符`%`,例如`'alice'@'%'`可以匹配从任意主机登录的`alice`

- `WITH GRANT OPTION`:可选选项,表示是否顺带授予 GRANT 权限,以使得被授权者可将权限再授予他人

示例:

授予用户 `'username'` 在 `test_db` 数据库中的查询权限,且只能从 `192.168.1.%` 网段的主机上查询:

```sql
GRANT SELECT ON test_db.* TO 'username'@'192.168.1.%';
```

授予 `admin` 角色对数据库 `sales_db` 中 `orders` 表的插入和更新权限,并允许 `admin` 将这些权限再授予其他用户:

```sql
GRANT INSERT, UPDATE ON sales_db.orders TO 'admin'@'127.0.0.1' WITH GRANT OPTION;
```

授予 `developer` 用户对所有数据库、表的所有权限:

```sql
GRANT ALL PRIVILEGES ON *.* TO 'developer'@'127.0.0.1';
```

## 收回权限

可以通过如下命令收回用户或角色的权限:

```sql
REVOKE [IF EXISTS]
priv_type [, priv_type] ...
ON priv_level
FROM user_or_role [, user_or_role] ...
```

- `user_or_role`:用户账户或角色名,其中的主机名部分不支持通配符,必须使用完整名称

示例:

从 `developer` 用户收回对数据库 `sales_db` 中 `orders` 表的插入和更新权限:

```sql
REVOKE INSERT, UPDATE ON sales_db.orders FROM 'developer'@'127.0.0.1';
```

从 `admin` 用户收回对 `production_db` 数据库的所有权限:

```sql
REVOKE ALL PRIVILEGES ON production_db.* FROM 'admin'@'127.0.0.1';
```

## 查看权限

通过如下命令查看用户或角色的权限:

```sql
SHOW GRANTS
[FOR user_or_role
[USING role [, role] ...]]
```

- `user_or_role`:指定查看某个用户或角色的权限,若省略,则查看当前用户
- `USING role [, role] ...`: 指定查看该用户或角色在启用特定角色时,所获得的权限

通过如下命令查看系统中所有支持的权限:

```sql
SHOW PRIVILEGES;
```

## 权限变更生效时机

服务器启动时如果添加了 `--skip-grant-tables` 选项,则启动后不进行访问控制,任何用户都可以执行任意操作。如果没有使用 `--skip-grant-tables` 选项,服务器会在启动后会缓存权限信息到内存,并开启访问控制。

正常情况下,通过权限管理语句(如 `GRANT`、`REVOKE`、`CREATE USER` 等)修改权限信息时,变更会立即在集群中生效。但如果网络或其他设施出现异常,变更可能只在部分节点上生效。不过,系统会周期性地更新节点的缓存,保证变更最终会生效,通常这个时间不超过15分钟。

此外,用户还可以通过 `FLUSH PRIVILEGES` 命令触发缓存更新,如果该命令执行成功,之前的变更将立刻生效。


## 各操作需要的权限

| 操作 | 需要的权限 |
|-----------------------|------------|
| ALTER TABLE | ALTER TABLE ... DROP 需要表的 ALTER, DROP 权限;<br> ALTER TABLE ... RENAME 需要旧表的 ALTER 和 DROP 权限,以及新表的 ALTER,CREATE 和 INSERT 权限;<br> 其余 ALTER TABLE 操作需要表的 ALTER,CREATE 和 INSERT 权限;|
| ANALYZE TABLE | 表的 INSERT 和 SELECT 权限 |
| ALTER USER | CREATE USER 权限 |
| COMPACT TABLE | 表的 INSERT 权限|
| CREATE DATABASE | 全局 CREATE 权限 |
| CREATE INDEX | 表的 INDEX 权限 |
| CREATE TABLE | 数据库的 CREATE 权限|
| CREATE ROLE | CREATE ROLE 权限 |
| CREATE USER | CREATE USER 权限 |
| DESC TABLE | 表的 SELECT 权限 |
| DROP DATABASE | 数据库的 DROP 权限 |
| DROP INDEX | 表的 INDEX 权限 |
| DROP TABLE | 表的 DROP 权限 |
| DROP ROLE | DROP ROLE 权限 |
| DROP USER | CREATE USER 权限 |
| EXCLUDE NODE | SUPER 权限 |
| EXPLAIN | 需要与 EXPLAIN 要分析的语句相同的权限 |
| FLUSH | RELOAD 权限 |
| GRANT | 如果是授予权限,需要 GRANT 权限以及 GRANT 所赋予的权限;<br> 如果是授予角色,需要满足以下条件之一:(1)具有SUPER 权限(2)已经被授予过该角色,且 `WITH_GRANT_OPTION = true`|
| INCLUDE NODE | SUPER 权限 |
| REBALANCE | SUPER 权限 |
| REVOKE | 如果是收回权限,需要 GRANT 权限以及 REVOKE 所撤销的权限;<br> 如果是收回角色,需要 `SUPER` 权限|
| SET DEFAULT ROLE | CREATE USER 权限或者 `information_schema.default_roles` 表的 UPDATE 权限(为当前用户启用角色则无需权限) |
| SHOW CREATE TABLE | 表的任意一种权限 |
| SHOW DATABASES | 能查看至少有一种权限的数据库,若具有 SHOW DATABASES 权限,则能查看所有数据库 |
| SHOW GRANTS | `information_schema` 数据库的 SELECT 权限(查看当前用户则无需权限) |
| SHOW TABLES | 能查看至少有一种权限的表 |
| TRIM DATABASE | 数据库的 DROP 权限|
| TRUNCATE TABLE | 表的 DROP 权限 |
| USE | 数据库或其中数据对象的任意一种权限 |
76 changes: 76 additions & 0 deletions zh_CN/user-security/access-control/role.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# 角色

角色是一系列权限的集合,也可以视为不可登录的特殊用户。

## 创建角色

可以通过如下命令创建角色:

```sql
CREATE ROLE [IF NOT EXISTS] role [, role ] ...
```

- `role`:角色名,如`admin`,`developer`。此外,主机名也可以作为角色名的一部分,如`'admin'@'127.0.0.1'`,但主机名不具有实际含义,仅作为字面量存储,不可用于登录,缺省值为`%`。

## 授予角色权限

授予角色权限的操作与授予用户权限相同。

示例:

授予角色 `manager` 对数据库 `sales_db` 中所有表的查询权限:

```sql
GRANT SELECT ON sales_db.* TO 'manager'@'%';
```

授予角色 `admin` 对 `inventory_db` 中 `products` 表的插入和更新权限,并允许该角色将权限授予其他用户:

```sql
GRANT INSERT, UPDATE ON inventory_db.products TO 'admin' WITH GRANT OPTION;
```

## 收回角色权限

收回角色权限的操作与收回用户权限相同。

示例:

从角色 `readonly` 收回对数据库 `hr_db` 中所有表的查询权限:

```sql
REVOKE SELECT ON hr_db.* FROM 'readonly';
```

从角色 `editor` 收回对数据库 `content_db` 中 `articles` 表的所有权限:

```sql
REVOKE ALL ON content_db.articles FROM 'editor';
```

## 将角色授予给用户

角色可以作为一个权限的集合体授予给用户或其他角色,被授予者将继承授予者的权限。

角色的授予可以通过如下命令实现:

```sql
GRANT user_or_role [, user_or_role] ...
TO user_or_role [, user_or_role] ...
[WITH ADMIN OPTION]
```

授予者与被授予者之间不得形成权限继承环,因此在执行该命令前,系统会检查是否会导致循环依赖关系,若存在则拒绝执行。

角色授予给用户后将立即生效,用户可以直接使用角色的权限。

## 将角色从用户处收回

通过如下命令解除角色或用户间的权限继承关系:

```sql
REVOKE user_or_role [, user_or_role] ...
FROM user_or_role [, user_or_role] ...
```

收回后,用户将无法再使用该角色的权限。
48 changes: 48 additions & 0 deletions zh_CN/user-security/access-control/user.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 用户管理

## 创建用户

用户账户由主机名和用户名构成,可以通过如下命令创建账户并设置密码:

```sql
CREATE USER [IF NOT EXISTS] user [IDENTIFIED BY 'password'];
```

- `user`:格式为`'user_name'@'host_name'`,例如 `'alice'@'127.0.0.1'`
- `password`:账户密码,最长为32位字符

用户账户创建以后,可以在客户端启动时传递如下参数登录账户:

```shell
dlsql --username xxx --password xxx
```

或者简写为:

```shell
dlsql -u xxx -p xxx
```

## 修改密码

用户创建成功后,可以通过如下命令修改账户密码:

```sql
ALTER USER [IF EXISTS] user IDENTIFIED BY 'password';
```

## 删除用户

用户创建成功后,可以通过如下命令删除用户:

```sql
DROP USER [IF EXISTS] user;
```

## 查看当前用户

可以通过如下指令查看当前会话中登录用户:

```sql
SELECT USER();
```