資料庫角色
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
可用於明確表示,但沒有功能差異。
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
子句。
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_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;
列出使用者
可以使用 LIST USERS
語句列出現有使用者。
list_users_statement::= LIST USERS
請注意,此語句等於 LIST ROLES
,但輸出中只包含具有 LOGIN
權限的角色。
資料控制
權限
資源的權限授予角色;Cassandra 中有數種不同類型的資源,且每種類型都以階層方式建模。
-
資料資源、鍵空間和資料表的階層結構為
ALL KEYSPACES
→KEYSPACE
→TABLE
。 -
函數資源的結構為
ALL FUNCTIONS
→KEYSPACE
→FUNCTION
。 -
代表角色的資源的結構為
ALL ROLES
→ROLE
。 -
表示映射到 MBean/MXBean 集合的 JMX ObjectName 的資源具有結構
ALL MBEANS
→MBEAN
可以在這些層級的任何層級授予權限,並且這些權限會向下傳遞。因此,在鏈中的較高層級資源上授予權限會自動在所有較低層級資源上授予相同的權限。例如,在 KEYSPACE
上授予 SELECT
會自動在該 KEYSPACE
中的所有 TABLES
上授予它。同樣地,在 ALL FUNCTIONS
上授予權限會在每個已定義的函數上授予它,無論它在什麼鍵空間中。也可以在特定鍵空間中授予所有函數的權限。
現有客戶端會話可見權限的修改;也就是說,在權限變更後不需要重新建立連線。
可用權限的完整集合是
-
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 執行操作 |
|
|
查看任何表格中已遮罩欄位的明確內容 |
|
|
查看鍵空間中任何表格中已遮罩欄位的明確內容 |
|
|
查看指定表格中已遮罩欄位的明確內容 |
|
|
|
|
|
|
|
|
|
授予權限
授予權限使用 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
鍵空間中的所有表格上執行 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_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;
顯示授予 bob
的 keyspace1.table1
上的所有權限,包括從任何其他角色傳遞取得的權限。這也包括可以套用於 keyspace1.table1
的資源階層中較高層級的任何權限。例如,如果 bob
對 keyspace1
擁有 ALTER
權限,則會包含在這個查詢的結果中。新增 NORECURSIVE
開關會將結果限制為僅直接授予 bob
或 bob
的角色之一的權限
LIST SELECT PERMISSIONS OF carlos;
顯示授予 carlos
或任何 carlos
的角色的任何權限,限於對任何資源的 SELECT
權限。