租户和权限
以下所有操作都在CnosDB用户界面中进行。
租户与用户
CnosDB 提供了租户系统和用户系统。
只有拥有系统权限的用户才能添加用户和租户。
只有担任租户下owner角色的用户或拥有系统权限的用户才能添加租户下的角色,并赋予用户角色。
CnosDB实例启动的时候,会默认创建一个租户
cnosdb
和一个用户root
。
租户
查看租户
示例
SELECT *
FROM cluster_schema.tenants;
+-------------+-----------------------------------------------------------------------------------------+
| tenant_name | tenant_options |
+-------------+-----------------------------------------------------------------------------------------+
| cnosdb | {"comment":"system tenant","limiter_config":null,"after":null,"tenant_is_hidden":false} |
+-------------+-----------------------------------------------------------------------------------------+
创建租户
语法
CREATE TENANT [IF NOT EXISTS] tenant_name
[WITH [comment = <comment>],
[drop_after = duration],
[_limiter = <limiter_config>]];
drop_after:表示租户延迟删除时间,默认立即删除,用带单位的数据表示,支持天(d),小时(h),分钟(m),如10d,50h,100m,当不带单位时,默认为天,如30。
_limiter: 限制租户资源用量,可以参见租户资源
示例
CREATE
TENANT test;
SELECT *
FROM cluster_schema.tenants;
+-------------+-----------------------------------------------------------------------------------------+
| tenant_name | tenant_options |
+-------------+-----------------------------------------------------------------------------------------+
| test | {"comment":null,"limiter_config":null,"after":null,"tenant_is_hidden":false} |
| cnosdb | {"comment":"system tenant","limiter_config":null,"after":null,"tenant_is_hidden":false} |
+-------------+-----------------------------------------------------------------------------------------+
修改租户
语法
ALTER TENANT tenant_name {SET sql_option | UNSET option_name };
sql_option: option_name = value
option: {COMMENT/DROP_AFTER/_LIMITER}
SET 用来设置租户属性,属性只能为对应属性类型的常量
UNSET 删除租户属性
目前租户属性支持:COMMENT,对应属性类型为STRING类型,用单引号括起来;DROP_AFTER,对应属性类型为STRING类型,用单引号括起来; _LIMITER,对应属性类型为STRING类型, 用单引号括起来,内容详见租户资源限制。
示例
ALTER TENANT test SET COMMENT = 'abc';
删除租户
语法
DROP TENANT tenant_name [AFTER '7d'];
当不带AFTER时,会立即删除;
当带AFTER时,为延迟删除,会在指定时间后删除,时间支持天(d),小时(h),分钟(m),如10d,50h,100m,当不带单位时,默认为天。延迟删除期间租户不可见且不可用。 AFTER优先级高于option里的DROP_AFTER。
语法
RECOVER TENANT tenant_name;
延迟删除取消,租户恢复正常状态。
注意:只有对延迟删除的资源,且在延迟删除期间,执行RECOVER语句才有作用。
示例
DROP TENANT test AFTER ‘7d’;
RECOVER TENANT test;
DROP TENANT test;
用户
查看用户
SELECT *
FROM cluster_schema.users;
+-----------+----------+-------------------------------------------------------------------------------------------------+
| user_name | is_admin | user_options |
+-----------+----------+-------------------------------------------------------------------------------------------------+
| root | true | {"password":"*****","must_change_password":true,"rsa_public_key":null,"comment":"system admin"} |
+-----------+----------+-------------------------------------------------------------------------------------------------+
创建用户
语法
USER [IF NOT EXISTS] user_name [WITH [PASSWORD='',] [MUST_CHANGE_PASSWORD=true,] [GRANTED_ADMIN=true,] [COMMENT = '']];
示例
CREATE
USER IF NOT EXISTS tester WITH PASSWORD='xxx', MUST_CHANGE_PASSWORD=true, COMMENT = 'test';
修改用户
修改用户参数
语法
ALTER USER user_name {SET sql_option};
sql_option: option_name = option_value
option_name: {COMMENT | MUST_CHANGE_PASSWORD | PASSWORD}
option_value 只能是常量
COMMENT 的 option_value 类型为字符串 MUST_CHANGE_PASSWORD 的 option_value 类型为布尔 PASSWORD 的 option_value 类型为字符串
示例
ALTER USER tester SET PASSWORD = 'aaa';
ALTER USER tester SET MUST_CHANGE_PASSWORD = false;
ALTER USER tester SET COMMENT = 'bbb';
删除用户
语法
DROP USER [IF EXISTS] user_name;
示例
DROP USER IF EXISTS tester;
Admin权限
- admin 权限分为两种
- 初始的 admin 权限
- 被授予的 admin 权限
- 支持拥有 admin 权限的人将 admin 权限授予其他人
- 系统表 cluster_schema.users 中 is_admin 字段标记是否拥有 admin 权限(包括初始的和被授予的)
- 系统表 cluster_schema.users 中的 user_options 的 granted_admin 为 true,表示被授予的 admin 权限
- 拥有 admin 权限的人可以回收其他人被赋予的 admin 权限
- 初始的 admin 权限不支持被回收(即 root 用户拥有的 admin 权限)
授予 admin 权限
语法
alter user <user_name> set granted_admin = true
示例
create user dev;
alter user dev set granted_admin = true;
撤销 admin 权限
语法
alter user <user_name> set granted_admin = false
示例
alter user dev set granted_admin = false;
查看 admin 权限
示例
select * from cluster_schema.users where user_name = 'dev';
+-----------+----------+------------------------------------------------------------------------+
| user_name | is_admin | user_options |
+-----------+----------+------------------------------------------------------------------------+
| dev | true | {"password":"*****","must_change_password":false,"granted_admin":true} |
+-----------+----------+------------------------------------------------------------------------+
租户角色
租户下的角色分为系统角色和用户自定义角色。
系统角色:
- Owner: 对租户有顶级权限,支持租户下的所有操作。
- Member: 租户成员,可以浏览租户下的各种对象。
用户自定义角色:
- 自定义角色需要继承系统角色。
- 可以对自定义角色赋予多种权限。
查看角色
查看当前租户下的角色。
示例
\c
information_schema
SELECT *
FROM roles;
+------------+-----------+--------------+
| role_name | role_type | inherit_role |
+------------+-----------+--------------+
| owner | system | |
| member | system | |
+------------+-----------+--------------+
创建角色
只有DBA和tenant的owner角色可以创建角色,角色是属于tenant的。
语法
CREATE ROLE [IF NOT EXISTS] role_name INHERIT {owner | member};
示例 在当前租户下创建继承owner角色的owner_role角色。
CREATE ROLE owner_role INHERIT owner;
在当前租户下创建继承member角色的member_role角色。
CREATE ROLE member_role INHERIT member;
删除角色
语法
DROP ROLE role_name;
示例
DROP ROLE owner_role;
注意: 租户成员和其角色之间的关系是通过名称进行维护。
当删除角色时,对应角色的租户成员的权限会被同时撤销。 然而,租户成员和其角色之间的绑定关系不会同步删除(即仅角色会失效)。
权限
可以使用GRANT ...
为租户下的角色赋予权限,使用REVOKE ...
收回权限。
数据库的操作权限
目前权限的最小粒度是数据库。
权限名称 | 权限内容 |
---|---|
read | 对数据库读的权限 |
write | 对数据库读写的权限 |
all | 对数据库增删改查的权限 |
赋予权限
语法
GRANT
{READ | WRITE | ALL} ON DATABASE database_name TO ROLE role_name;
示例
-- 创建一个角色rrr
CREATE ROLE rrr INHERIT member;
-- 授予角色rrr读取数据库air的权限
GRANT
READ
ON DATABASE air TO ROLE rrr;
-- 授予角色rrr读写数据库wind的权限
GRANT WRITE
ON DATABASE wind TO ROLE rrr;
-- 授予角色rrr关于数据库sea的所有权限
GRANT ALL
ON DATABASE sea TO ROLE rrr;
查看权限
示例
\c
information_schema
SELECT *
FROM DATABASE_PRIVILEGES;
+-------------+---------------+----------------+-----------+
| tenant_name | database_name | privilege_type | role_name |
+-------------+---------------+----------------+-----------+
| cnosdb | air | Read | rrr |
| cnosdb | sea | All | rrr |
| cnosdb | wind | Write | rrr |
+-------------+---------------+----------------+-----------+
注意
授予一个角色关于同一个数据库的权限,会覆盖之前的权限。
收回权限
语法
REVOKE {WRITE | READ | FULL} ON DATABASE database_name FROM role_name;
示例
-- 收回角色读取数据库air的权限
REVOKE READ ON DATABASE air FROM rrr;
修改权限
让用户担任某个租户下的角色
语法
ALTER
TENANT tenant_name ADD USER user_name AS role_name;
示例
CREATE
USER user_a;
ALTER
TENANT cnosdb ADD USER user_a AS rrr;
让用户不在担任租户下的角色
仅仅是用户不再担任租户的角色,角色不会被删除。
语法
ALTER
TENANT tenant_name REMOVE USER user_name;
ALTER
TENANT cnosdb REMOVE USER user_a;