# 基于角色的访问控制(RBAC)

注意

本指南仅适用于DB版本0.9.6或更高版本。

创建集群后,您将被视为具有最高访问控制权限的集群管理员。

提示

有关查找集群管理员用户名和密码的详细说明,请参见连接详细信息

要与其他用户共享您的集群或为特定个人提供只读访问权限,您可以利用MyScale的基于角色的访问控制(Role-Based Access Control,RBAC)功能来管理多个用户之间的数据共享。

注意

通过MyScale的RBAC功能创建的用户与Web控制台中的用户没有关联。

# MyScale RBAC:为什么重要?

将用户隔离在数据库中并限制对每个用户数据的访问被认为是最佳实践,可以通过以下方式实现:

  • 为每个用户创建一个单独的数据库,并以用户的名称命名
  • 授予该用户在相应数据库上的所有权限

这种方法允许用户在其数据库上执行操作,例如创建表、查询数据、删除表和修改表结构,而不会对其他用户产生负面影响。数据库管理员无需为每个用户单独授予创建表或查询单个数据库中的表的权限。

它消除了每次创建新表时需要为用户分配查询权限的需要,减少了管理开销,同时确保未经授权的用户无法访问数据库。当需要在特定用户之间共享数据时,管理员可以在特定数据库和表上向其他用户授予只读权限。

# 使用MyScale RBAC管理用户访问控制

在描述如何使用MyScale RBAC管理用户访问控制之前,让我们先看一个使用案例。

假设一家文件检索公司的各个部门将其数据存储在MyScale中。每个部门都有几个具有其部门数据读写权限的管理员。其他部门用户可以使用SQL和向量搜索查询对此数据进行只读访问。

提示

还可能存在某个特定部门的数据必须在其他部门之间共享的情况。

具有access_management权限的集群管理员负责管理所有用户和角色的基于角色的访问权限,包括创建和授予数据库和数据库表上的访问权限等任务。

让我们看看集群管理员如何使用MyScale中的RBAC(基于角色的访问控制)来管理数据库访问权限。

# 以集群管理员身份登录

第一步是使用以下选项之一以集群管理员身份登录MyScale:

  • 使用MyScale Web控制台中的SQL工作区,允许您以集群管理员身份执行所有查询。
  • 使用开发工具,如Python客户端,将集群管理员的用户名和密码插入到您的Python代码中。

以下场景描述了集群管理员如何使用MyScale RBAC来管理基于角色的用户访问权限。

# 场景1

在此场景中,集群管理员执行以下任务:

  • 创建两个数据库:department_Adepartment_B
  • 为每个部门数据库创建管理员用户。
  • 设置权限如下:
    • 为部门A和B的管理员用户授予其各自数据库的读/写(或完全)访问权限。
    • 不为来自部门A/B的用户授予对另一个数据库的任何访问权限。

之后,数据库管理员可以在各自的数据库中创建表。

要重复此过程:

# 创建数据库

使用集群管理员帐户登录MyScale,并为A部门和B部门创建管理员用户(如下所示的SQL语句)。

提示

在创建用户帐户时,使用SHA256_hash方法进行密码安全。

-- 为A部门创建数据库和相应的管理员用户
CREATE DATABASE department_A ON CLUSTER '{cluster}';
-- A部门管理员的密码是123456@Qwerty
CREATE USER department_A_admin ON CLUSTER '{cluster}' IDENTIFIED WITH sha256_hash BY 'eccd885c4d63d89a91ee6f3f8f9f4aa1010c0e1f84b97c9d9954768ba5cc478b' DEFAULT DATABASE department_A;
-- 为B部门创建数据库和相应的管理员用户
CREATE DATABASE department_B ON CLUSTER '{cluster}';
-- B部门管理员的密码是123456#Qwerty
CREATE USER department_B_admin ON CLUSTER '{cluster}' IDENTIFIED WITH sha256_hash BY '23f356509386377ebdc7298241fdce8cdef594353cd3ef787802dd86526130c5' DEFAULT DATABASE department_B;
-- 授予相应的管理员用户所有权限。
GRANT ON CLUSTER '{cluster}' ALL ON department_A.* TO department_A_admin;
GRANT ON CLUSTER '{cluster}' ALL ON department_B.* TO department_B_admin;

提示

由于权限不足的用户无法设置自己的密码,请要求用户在将密码交给管理员设置帐户之前,使用诸如此类 (opens new window)生成器对其密码进行哈希处理。密码应符合ClickHouse指定的最低要求,可以在此处 (opens new window)找到。

# 创建A部门表

使用开发工具以department_A_admin用户身份登录MyScale,并创建department_A.chatPDF_meta表。

注意

请记住,A部门管理员只能通过开发工具登录,而不能通过Web控制台登录,因为此用户是使用MyScale RBAC创建的。

