CQL(Cassandra Query Language)安全性

数据库角色(ROLE)

CQL使用数据库角色来表示用户和用户组。角色定义语法为:

role_name ::=  identifier | string

创建角色(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
                          | LOGIN '=' boolean
                          | SUPERUSER '=' boolean
                          | OPTIONS '=' map_literal

例如:

CREATE ROLE new_role;
CREATE ROLE alice WITH PASSWORD = 'password_a' 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 };

默认角色不具有LOGIN权限或SUPERUSER状态。

数据库资源的权限授予角色;资源类型包括密钥空间,表,函数和角色本身。角色可以授予其他角色以创建分层权限结构;在这些层次结构中,权限和SUPERUSER状态是继承的,但LOGIN权限不是。

如果角色具有LOGIN权限,则客户端可以在连接时标识为该角色。在该连接的持续时间内,客户端将获得授予该角色的任何角色和特权。

只有具有数据库角色资源的CREATE权限的客户端才可能发出CREATE ROLE请求,除非客户端是SUPERUSER。Cassandra中的角色管理是可插入的并且可以自定义实现可能只支所持列出选项的一个子集。

如果角色名称包含非字母数字字符,则应使用引号。

设置内部认证的凭据

使用WITH PASSWORD子句设置内部认证的密码,将密码用单引号括起来。

如果未设置内部身份验证或角色没有LOGIN权限,则不需要WITH PASSWORD子句。

有条件地创建角色(ROLE)

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

CREATE ROLE other_role;
CREATE ROLE IF NOT EXISTS other_role;

更改角色(ROLE)

更改角色选项使用ALTER ROLE语句:

alter_role_statement ::=  ALTER ROLE role_name WITH role_options

例如:

ALTER ROLE bob WITH PASSWORD = 'PASSWORD_B' AND SUPERUSER = false;

执行ALTER ROLE语句的条件:

  • 客户端必须具有SUPERUSER状态才能更改另一个角色的SUPERUSER状态
  • 客户端无法更改当前持有的任何角色的SUPERUSER状态
  • 客户端只能修改在登录时标识的角色的某些属性(例如PASSWORD)
  • 要修改角色的属性,必须授予客户端对该角色的ALTER权限

删除角色(ROLE)

删除角色使用DROPROLE语句:

drop_role_statement ::=  DROP ROLE [ IF EXISTS ] role_name

DROP ROLE要求客户端对相关角色具有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;

此语句撤销alicereport_writer角色。alice通过report_writer角色获取的任何权限也将被撤销。

角色列表(LIST ROLE)

所有已知角色(在系统中或授予特定角色)可以使用LIST ROLES语句列出:

list_roles_statement ::=  LIST ROLES [ OF role_name ] [ NORECURSIVE ]

例如:

LIST ROLES;

返回系统中的所有已知角色,这需要对数据库角色资源具有DESCRIBE权限。和:

LIST ROLES OF alice;

枚举授予alice的所有角色,包括那些过渡性获得的角色。但:

LIST ROLES OF bob NORECURSIVE

列出直接授予bob的所有角色,而不包括任何过渡获取的角色。

角色(Users)

在Cassandra 2.2中引入角色之前,认证和授权基于USER的概念。为了向后兼容,遗留语法已被保留,USER中心语句成为基于ROLE的等同体的同义词。换句话说,创建/更新用户只是用于创建/更新角色的不同语法。

创建角色(USER)

创建用户使用CREATE USER语句:

