管理用户权限
本文介绍如何在 StarRocks 中管理用户、角色和权限。
StarRocks 使用基于角色的访问控制(RBAC)和基于身份的访问控制(IBAC)来管理 StarRocks 集群中的权限,使集群管理员能够轻松地在不同的粒度级别上限制集群内的权限。
在 StarRocks 集群中,可以将权限授予用户或角色。角色是可以根据需要分配给集群中的用户或其他角色的一组权限。用户可以被授予一个或多个角色,这些角色决定了他们对不同对象的权限。
查看权限和角色信息
具有系统定义角色 user_admin
的用户可以查看 StarRocks 集群中的所有用户和角色信息。
查看权限信息
您可以使用 SHOW GRANTS 查看授予用户或角色的权限。
-
查看当前用户的权限。
SHOW GRANTS;
注意
任何用户都可以查看自己的权限,而无需任何权限。
-
查看特定用户的权限。
以下示例显示了用户
jack
的权限:SHOW GRANTS FOR jack@'172.10.1.10';
-
查看特定角色的权限。
以下示例显示了角色
example_role
的权限:SHOW GRANTS FOR ROLE example_role;
查看角色
您可以使用 SHOW ROLES 查看 StarRocks 集群中的所有角色。
SHOW ROLES;
管理角色
具有系统定义角色 user_admin
的用户可以在 StarRocks 中创建、授予、撤销或删除角色。
创建角色
您可以使用 CREATE ROLE 创建角色。默认情况下,用户最多可以拥有 64 个角色。您可以使用 FE 动态参数 privilege_max_total_roles_per_user
调整此设置。角色最多可以有 16 个继承级别。您可以使用 FE 动态参数 privilege_max_role_depth
调整此设置。
以下示例创建了角色 example_role
:
CREATE ROLE example_role;
授予角色
您可以使用 GRANT 将角色授予用户或其他角色。
-
将角色授予用户。
以下示例将角色
example_role
授予用户jack
:GRANT example_role TO USER jack@'172.10.1.10';
-
将角色授予另一个角色。
以下示例将角色
example_role
授予角色test_role
:GRANT example_role TO ROLE test_role;
更改用户的默认角色
用户的默认角色在连接到 StarRocks 时会自动激活。有关如何在连接后为用户启用所有(默认和授予的)角色的说明,请参见 启用所有角色。
您可以使用 SET DEFAULT ROLE 或 ALTER USER 设置用户的默认角色。
以下两个示例将 jack
的默认角色设置为 db1_admin
。请注意,db1_admin
必须已分配给 jack
。
-
使用 SET DEFAULT ROLE 设置默认角色:
SET DEFAULT ROLE 'db1_admin' TO jack@'172.10.1.10';
-
使用 ALTER USER 设置默认角色:
ALTER USER jack@'172.10.1.10' DEFAULT ROLE 'db1_admin';
撤销角色
您可以使用 REVOKE 从用户或其他角色撤销角色。
注意
您不能从用户中撤销系统定义的默认角色
PUBLIC
。
-
从用户中撤销角色。
以下示例从用户
jack
中撤销角色example_role
:REVOKE example_role FROM USER jack@'172.10.1.10';
-
从另一个角色中撤销角色。
以下示例从角色
test_role
中撤销角色example_role
:REVOKE example_role FROM ROLE test_role;
删除角色
您可以使用 DROP ROLE 删除角色。
以下示例删除了角色 example_role
:
DROP ROLE example_role;
注意
系统定义的角色不能被删除。
启用所有角色
用户的默认角色是在用户连接到 StarRocks 集群时自动激活的角色。
如果您希望在 StarRocks 用户连接到 StarRocks 集群时启用所有角色(默认和授予的角色),可以执行以下操作。
此操作需要系统权限 OPERATE。
SET GLOBAL activate_all_roles_on_login = TRUE;
您还可以使用 SET ROLE 激活分配给您的角色。例如,用户 jack@'172.10.1.10'
拥有角色 db_admin
和 user_admin
,但它们不是用户的默认角色,并且在用户连接到 StarRocks 时不会自动激活。如果 jack@'172.10.1.10'
需要激活 db_admin
和 user_admin
,他可以运行 SET ROLE db_admin, user_admin;
。请注意,SET ROLE 会覆盖原始角色。如果您想启用所有角色,请运行 SET ROLE ALL。
管理权限
具有系统定义角色 user_admin
的用户可以在 StarRocks 中授予或撤销权限。
授予权限
您可以使用 GRANT 将权限授予用户或角色。
-
将权限授予用户。
以下示例将表
sr_member
上的 SELECT 权限授予用户jack
,并允许jack
将此权限授予其他用户或角色(通过在 SQL 中指定 WITH GRANT OPTION):GRANT SELECT ON TABLE sr_member TO USER jack@'172.10.1.10' WITH GRANT OPTION;
-
将权限授予角色。
以下示例将表
sr_member
上的 SELECT 权限授予角色example_role
:GRANT SELECT ON TABLE sr_member TO ROLE example_role;
撤销权限
您可以使用 REVOKE 从用户或角色中撤销权限。
-
从用户中撤销权限。
以下示例从用户
jack
中撤销表sr_member
上的 SELECT 权限,并禁止jack
将此权限授予其他用户或角色:REVOKE SELECT ON TABLE sr_member FROM USER jack@'172.10.1.10';
-
从角色中撤销权限。
以下示例从角色
example_role
中撤销表sr_member
上的 SELECT 权限:REVOKE SELECT ON TABLE sr_member FROM ROLE example_role;
最佳实践
多服务访问控制
通常,公司拥有的 StarRocks 集群由一个服务提供商管理,并维护多条业务线(LOB),每条业务线使用一个或多个数据库。
如下所示,StarRocks 集群的用户包括服务提供商和两个 LOB(A 和 B)的成员。每个 LOB 由两个角色操作 - 分析师和高管。分析师生成和分析业务报表,高管查询报表。
LOB A 独立管理数据库 DB_A
,LOB B 管理数据库 DB_B
。LOB A 和 LOB B 在 DB_C
中使用不同的表。DB_PUBLIC
可以被两个 LOB 的所有成员访问。
由于不同的成员在不同的数据库和表上执行不同的操作,我们建议您根据其服务和职位创建角色,仅为每个角色应用必要的权限,并将这些角色分配给相应的成员。如下所示:
-
将系统定义的角色
db_admin
、user_admin
和cluster_admin
分配给集群维护人员,将db_admin
和user_admin
设置为他们日常维护的默认角色,并在需要操作集群节点时手动激活角色cluster_admin
。示例:
GRANT db_admin, user_admin, cluster_admin TO USER user_platform;
ALTER USER user_platform DEFAULT ROLE db_admin, user_admin; -
为每个 LOB 的成员创建用户,并为每个用户设置复杂的密码。
-
为每个 LOB 的职位创建角色,并为每个角色应用相应的权限。
对于每个 LOB 的主管,授予其角色 LOB 所需权限的最大集合,以及相应的 GRANT 权限(通过在语句中指定 WITH GRANT OPTION)。因此,他们可以将这些权限分配给其 LOB 的成员。如果他们的日常工作需要,将角色设置为其默认角色。
示例:
GRANT SELECT, ALTER, INSERT, UPDATE, DELETE ON ALL TABLES IN DATABASE DB_A TO ROLE linea_admin WITH GRANT OPTION;
GRANT SELECT, ALTER, INSERT, UPDATE, DELETE ON TABLE TABLE_C1, TABLE_C2, TABLE_C3 TO ROLE linea_admin WITH GRANT OPTION;
GRANT linea_admin TO USER user_linea_admin;
ALTER USER user_linea_admin DEFAULT ROLE linea_admin;对于分析师和高管,分配给他们具有相应权限的角色。
示例:
GRANT SELECT ON ALL TABLES IN DATABASE DB_A TO ROLE linea_query;
GRANT SELECT ON TABLE TABLE_C1, TABLE_C2, TABLE_C3 TO ROLE linea_query;
GRANT linea_query TO USER user_linea_salesa;
GRANT linea_query TO USER user_linea_salesb;
ALTER USER user_linea_salesa DEFAULT ROLE linea_query;
ALTER USER user_linea_salesb DEFAULT ROLE linea_query; -
对于可以被所有集群用户访问的数据库
DB_PUBLIC
,将DB_PUBLIC
上的 SELECT 权限授予系统定义的角色public
。示例:
GRANT SELECT ON ALL TABLES IN DATABASE DB_PUBLIC TO ROLE public;
您可以将角色分配给其他角色以在复杂场景中实现角色继承。
例如,如果分析师需要在 DB_PUBLIC
中写入和查询表的权限,而高管只能查询这些表,您可以创建角色 public_analysis
和 public_sales
,为角色应用相关权限,并将它们分配给分析师和高管的原始角色。
示例:
CREATE ROLE public_analysis;
CREATE ROLE public_sales;
GRANT SELECT, ALTER, INSERT, UPDATE, DELETE ON ALL TABLES IN DATABASE DB_PUBLIC TO ROLE public_analysis;
GRANT SELECT ON ALL TABLES IN DATABASE DB_PUBLIC TO ROLE public_sales;
GRANT public_analysis TO ROLE linea_analysis;
GRANT public_analysis TO ROLE lineb_analysis;
GRANT public_sales TO ROLE linea_query;
GRANT public_sales TO ROLE lineb_query;
根据场景自定义角色
建议您通过自定义角色管理权限和用户。以下梳理了一些常见场景所需的权限项。
-
StarRocks 内表全局查询权限
-- 创建自定义角色。
CREATE ROLE read_only;
-- 赋予角色所有 Catalog 的使用权限。
GRANT USAGE ON ALL CATALOGS TO ROLE read_only;
-- 赋予角色所有表的查询权限。
GRANT SELECT ON ALL TABLES IN ALL DATABASES TO ROLE read_only;
-- 赋予角色所有视图的查询权限。
GRANT SELECT ON ALL VIEWS IN ALL DATABASES TO ROLE read_only;
-- 赋予角色所有物化视图的查询和加速权限。
GRANT SELECT ON ALL MATERIALIZED VIEWS IN ALL DATABASES TO ROLE read_only;您还可以进一步授予角色在查询中使用 UDF 的权限:
-- 赋予角色所有库级别 UDF 的使用权限。
GRANT USAGE ON ALL FUNCTIONS IN ALL DATABASES TO ROLE read_only;
-- 赋予角色所有全局 UDF 的使用权限。
GRANT USAGE ON ALL GLOBAL FUNCTIONS TO ROLE read_only; -
StarRocks 内表全局写权限
-- 创建自定义角色。
CREATE ROLE write_only;
-- 赋予角色所有 Catalog 的使用权限。
GRANT USAGE ON ALL CATALOGS TO ROLE write_only;
-- 赋予角色所有表的导入、更新权限。
GRANT INSERT, UPDATE ON ALL TABLES IN ALL DATABASES TO ROLE write_only;
-- 赋予角色所有物化视图的更新权限。
GRANT REFRESH ON ALL MATERIALIZED VIEWS IN ALL DATABASES TO ROLE write_only; -
指定外部数据目录(External Catalog)下的查询权限
-- 创建自定义角色。
CREATE ROLE read_catalog_only;
-- 赋予角色目标 Catalog 的 USAGE 权限。
GRANT USAGE ON CATALOG hive_catalog TO ROLE read_catalog_only;
-- 切换到对应数据目录。
SET CATALOG hive_catalog;
-- 赋予角色该 Catalog 下所有表和视图的查询权限。
GRANT SELECT ON ALL TABLES IN ALL DATABASES TO ROLE read_catalog_only;提示对于外部数据目录下的视图,当前仅支持查询 Hive 表的视图 (自 3.1 版本起)。
-
指定外部数据目录(External Catalog)下的写权限
当前仅支持写入数据到 Iceberg 表 (自 3.1 版本起) 和 Hive 表(自 3.2 版本起)。
-- 创建自定义角色。
CREATE ROLE write_catalog_only;
-- 赋予角色目标 Catalog 的 USAGE 权限。
GRANT USAGE ON CATALOG iceberg_catalog TO ROLE read_catalog_only;
-- 切换到对应数据目录。
SET CATALOG iceberg_catalog;
-- 赋予角色所有 Iceberg 表的写入权限。
GRANT INSERT ON ALL TABLES IN ALL DATABASES TO ROLE write_catalog_only; -
指定数据库的管理员权限
-- 创建自定义角色。
CREATE ROLE db1_admin;
-- 赋予角色 db1 的全部权限。用户可以在 db1 内创建表、视图、物化视图、用户自定义函数,并删除、更改 db1。
GRANT ALL ON DATABASE db1 TO ROLE db1_admin;
-- 赋予角色 db1 下所有表、视图、物化视图、用户自定义函数的所有权限。
GRANT ALL ON ALL TABLES IN DATABASE db1 TO ROLE db1_admin;
GRANT ALL ON ALL VIEWS IN DATABASE db1 TO ROLE db1_admin;
GRANT ALL ON ALL MATERIALIZED VIEWS IN DATABASE db1 TO ROLE db1_admin;
GRANT ALL ON ALL FUNCTIONS IN DATABASE db1 TO ROLE db1_admin; -
全局、数据库级、表级以及分区级备份恢复权限
-
全局备份恢复权限
全局备份恢复权限可以对任意库、表、分区进行备份恢复。需要 SYSTEM 级的 REPOSITORY 权限,在 Default Catalog 下创建数据库的权限,在任意数据库下创建表的权限,以及对任意表进行导入、导出的权限。
-- 创建自定义角色。
CREATE ROLE recover;
-- 赋予角色 SYSTEM 级的 REPOSITORY 权限。
GRANT REPOSITORY ON SYSTEM TO ROLE recover;
-- 赋予角色创建数据库的权限。
GRANT CREATE DATABASE ON CATALOG default_catalog TO ROLE recover;
-- 赋予角色创建任意表的权限。
GRANT CREATE TABLE ON ALL DATABASES TO ROLE recover;
-- 赋予角色向任意表导入、导出数据的权限。
GRANT INSERT, EXPORT ON ALL TABLES IN ALL DATABASES TO ROLE recover; -
数据库级备份恢复权限
数据库级备份恢复权限可以对整个数据库进行备份恢复,需要 SYSTEM 级的 REPOSITORY 权限,在 Default Catalog 下创建数据库的权限,在任意数据库下创建表的权限,以及待备份数据库下所有表的导出权限。
-- 创建自定义角色。
CREATE ROLE recover_db;
-- 赋予角色 SYSTEM 级的 REPOSITORY 权限。
GRANT REPOSITORY ON SYSTEM TO ROLE recover_db;
-- 赋予角色创建数据库的权限。
GRANT CREATE DATABASE ON CATALOG default_catalog TO ROLE recover_db;
-- 赋予角色创建任意表的权限。
GRANT CREATE TABLE ON ALL DATABASES TO ROLE recover_db;
-- 赋予角色向任意表导入数据的权限。
GRANT INSERT ON ALL TABLES IN ALL DATABASES TO ROLE recover_db;
-- 赋予角色向待备份数据库下所有表的导出权限。
GRANT EXPORT ON ALL TABLES IN DATABASE <db_name> TO ROLE recover_db; -
表级备份恢复权限
表级备份恢复权限需要 SYSTEM 级的 REPOSITORY 权限,在待备份数据库下创建表及导入数据的权限,以及待备份表的导出权限。
-- 创建自定义角色。
CREATE ROLE recover_tbl;
-- 赋予角色 SYSTEM 级的 REPOSITORY 权限。
GRANT REPOSITORY ON SYSTEM TO ROLE recover_tbl;
-- 赋予角色在对应数据库下创建表的权限。
GRANT CREATE TABLE ON DATABASE <db_name> TO ROLE recover_tbl;
-- 赋予角色向任意表导入数据的权限。
GRANT INSERT ON ALL TABLES IN DATABASE <db_name> TO ROLE recover_db;
-- 赋予角色导出待备份表数据的权限。
GRANT EXPORT ON TABLE <table_name> TO ROLE recover_tbl; -
分区级备份恢复权限
分区级备份恢复权限需要 SYSTEM 级的 REPOSITORY 权限,以及对待备份表的导入、导出权限。
-- 创建自定义角色。
CREATE ROLE recover_par;
-- 赋予角色 SYSTEM 级的 REPOSITORY 权限。
GRANT REPOSITORY ON SYSTEM TO ROLE recover_par;
-- 赋予角色对对应表进行导入的权限。
GRANT INSERT, EXPORT ON TABLE <table_name> TO ROLE recover_par;
-