数据库角色
CQL 使用数据库角色来表示用户和用户组。从语法上讲,角色由
role_name ::= identifier | string
CREATE ROLE
创建角色使用 CREATE ROLE
语句
create_role_statement ::= CREATE ROLE [ IF NOT EXISTS ] role_name
[ WITH role_options# ]
role_options ::= role_option ( AND role_option)*
role_option ::= PASSWORD '=' string
| HASHED PASSWORD '=' string
| LOGIN '=' boolean
| SUPERUSER '=' boolean
| OPTIONS '=' map_literal
| ACCESS TO DATACENTERS set_literal
| ACCESS TO ALL DATACENTERS
| ACCESS FROM CIDRS set_literal
| ACCESS FROM ALL CIDRS
例如
CREATE ROLE new_role;
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true;
CREATE ROLE alice WITH HASHED PASSWORD = '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG' AND LOGIN = true;
CREATE ROLE bob WITH PASSWORD = 'password_b' AND LOGIN = true AND SUPERUSER = true;
CREATE ROLE carlos WITH OPTIONS = { 'custom_option1' : 'option1_value', 'custom_option2' : 99 };
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true AND ACCESS TO DATACENTERS {'DC1', 'DC3'};
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true AND ACCESS TO ALL DATACENTERS;
CREATE ROLE bob WITH LOGIN = true and PASSWORD = 'password_d' AND ACCESS FROM CIDRS { 'region1', 'region2' };
CREATE ROLE hob WITH LOGIN = true and PASSWORD = 'password_c' AND ACCESS FROM ALL CIDRS;
默认情况下,角色不具有 LOGIN
权限或 SUPERUSER
状态。
权限授予数据库资源的角色;资源类型包括 keyspaces、表、函数和角色本身。角色可以授予其他角色以创建分层权限结构;在这些层次结构中,权限和 SUPERUSER
状态被继承,但 LOGIN
权限不被继承。
如果角色具有 LOGIN
权限,则客户端可以在连接时识别为该角色。在该连接的持续时间内,客户端将获取授予该角色的任何角色和权限。
只有对数据库角色资源具有 CREATE
权限的客户端才能发出 CREATE ROLE
请求(请参阅相关部分),除非客户端是 SUPERUSER
。Cassandra 中的角色管理是可插拔的,自定义实现可能只支持列出选项的子集。
如果角色名称包含非字母数字字符,则应将其引起来。
设置内部身份验证的凭据
使用 WITH PASSWORD
子句为内部身份验证设置密码,将密码括在单引号中。
如果未设置内部身份验证或角色没有 LOGIN
权限,则 WITH PASSWORD
子句不是必需的。
使用 WITH HASHED PASSWORD
直接提供 jBcrypt 哈希密码。请参阅 hash_password
工具。
将连接限制到特定数据中心
如果已配置 network_authorizer
,则可以使用 ACCESS TO DATACENTERS
子句后跟用户可以访问的数据中心的集合字面量,将登录角色限制到特定数据中心。不指定数据中心隐式授予访问所有数据中心的权限。ACCESS TO ALL DATACENTERS
子句可用于明确性,但没有功能上的区别。
ALTER ROLE
更改角色选项使用 ALTER ROLE
语句
alter_role_statement ::= ALTER ROLE [ IF EXISTS ] role_name WITH role_options
例如
ALTER ROLE bob WITH PASSWORD = 'PASSWORD_B' AND SUPERUSER = false;
ALTER ROLE bob WITH HASHED PASSWORD = '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG' AND SUPERUSER = false;
ALTER ROLE rob WITH LOGIN = true and PASSWORD = 'password_c' AND ACCESS FROM ALL CIDRS;
ALTER ROLE hob WITH LOGIN = true and PASSWORD = 'password_d' AND ACCESS FROM CIDRS { 'region1' };
如果角色不存在,则该语句将返回错误,除非使用 IF EXISTS
,在这种情况下,操作将是无操作的。
使用 WITH HASHED PASSWORD
直接提供 jBcrypt 哈希密码。请参阅 hash_password
工具。
将连接限制到特定数据中心
如果已配置 network_authorizer
,则可以使用 ACCESS TO DATACENTERS
子句后跟用户可以访问的数据中心的集合字面量,将登录角色限制到特定数据中心。要删除任何数据中心限制,请使用 ACCESS TO ALL DATACENTERS
子句。
DROP ROLE
删除角色使用 DROP ROLE
语句
drop_role_statement ::= DROP ROLE [ IF EXISTS ] role_name
DROP ROLE
要求客户端对相关角色具有 DROP
permission <cql-permissions>
。此外,客户端不能 DROP
其在登录时识别的角色。最后,只有具有 SUPERUSER
状态的客户端才能 DROP
另一个 SUPERUSER
角色。
尝试删除不存在的角色会导致无效的查询条件,除非使用 IF EXISTS
选项。如果使用该选项并且角色不存在,则该语句将是无操作的。
GRANT ROLE
将角色授予另一个角色使用 GRANT ROLE
语句
grant_role_statement ::= GRANT role_name TO role_name
例如
GRANT report_writer TO alice;
此语句将 report_writer
角色授予 alice
。授予 report_writer
的任何权限也会被 alice
获取。
角色被建模为有向无环图,因此不允许循环授予。以下示例会导致错误条件
GRANT role_a TO role_b;
GRANT role_b TO role_a;
GRANT role_a TO role_b;
GRANT role_b TO role_c;
GRANT role_c TO role_a;
REVOKE ROLE
撤销角色使用 REVOKE ROLE
语句
revoke_role_statement ::= REVOKE role_name FROM role_name
例如
REVOKE report_writer FROM alice;
此语句从 alice
撤销 report_writer
角色。alice
通过 report_writer
角色获取的任何权限也会被撤销。
LIST ROLES
可以使用 LIST ROLES
语句列出所有已知角色(系统中的角色或授予特定角色的角色)
list_roles_statement ::= LIST ROLES [ OF role_name] [ NORECURSIVE ]
例如
LIST ROLES;
返回系统中所有已知角色,这需要对数据库角色资源具有 DESCRIBE
权限。
此示例枚举授予 alice
的所有角色,包括那些通过传递获取的角色
LIST ROLES OF alice;
此示例列出直接授予 bob
的所有角色,不包括任何通过传递获取的角色
LIST ROLES OF bob NORECURSIVE;
用户
在 Cassandra 2.2 中引入角色之前,身份验证和授权基于 USER
的概念。为了向后兼容,已保留旧语法,以 USER
为中心的语句成为基于 ROLE
的等效语句的同义词。换句话说,创建/更新用户只是创建/更新角色的不同语法。
CREATE USER
创建用户使用 CREATE USER
语句
create_user_statement ::= CREATE USER [ IF NOT EXISTS ] role_name
[ WITH [ HASHED ] PASSWORD string ]
[ user_option ]
user_option: SUPERUSER | NOSUPERUSER
例如
CREATE USER alice WITH PASSWORD 'password_a' SUPERUSER;
CREATE USER bob WITH PASSWORD 'password_b' NOSUPERUSER;
CREATE USER bob WITH HASHED PASSWORD '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG' NOSUPERUSER;
CREATE USER
命令等效于 CREATE ROLE
,其中 LOGIN
选项为 true
。因此,以下语句对是等效的
CREATE USER alice WITH PASSWORD 'password_a' SUPERUSER;
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true AND SUPERUSER = true;
CREATE USER IF NOT EXISTS alice WITH PASSWORD 'password_a' SUPERUSER;
CREATE ROLE IF NOT EXISTS alice WITH PASSWORD = 'password_a' AND LOGIN = true AND SUPERUSER = true;
CREATE USER alice WITH PASSWORD 'password_a' NOSUPERUSER;
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true AND SUPERUSER = false;
CREATE USER alice WITH PASSWORD 'password_a' NOSUPERUSER;
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true;
CREATE USER alice WITH PASSWORD 'password_a';
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true;
CREATE ROLE rob WITH LOGIN = true and PASSWORD = 'password_c' AND ACCESS FROM ALL CIDRS;
CREATE ROLE hob WITH LOGIN = true and PASSWORD = 'password_d' AND ACCESS FROM CIDRS { 'region1' };
ALTER USER
更改用户的选项使用 ALTER USER
语句
alter_user_statement ::= ALTER USER [ IF EXISTS ] role_name [ WITH [ HASHED ] PASSWORD string] [ user_option]
如果角色不存在,则该语句将返回错误,除非使用 IF EXISTS
,在这种情况下,操作将是无操作的。例如
ALTER USER alice WITH PASSWORD 'PASSWORD_A';
ALTER USER alice WITH HASHED PASSWORD '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG';
ALTER USER bob SUPERUSER;
LIST USERS
可以使用 LIST USERS
语句列出现有用户
list_users_statement::= LIST USERS
请注意,此语句等效于LIST ROLES
,但输出中只包含具有 `LOGIN
权限的角色。
数据控制
权限
对资源的权限授予角色;Cassandra 中有几种不同的资源类型,每种类型都按层次结构建模
-
数据资源、Keyspaces 和表的层次结构具有结构
ALL KEYSPACES
→KEYSPACE
→TABLE
。 -
函数资源的结构为
ALL FUNCTIONS
→KEYSPACE
→FUNCTION
-
表示角色的资源的结构为
ALL ROLES
→ROLE
-
表示 JMX ObjectNames 的资源,映射到 MBean/MXBean 集,其结构为
ALL MBEANS
→MBEAN
可以在这些层次结构的任何级别授予权限,并且权限向下流动。因此,在链条上更高位置的资源上授予权限会自动在所有更低位置的资源上授予相同的权限。例如,在 KEYSPACE
上授予 SELECT
权限会自动在该 KEYSPACE
中的所有 TABLES
上授予该权限。同样,在 ALL FUNCTIONS
上授予权限会将其授予每个定义的函数,无论其作用域在哪个 keyspace 中。也可以在作用域为特定 keyspace 的所有函数上授予权限。
对权限的修改对现有客户端会话可见;也就是说,在权限更改后无需重新建立连接。
可用的完整权限集为
-
CREATE
-
ALTER
-
DROP
-
SELECT
-
MODIFY
-
AUTHORIZE
-
DESCRIBE
-
EXECUTE
-
UNMASK
-
SELECT_MASKED
并非所有权限都适用于每种类型的资源。例如,EXECUTE
仅在函数或 mbean 的上下文中相关;在表示表的资源上授予 EXECUTE
权限毫无意义。尝试在无法应用权限的资源上 GRANT
权限会导致错误响应。以下说明了哪些权限可以在哪些类型的资源上授予,以及哪些语句由该权限启用。
权限 | 资源 | 操作 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
调用任何 mbean 上的 getter 方法 |
|
|
调用与通配符模式匹配的任何 mbean 上的 getter 方法 |
|
|
调用命名 mbean 上的 getter 方法 |
|
|
|
|
|
|
|
|
|
|
|
调用任何 mbean 上的 setter 方法 |
|
|
调用与通配符模式匹配的任何 mbean 上的 setter 方法 |
|
|
调用命名 mbean 上的 setter 方法 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
从平台的 MBeanServer 检索有关任何 mbean 的元数据 |
|
|
从平台的 MBeanServer 检索有关与通配符模式匹配的任何 mbean 的元数据 |
|
|
从平台的 MBeanServer 检索有关命名 mbean 的元数据 |
|
|
|
|
|
|
|
|
|
|
|
对任何 mbean 执行操作 |
|
|
对与通配符模式匹配的任何 mbean 执行操作 |
|
|
对命名 mbean 执行操作 |
|
|
查看任何表上屏蔽列的明文内容 |
|
|
查看 keyspace 中任何表上屏蔽列的明文内容 |
|
|
查看指定表上屏蔽列的明文内容 |
|
|
|
|
|
|
|
|
|
GRANT PERMISSION
授予权限使用 GRANT PERMISSION
语句
grant_permission_statement ::= GRANT permissions ON resource TO role_name
permissions ::= ALL [ PERMISSIONS ] | permission [ PERMISSION ]
permission ::= CREATE | ALTER | DROP | SELECT | MODIFY | AUTHORIZE | DESCRIBE | EXECUTE | UNMASK | SELECT_MASKED
resource ::= ALL KEYSPACES
| KEYSPACE keyspace_name
| [ TABLE ] table_name
| ALL ROLES
| ROLE role_name
| ALL FUNCTIONS [ IN KEYSPACE keyspace_name ]
| FUNCTION function_name '(' [ cql_type( ',' cql_type )* ] ')'
| ALL MBEANS
| ( MBEAN | MBEANS ) string
例如
GRANT SELECT ON ALL KEYSPACES TO data_reader;
此示例授予具有 data_reader
角色的任何用户在所有 keyspace 中对任何表执行 SELECT
语句的权限
GRANT MODIFY ON KEYSPACE keyspace1 TO data_writer;
要授予具有 data_writer
角色的任何用户在 keyspace1
keyspace 中对所有表执行 UPDATE
、INSERT
、UPDATE
、DELETE
和 TRUNCATE
查询的权限
GRANT DROP ON keyspace1.table1 TO schema_owner;
要授予具有 schema_owner
角色的任何用户 DROP
特定的 keyspace1.table1
的权限
GRANT EXECUTE ON FUNCTION keyspace1.user_function( int ) TO report_writer;
此命令授予具有 report_writer
角色的任何用户执行使用 keyspace1.user_function( int )
函数的 SELECT
、INSERT
和 UPDATE
查询的权限
GRANT DESCRIBE ON ALL ROLES TO role_admin;
这授予具有 role_admin
角色的任何用户使用 LIST ROLES
语句查看系统中任何和所有角色的权限。
REVOKE PERMISSION
从角色中撤销权限使用 REVOKE PERMISSION
语句
revoke_permission_statement ::= REVOKE permissions ON resource FROM role_name
例如
REVOKE SELECT ON ALL KEYSPACES FROM data_reader;
REVOKE MODIFY ON KEYSPACE keyspace1 FROM data_writer;
REVOKE DROP ON keyspace1.table1 FROM schema_owner;
REVOKE EXECUTE ON FUNCTION keyspace1.user_function( int ) FROM report_writer;
REVOKE DESCRIBE ON ALL ROLES FROM role_admin;
由于某些表在正常驱动程序操作中的作用,因此无法撤销其 SELECT
权限。以下表将对所有授权用户可用,无论其分配的角色如何
* `system_schema.keyspaces`
* `system_schema.columns`
* `system_schema.tables`
* `system.local`
* `system.peers`
LIST PERMISSIONS
列出授予的权限使用 LIST PERMISSIONS
语句
list_permissions_statement ::= LIST permissions [ ON resource] [ OF role_name[ NORECURSIVE ] ]
例如
LIST ALL PERMISSIONS OF alice;
显示授予 alice
的所有权限,包括从任何其他角色继承的权限
LIST ALL PERMISSIONS ON keyspace1.table1 OF bob;
显示授予 bob
的 keyspace1.table1
上的所有权限,包括从任何其他角色继承的权限。这也包括可以应用于 keyspace1.table1
的资源层次结构中更高位置的任何权限。例如,如果 bob
对 keyspace1
具有 ALTER
权限,则该权限将包含在此查询的结果中。添加 NORECURSIVE
开关会将结果限制为仅直接授予 bob
或 bob
的某个角色的权限
LIST SELECT PERMISSIONS OF carlos;
显示授予 carlos
或 carlos
的任何角色的任何权限,限制为对任何资源的 SELECT
权限。