Cassandra 文档

版本

您正在查看预发布版本的文档。

数据库角色

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 子句可用于明确性,但没有功能上的区别。

限制来自特定 CIDR 组的连接

如果已配置 cidr_authorizer,则可以使用 ACCESS FROM CIDRS 子句后跟用户可以从其访问的 CIDR 组的集合字面量,将角色限制为仅从特定区域(即 CIDR 组)登录。不指定 CIDR 组隐式授予从所有 CIDR 组访问的权限。ACCESS FROM ALL CIDRS 子句可用于明确性,但没有功能上的区别。此子句也可用于删除任何 CIDR 组限制。应使用 ACCESS FROM CIDRS 子句使用有效的 CIDR 组。nodetool list-cidrgroups 命令可用于查看集群中可用的 CIDR 组。

有条件地创建角色

尝试创建现有角色会导致无效的查询条件,除非使用 IF NOT EXISTS 选项。如果使用该选项并且角色存在,则该语句将是无操作的

CREATE ROLE other_role;
CREATE ROLE IF NOT EXISTS other_role;

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 子句。

限制来自特定 CIDR 组的连接

如果已配置 cidr_authorizer,则可以使用 ACCESS FROM CIDRS 子句后跟用户可以从其访问的 CIDR 组的集合字面量,将角色限制为仅从特定区域(即 CIDR 组)登录。不指定 CIDR 组隐式授予从所有 CIDR 组访问的权限。ACCESS FROM ALL CIDRS 子句可用于明确性,但没有功能上的区别。此子句也可用于删除任何 CIDR 组限制。应使用 ACCESS FROM CIDRS 子句使用有效的 CIDR 组。nodetool list-cidrgroups 命令可用于查看集群中可用的 CIDR 组。

