Cassandra 文件

版本

您正在檢視預發行版本的說明文件。

資料庫角色

CQL 使用資料庫角色來表示使用者和使用者群組。語法上,角色由

role_name ::= identifier | string

建立角色

建立角色使用 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 狀態。

資料庫資源的權限授予角色;資源類型包括鍵空間、表格、函數和角色本身。角色可以授予其他角色以建立階層式權限結構;在這些階層中,權限和 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 群組限制。應將有效的 CIDR 群組與 ACCESS FROM CIDRS 子句一起使用。nodetool list-cidrgroups 命令可用於查看叢集中的可用 CIDR 群組。

有條件地建立角色

嘗試建立現有角色會導致無效的查詢條件,除非使用 IF NOT EXISTS 選項。如果使用該選項且角色存在,則陳述式為 no-op

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,在此情況下,作業為 no-op。

使用 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 群組限制。應將有效的 CIDR 群組與 ACCESS FROM CIDRS 子句一起使用。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_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_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_statement ::= ALTER USER [ IF EXISTS ] role_name [ WITH [ HASHED ] PASSWORD string] [ user_option]

如果角色不存在,語句將傳回錯誤,除非使用 IF EXISTS,否則操作為 no-op。例如

ALTER USER alice WITH PASSWORD 'PASSWORD_A';
ALTER USER alice WITH HASHED PASSWORD '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG';
ALTER USER bob SUPERUSER;

刪除使用者

刪除使用者使用 DROP USER 語句。

drop_user_statement ::= DROP USER [ IF EXISTS ] role_name

列出使用者

可以使用 LIST USERS 語句列出現有使用者。

list_users_statement::= LIST USERS

請注意,此語句等於 LIST ROLES,但輸出中只包含具有 LOGIN 權限的角色。

資料控制

權限

資源的權限授予角色;Cassandra 中有數種不同類型的資源,且每種類型都以階層方式建模。

  • 資料資源、鍵空間和資料表的階層結構為 ALL KEYSPACESKEYSPACETABLE

  • 函數資源的結構為 ALL FUNCTIONSKEYSPACEFUNCTION

  • 代表角色的資源的結構為 ALL ROLESROLE

  • 表示映射到 MBean/MXBean 集合的 JMX ObjectName 的資源具有結構 ALL MBEANSMBEAN

可以在這些層級的任何層級授予權限,並且這些權限會向下傳遞。因此,在鏈中的較高層級資源上授予權限會自動在所有較低層級資源上授予相同的權限。例如,在 KEYSPACE 上授予 SELECT 會自動在該 KEYSPACE 中的所有 TABLES 上授予它。同樣地,在 ALL FUNCTIONS 上授予權限會在每個已定義的函數上授予它,無論它在什麼鍵空間中。也可以在特定鍵空間中授予所有函數的權限。

現有客戶端會話可見權限的修改;也就是說,在權限變更後不需要重新建立連線。

可用權限的完整集合是

  • CREATE

  • ALTER

  • DROP

  • SELECT

  • MODIFY

  • AUTHORIZE

  • DESCRIBE

  • EXECUTE

  • UNMASK

  • SELECT_MASKED

並非所有權限都適用於每種類型的資源。例如,EXECUTE 僅與函數或 mbean 的內容相關;在表示表格的資源上授予 EXECUTE 沒有意義。嘗試在無法套用的資源上 GRANT 權限會導致錯誤回應。以下說明可以在哪些類型的資源上授予哪些權限,以及哪些陳述受到該權限啟用。

權限 資源 操作

CREATE

ALL KEYSPACES

在任何鍵空間中 CREATE KEYSPACECREATE TABLE

CREATE

KEYSPACE

在指定的鍵空間中 CREATE TABLE

CREATE

ALL FUNCTIONS

在任何鍵空間中 CREATE FUNCTION 和在任何鍵空間中 CREATE AGGREGATE

CREATE

ALL FUNCTIONS IN KEYSPACE

在指定的鍵空間中 CREATE FUNCTIONCREATE AGGREGATE

CREATE

ALL ROLES

CREATE ROLE

ALTER

ALL KEYSPACES

在任何鍵空間中 ALTER KEYSPACEALTER TABLE

ALTER

KEYSPACE

在指定的鍵空間中 ALTER KEYSPACEALTER TABLE

ALTER

TABLE

ALTER TABLE

ALTER

ALL FUNCTIONS

CREATE FUNCTIONCREATE AGGREGATE:取代任何現有的

ALTER

ALL FUNCTIONS IN KEYSPACE

CREATE FUNCTIONCREATE AGGREGATE:取代在指定的鍵空間中現有的

ALTER

FUNCTION

CREATE FUNCTIONCREATE AGGREGATE:取代現有的

ALTER

ALL ROLES

在任何角色上 ALTER ROLE

ALTER

ROLE

ALTER ROLE

DROP

ALL KEYSPACES

在任何鍵空間中 DROP KEYSPACEDROP TABLE

DROP

KEYSPACE