-- 创建表。
CREATE TABLE department_A.chatPDF_meta (
    `pdf` String, 
    `title` String, 
    `authors` Array(String), 
    `abstract` String, 
    `pub_date` Nullable(Date32), 
    `doi` String, 
    `publisher` String, 
    `article_type` String, 
    `vector` Array(Float32), 
    VECTOR INDEX vec_idx vector TYPE MSTG('metric_type=Cosine'), 
    CONSTRAINT vec_len CHECK length(vector) = 512
  ) ENGINE = ReplacingMergeTree ORDER BY pdf SETTINGS index_granularity = 8192;

注意

除了部门管理员之外,其他用户无法查看或操作此表中的数据。

# 授予权限给其他用户

作为集群管理员,通过登录MyScale并执行以下SQL语句,向其他用户授予访问权限。

-- 将只读用户U1添加到A部门。
CREATE USER department_A_U1 ON CLUSTER '{cluster}' IDENTIFIED WITH sha256_hash BY '20388ae66ef3c7e13dc5fe9b3808637c2d89a517d46276a7ba19bbaa488c5e78' DEFAULT DATABASE department_A;
-- 授予用户U1的SELECT权限。
GRANT ON CLUSTER '{cluster}' SELECT ON department_A.chatPDF_meta TO department_A_U1;

注意

成功执行此SQL语句后,来自A部门的用户U1具有查看和选择department_A.chatPDF_meta表中的数据的能力。

# 场景2

来自A部门的用户U1仅对chatPDF_meta表具有只读权限。但是,如果用户U1需要更新此表中的数据,则可以向该用户授予读写权限。

注意

此时,为防止意外删除数据,用户U1无法从department_A.chatPDF_meta表中删除数据。

# 授予ALTER TABLE权限

以集群管理员身份登录MyScale,并向用户U1授予ALTER TABLE权限。

-- 向用户U1授予ALTER TABLE权限。
GRANT ON CLUSTER '{cluster}' ALTER TABLE ON department_A.chatPDF_meta TO department_A_U1;

现在,用户U1可以在chatPDF_meta表上执行ALTER操作。

要撤销这些权限,请再次以集群管理员身份登录MyScale,并执行以下SQL语句。

REVOKE ON CLUSTER '{cluster}' ALTER TABLE ON department_A.chatPDF_meta FROM department_A_U1;

# 场景3

最初,A部门管理员创建了chatPDF_user数据表,并未向部门内部用户或外部用户授予任何访问权限。因此,这些用户无法对此表中的数据执行任何CRUD操作。

例如:

  • 来自A部门的用户U1无法查看数据或对chatPDF_user表执行任何操作。

    department_A_U1 :) SHOW TABLES FROM department_A;
    ┌─name─────────┐
    │ chatPDF_meta │
    └──────────────┘
    
  • B部门管理员无法查看数据或对chatPDF_user表执行任何操作。

    department_B_admin :) SHOW TABLES FROM department_A;
    Ok.
    0 rows in set. Elapsed: 0.002 sec.
    

# 场景4

批量授予部门用户访问权限,而无需逐个为每个用户授予权限。当部门或部门中的多个用户需要访问表/数据库中的数据时,通常会将不同的操作权限分组,并使用角色进行管理。第一步是创建这些角色。创建用户角色后,以下步骤是将用户分组并将其添加到相应的角色中。

# 创建角色

以集群管理员身份登录MyScale,创建所需的角色并根据要求授予每个角色权限,如下所示的SQL语句。

-- 在A部门内创建不同的角色。
CREATE ROLE department_A_role_1 ON CLUSTER '{cluster}';
CREATE ROLE department_A_role_2 ON CLUSTER '{cluster}';
-- 根据要求为不同的角色授予相应的权限。
GRANT ON CLUSTER '{cluster}' SELECT ON department_A.chatPDF_meta TO department_A_role_1;
GRANT ON CLUSTER '{cluster}' SELECT, INSERT ON department_A.chatPDF_meta TO department_A_role_2;
GRANT ON CLUSTER '{cluster}' SELECT, INSERT, ALTER TABLE ON department_A.chatPDF_user TO department_A_role_2;

# 将用户添加到角色

当向A部门添加新用户U2时,通过向用户授予角色来授予chatPDF_userchatPDF_meta表的读写权限。

例如:

-- 只需将U2添加到department_A_role_2角色中。
GRANT ON CLUSTER '{cluster}' department_A_role_2 TO department_A_U2;

# 场景5

使用QUOTA功能限制用户配额和资源利用率。例如,您可以为特定角色的最大执行时间和最大查询次数设置限制,如下所示:

以集群管理员身份登录MyScale,创建一个配额并将该配额授予一个角色。

CREATE QUOTA department_A_quota_role1 ON CLUSTER '{cluster}' FOR INTERVAL 30 minute MAX execution_time = 0.5, FOR INTERVAL 5 quarter MAX queries = 321 TO department_A_role_1;
Last Updated: Sat Apr 13 2024 10:45:55 GMT+0000