执行 ALTER ROLE 语句的条件

  • 客户端必须具有 SUPERUSER 状态才能更改另一个角色的 SUPERUSER 状态

  • 客户端不能更改其当前持有的任何角色的 SUPERUSER 状态

  • 客户端只能修改其在登录时识别的角色的某些属性(例如 PASSWORD

  • 要修改角色的属性,客户端必须被授予对该角色的 ALTER permission <cql-permissions>

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 选项。如果使用该选项并且角色不存在,则该语句将是无操作的。

DROP ROLE 故意不终止任何打开的用户会话。当前连接的会话将保持连接,并将保留执行任何不需要授权的数据库操作的能力。但是,如果启用了授权,则删除的角色的权限也会被撤销,这取决于在cassandra-yaml 文件中配置的缓存选项。如果随后重新创建了已删除的角色并向其授予了新的权限角色`,则任何仍然连接的客户端会话都将获取新授予的权限和角色。

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;

DROP USER

删除用户使用 DROP USER 语句

drop_user_statement ::= DROP USER [ IF EXISTS ] role_name

LIST USERS

可以使用 LIST USERS 语句列出现有用户

list_users_statement::= LIST USERS

请注意,此语句等效于LIST ROLES,但输出中只包含具有 `LOGIN 权限的角色。

数据控制

权限

对资源的权限授予角色;Cassandra 中有几种不同的资源类型,每种类型都按层次结构建模

  • 数据资源、Keyspaces 和表的层次结构具有结构 ALL KEYSPACESKEYSPACETABLE

  • 函数资源的结构为 ALL FUNCTIONSKEYSPACEFUNCTION

  • 表示角色的资源的结构为 ALL ROLESROLE

  • 表示 JMX ObjectNames 的资源,映射到 MBean/MXBean 集,其结构为 ALL MBEANSMBEAN

可以在这些层次结构的任何级别授予权限,并且权限向下流动。因此,在链条上更高位置的资源上授予权限会自动在所有更低位置的资源上授予相同的权限。例如,在 KEYSPACE 上授予 SELECT 权限会自动在该 KEYSPACE 中的所有 TABLES 上授予该权限。同样,在 ALL FUNCTIONS 上授予权限会将其授予每个定义的函数,无论其作用域在哪个 keyspace 中。也可以在作用域为特定 keyspace 的所有函数上授予权限。

对权限的修改对现有客户端会话可见;也就是说,在权限更改后无需重新建立连接。

可用的完整权限集为

  • CREATE

  • ALTER

  • DROP

  • SELECT

  • MODIFY

  • AUTHORIZE

  • DESCRIBE

  • EXECUTE

  • UNMASK

  • SELECT_MASKED

并非所有权限都适用于每种类型的资源。例如,EXECUTE 仅在函数或 mbean 的上下文中相关;在表示表的资源上授予 EXECUTE 权限毫无意义。尝试在无法应用权限的资源上 GRANT 权限会导致错误响应。以下说明了哪些权限可以在哪些类型的资源上授予,以及哪些语句由该权限启用。

权限 资源 操作

CREATE

ALL KEYSPACES

CREATE KEYSPACECREATE TABLE 在任何 keyspace 中

CREATE

KEYSPACE

CREATE TABLE 在指定的 keyspace 中

CREATE

ALL FUNCTIONS

CREATE FUNCTION 在任何 keyspace 中,以及 CREATE AGGREGATE 在任何 keyspace 中

CREATE

ALL FUNCTIONS IN KEYSPACE

CREATE FUNCTIONCREATE AGGREGATE 在指定的 keyspace 中

CREATE

ALL ROLES

CREATE ROLE

ALTER

ALL KEYSPACES

ALTER KEYSPACEALTER TABLE 在任何 keyspace 中

ALTER

KEYSPACE

ALTER KEYSPACEALTER TABLE 在指定的 keyspace 中

ALTER

TABLE

ALTER TABLE

ALTER

ALL FUNCTIONS

CREATE FUNCTIONCREATE AGGREGATE:替换任何现有的

ALTER

ALL FUNCTIONS IN KEYSPACE

CREATE FUNCTIONCREATE AGGREGATE:替换指定的 keyspace 中的现有

ALTER

FUNCTION

CREATE FUNCTIONCREATE AGGREGATE:替换现有的

ALTER

ALL ROLES

ALTER ROLE 对任何角色

ALTER

ROLE

ALTER ROLE

DROP

ALL KEYSPACES

DROP KEYSPACEDROP TABLE 在任何 keyspace 中

DROP

KEYSPACE

DROP TABLE 在指定的 keyspace 中

DROP

TABLE

DROP TABLE

DROP

ALL FUNCTIONS

DROP FUNCTIONDROP AGGREGATE 在任何 keyspace 中

DROP

ALL FUNCTIONS IN KEYSPACE

DROP FUNCTIONDROP AGGREGATE 在指定的 keyspace 中

DROP

FUNCTION

DROP FUNCTION

DROP

ALL ROLES

DROP ROLE 对任何角色

DROP

ROLE

DROP ROLE

SELECT

ALL KEYSPACES

SELECT 对任何表

SELECT

KEYSPACE

SELECT 对指定的 keyspace 中的任何表

SELECT

TABLE

SELECT 对指定的表

SELECT

ALL MBEANS

调用任何 mbean 上的 getter 方法

SELECT

MBEANS

调用与通配符模式匹配的任何 mbean 上的 getter 方法

SELECT

MBEAN

调用命名 mbean 上的 getter 方法

MODIFY

ALL KEYSPACES

INSERTUPDATEDELETETRUNCATE 对任何表

MODIFY

KEYSPACE

INSERTUPDATEDELETETRUNCATE 对指定的 keyspace 中的任何表

MODIFY

TABLE

INSERTUPDATEDELETETRUNCATE 对指定的表

MODIFY

ALL MBEANS

调用任何 mbean 上的 setter 方法

MODIFY

MBEANS

调用与通配符模式匹配的任何 mbean 上的 setter 方法

MODIFY

MBEAN

调用命名 mbean 上的 setter 方法

AUTHORIZE

ALL KEYSPACES

GRANT PERMISSIONREVOKE PERMISSION 对任何表

AUTHORIZE

KEYSPACE

GRANT PERMISSIONREVOKE PERMISSION 对指定的 keyspace 中的任何表

AUTHORIZE

TABLE

GRANT PERMISSIONREVOKE PERMISSION 对指定的表

AUTHORIZE

ALL FUNCTIONS

GRANT PERMISSIONREVOKE PERMISSION 对任何函数

AUTHORIZE

ALL FUNCTIONS IN KEYSPACE

GRANT PERMISSIONREVOKE PERMISSION 在指定的 keyspace 中

AUTHORIZE

FUNCTION

GRANT PERMISSIONREVOKE PERMISSION 对指定的函数

AUTHORIZE

ALL MBEANS

GRANT PERMISSIONREVOKE PERMISSION 对任何 mbean

AUTHORIZE

MBEANS

GRANT PERMISSIONREVOKE PERMISSION 对与通配符模式匹配的任何 mbean

AUTHORIZE

MBEAN

GRANT PERMISSIONREVOKE PERMISSION 对命名 mbean

AUTHORIZE

ALL ROLES

GRANT ROLEREVOKE ROLE 对任何角色

AUTHORIZE

ROLES

GRANT ROLEREVOKE ROLE 对指定的 roles

DESCRIBE

ALL ROLES

LIST ROLES 对所有角色,或仅对授予另一个指定角色的角色

DESCRIBE

ALL MBEANS

从平台的 MBeanServer 检索有关任何 mbean 的元数据

DESCRIBE

MBEANS

从平台的 MBeanServer 检索有关与通配符模式匹配的任何 mbean 的元数据

DESCRIBE

MBEAN

从平台的 MBeanServer 检索有关命名 mbean 的元数据

EXECUTE

ALL FUNCTIONS

SELECTINSERTUPDATE 使用任何函数,以及在 CREATE AGGREGATE 中使用任何函数

EXECUTE

ALL FUNCTIONS IN KEYSPACE

SELECTINSERTUPDATE 使用指定的 keyspace 中的任何函数,以及在 CREATE AGGREGATE 中使用 keyspace 中的任何函数

EXECUTE

FUNCTION

SELECTINSERTUPDATE 使用指定的函数,以及在 CREATE AGGREGATE 中使用该函数

EXECUTE

ALL MBEANS

对任何 mbean 执行操作

EXECUTE

MBEANS

对与通配符模式匹配的任何 mbean 执行操作

EXECUTE

MBEAN

对命名 mbean 执行操作

UNMASK

ALL KEYSPACES

查看任何表上屏蔽列的明文内容

UNMASK

KEYSPACE

查看 keyspace 中任何表上屏蔽列的明文内容

UNMASK

TABLE

查看指定表上屏蔽列的明文内容

SELECT_MASKED

ALL KEYSPACES

SELECT 限制任何表上的屏蔽列

SELECT_MASKED

KEYSPACE

SELECT 限制指定的 keyspace 中任何表上的屏蔽列

SELECT_MASKED

TABLE

SELECT 限制指定表上的屏蔽列

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 中对所有表执行 UPDATEINSERTUPDATEDELETETRUNCATE 查询的权限

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 ) 函数的 SELECTINSERTUPDATE 查询的权限

GRANT DESCRIBE ON ALL ROLES TO role_admin;

这授予具有 role_admin 角色的任何用户使用 LIST ROLES 语句查看系统中任何和所有角色的权限。

GRANT ALL

当使用 GRANT ALL 形式时,将根据目标资源自动确定适当的权限集。

自动授予

当通过 CREATE KEYSPACECREATE TABLECREATE FUNCTIONCREATE AGGREGATECREATE ROLE 语句创建资源时,创建者(数据库用户发出该语句时所标识的角色)会自动获得对新资源的所有适用权限。

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;

显示授予 bobkeyspace1.table1 上的所有权限,包括从任何其他角色继承的权限。这也包括可以应用于 keyspace1.table1 的资源层次结构中更高位置的任何权限。例如,如果 bobkeyspace1 具有 ALTER 权限,则该权限将包含在此查询的结果中。添加 NORECURSIVE 开关会将结果限制为仅直接授予 bobbob 的某个角色的权限

LIST SELECT PERMISSIONS OF carlos;

显示授予 carloscarlos 的任何角色的任何权限,限制为对任何资源的 SELECT 权限。