在指定的鍵空間中 DROP TABLE

DROP

TABLE

刪除表格

DROP

ALL FUNCTIONS

在任何鍵空間中 DROP FUNCTIONDROP AGGREGATE

DROP

ALL FUNCTIONS IN KEYSPACE

在指定的鍵空間中 DROP FUNCTIONDROP AGGREGATE

DROP

FUNCTION

刪除函數

DROP

ALL ROLES

刪除角色對任何角色

DROP

ROLE

刪除角色

SELECT

ALL KEYSPACES

選擇任何資料表

SELECT

KEYSPACE

選擇指定鍵空間中的任何資料表

SELECT

TABLE

選擇指定資料表

SELECT

所有 MBEAN

呼叫任何 mbean 上的 getter 方法

SELECT

MBEAN

呼叫與萬用字元模式相符的任何 mbean 上的 getter 方法

SELECT

MBEAN

呼叫命名 mbean 上的 getter 方法

MODIFY

ALL KEYSPACES

插入更新刪除截斷任何資料表

MODIFY

KEYSPACE

插入更新刪除截斷指定鍵空間中的任何資料表

MODIFY

TABLE

插入更新刪除截斷指定資料表

MODIFY

所有 MBEAN

呼叫任何 mbean 上的 setter 方法

MODIFY

MBEAN

呼叫與萬用字元模式相符的任何 mbean 上的 setter 方法

MODIFY

MBEAN

呼叫命名 mbean 上的 setter 方法

AUTHORIZE

ALL KEYSPACES

授予權限撤銷權限對任何資料表

AUTHORIZE

KEYSPACE

授予權限撤銷權限對指定鍵空間中的任何資料表

AUTHORIZE

TABLE

授予權限撤銷權限對指定資料表

AUTHORIZE

ALL FUNCTIONS

授予權限撤銷權限對任何函數

AUTHORIZE

ALL FUNCTIONS IN KEYSPACE

授予權限撤銷權限在指定鍵空間中

AUTHORIZE

FUNCTION

授予權限撤銷權限對指定函數

AUTHORIZE

所有 MBEAN

授予權限撤銷權限對任何 mbean

AUTHORIZE

MBEAN

授予權限撤銷權限對與萬用字元模式相符的任何 mbean

AUTHORIZE

MBEAN

授予權限撤銷權限對命名 mbean

AUTHORIZE

ALL ROLES

授予角色撤銷角色對任何角色

AUTHORIZE

角色

授予角色撤銷角色對指定角色

DESCRIBE

ALL ROLES

列出角色對所有角色或僅授予另一指定角色的角色

DESCRIBE

所有 MBEAN

從平台的 MBeanServer 擷取任何 mbean 的元資料

DESCRIBE

MBEAN

從平台的 MBeanServer 擷取與萬用字元模式相符的任何 mbean 的元資料

DESCRIBE

MBEAN

從平台的 MBeanServer 擷取命名 mbean 的元資料

EXECUTE

ALL FUNCTIONS

選擇插入更新使用任何函數,以及在建立總計中使用任何函數

EXECUTE

ALL FUNCTIONS IN KEYSPACE

選擇插入更新使用指定鍵空間中的任何函數,以及在建立總計中使用鍵空間中的任何函數

EXECUTE

FUNCTION

選擇插入更新使用指定函數,以及在建立總計中使用該函數

EXECUTE

所有 MBEAN

對任何 mbean 執行操作

EXECUTE

MBEAN

對與萬用字元模式相符的任何 mbean 執行操作

EXECUTE

MBEAN

對命名 mbean 執行操作

UNMASK

ALL KEYSPACES

查看任何表格中已遮罩欄位的明確內容

UNMASK

KEYSPACE

查看鍵空間中任何表格中已遮罩欄位的明確內容

UNMASK

TABLE

查看指定表格中已遮罩欄位的明確內容

SELECT_MASKED

ALL KEYSPACES

SELECT限制任何表格中的已遮罩欄位

SELECT_MASKED

KEYSPACE

SELECT限制指定鍵空間中任何表格中的已遮罩欄位

SELECT_MASKED

TABLE

SELECT限制指定表格中的已遮罩欄位

授予權限

授予權限使用 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 的任何使用者在所有鍵空間中對任何表格執行 SELECT 陳述式的權限

GRANT MODIFY ON KEYSPACE keyspace1 TO data_writer;

授予擁有角色 data_writer 的任何使用者在 keyspace1 鍵空間中的所有表格上執行 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 表單時,適當的權限組會根據目標資源自動決定。

自動授予

當透過 CREATE KEYSPACECREATE TABLECREATE FUNCTIONCREATE AGGREGATECREATE ROLE 陳述式建立資源時,建立者(資料庫使用者發出陳述式時所識別的角色)會自動授予對新資源的所有適用權限。

撤銷權限

從角色撤銷權限使用 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_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;

顯示授予 carlos 或任何 carlos 的角色的任何權限,限於對任何資源的 SELECT 權限。