create_user_statement ::=  CREATE USER [ IF NOT EXISTS ] role_name [ WITH 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相当于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 EXISTS alice WITH PASSWORD 'password_a' SUPERUSER;
CREATE ROLE IF 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' WITH LOGIN = true;

CREATE USER alice WITH PASSWORD 'password_a';
CREATE ROLE alice WITH PASSWORD = 'password_a' WITH LOGIN = true;

更改角色(USER)

更改用户的选项使用ALTER USER语句:

alter_user_statement ::=  ALTER USER role_name [ WITH PASSWORD string ] [ user_option ]

例如:

ALTER USER alice WITH PASSWORD 'PASSWORD_A';
ALTER USER bob SUPERUSER;

删除角色(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中有几种不同类型的资源,每种类型都是分层建模的:

  • 数据资源,键空间和表的层次结构具有结构ALL KEYSPACES - > KEYSPACE - > TABLE
  • 函数资源具有结构ALL FUNCTIONS - > KEYSPACE - > FUNCTION
  • 代表角色的资源具有结构ALL ROLES - > ROLE
  • 代表映射到MBeans / MXBeans集合的JMX ObjectNames的资源具有结构ALL MBEANS - > MBEAN

可以在这些层次结构的任何级别授予权限,并且它们向下传递。 因此,对链上较高的资源授予权限其下所有资源将自动获取到相同权限。例如,在KEYSPACE上授予SELECT权限则该KEYSPACE中的所有表都将获取SELECT权限。同样,对ALL FUNCTIONS授予权限则无论是哪个键空间下的方法都将获得相同权限。还可以对属于特定键空间的所有函数授予权限。

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

可用权限的完整集合是:

  • CREATE
  • ALTER
  • DROP
  • SELECT
  • MODIFY
  • AUTHORIZE
  • DESCRIBE
  • EXECUTE

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

权限资源操作
CREATEALLKEYSPACES在任何键空间中创建KEYSPACE CREATE TABLE
CREATEKEYSPACE在指定的键空间CREATETABLE
CREATEALLFUNCTIONS在任何键空间CREATEFUNCTION CREATEAGGREGATE
CREATEALLFUNCTIONSINKEYSPACE在指定的键空间CREATEFUNCTIONCREATEAGGREGATE
CREATEALLROLESCREATEROLE
ALTERALLKEYSPACES在任何键空间ALTERKEYSPACE ALTERTABLE
ALTERKEYSPACE在指定键空间ALTERKEYSPACEALTERTABLE
ALTERTABLEALTER TABLE
ALTERALLFUNCTIONSCREATEFUNCTIONCREATEAGGREGATE: 替换现有的
ALTERALLFUNCTIONSINKEYSPACECREATEFUNCTION CREATEAGGREGATE: 替换指定键空间中现有的
ALTERFUNCTIONCREATEFUNCTIONCREATEAGGREGATE: 替换现有的
ALTERALLROLESALTERROLE对任何角色
ALTERROLEALTERROLE
DROPALLKEYSPACES在任何键空间DROPKEYSPACEDROPTABLE
DROPKEYSPACE在指定键空间DROPTABLE
DROPTABLEDROPTABLE
DROPALLFUNCTIONS在任何键空间DROPFUNCTIONDROPAGGREGATE
DROPALLFUNCTIONSINKEYSPACE在指定键空间DROPFUNCTIONDROPAGGREGATE
DROPFUNCTIONDROPFUNCTION
DROPALLROLESDROPROLE对任何角色
DROPROLEDROPROLE
SELECTALLKEYSPACES在任何表中SELECT
SELECTKEYSPACE在指定键空间下的表中SELECT
SELECTTABLE在指定的表中SELECT
SELECTALLMBEANS在任何mbean上调用getter方法
SELECTMBEANS在匹配通配符模式的任何mbean上调用getter方法
SELECTMBEAN在指定名称的mbean上调用getter方法
MODIFYALLKEYSPACES在任何表中INSERT,UPDATE,DELETETRUNCATE
MODIFYKEYSPACE在指定键空间下的任何表中INSERT,UPDATE,DELETETRUNCATE
MODIFYTABLE在指定表中INSERT,UPDATE,DELETETRUNCATE
MODIFYALLMBEANS在任何mbean上调用setter方法
MODIFYMBEANS在匹配通配符模式的任何mbean上调用setter方法
MODIFYMBEAN在指定名称的mbean上调用setter方法
AUTHORIZEALLKEYSPACES在任何表中GRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEKEYSPACE在指定键空间下的任何表中GRANTPERMISSIONREVOKEPERMISSION
AUTHORIZETABLE在指定表中GRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEALLFUNCTIONS在任何方法中GRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEALLFUNCTIONSINKEYSPACE在指定键空间下GRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEFUNCTION在指定方法中GRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEALLMBEANS在任何mbeanGRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEMBEANS在匹配通配符模式的任何mbeanGRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEMBEAN在指定名称的mbeanGRANTPERMISSIONREVOKEPERMISSION
AUTHORIZEALLROLESGRANTPERMISSIONREVOKEPERMISSION对于任何角色
AUTHORIZEROLESGRANTPERMISSION  和 REVOKEPERMISSION对于指定的角色
DESCRIBEALLROLESLIST ROLES对所有角色或只有角色授予另一个指定角色
DESCRIBEALLMBEANS从平台的MBeanServer检索有关mbean的元数据
DESCRIBEMBEANS从平台MBeanServer检索与通配符模式匹配的mbean的元数据
DESCRIBEMBEAN从平台的MBeanServer检索有关指定名称的mbean的元数据
EXECUTEALLFUNCTIONSSELECTINSERTUPDATE使用任何函数,以及使用CREATE AGGREGATE中的任何函数
EXECUTEALLFUNCTIONSINKEYSPACE使用指定键空间中的任何函数执行SELECTINSERTUPDATE,并在CREATE AGGREGATE中使用键空间中的任何函数
EXECUTEFUNCTIONSELECTINSERTUPDATE,使用指定的函数并使用CREATE AGGREGATE中的函数
EXECUTEALLMBEANS对任何mbean执行操作
EXECUTEMBEANS对匹配通配符模式的任何mbean执行操作
EXECUTEMBEAN对指定名称的mbean执行操作

授予权限

授予权限使用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
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的用户授予在所有键空间上的任何表上执行SELECT语句的权限:

GRANT MODIFY ON KEYSPACE keyspace1 TO data_writer;

这为任何具有角色data_writer的用户授予对keyspace1键空间中所有表执行UPDATEINSERTDELETETRUNCATE查询的权限:

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表单时,将根据目标资源自动确定适当的权限集。

自动授权(Automatic Granting)

当创建资源时,通过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;

权限列表(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的资源层次结构中的任何权限。例如,bob应该对keyspace1具有ALTER权限,这将包含在此查询的结果中。添加NORECURSIVE开关将结果限制为仅直接授予bobbob的角色的那些权限:

LIST SELECT PERMISSIONS OF carlos;

显示授予carlos或任何carlos角色的任何权限,仅限于任何资源上的SELECT权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值