データベースロール
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
ステータスがありません。
権限は、データベースリソース(keyspace、テーブル、関数、ロール自体など)に付与されます。ロールは他のロールに付与して階層的な権限構造を作成できます。これらの階層では、権限とSUPERUSER
ステータスは継承されますが、LOGIN
権限は継承されません。
ロールにLOGIN
権限がある場合、クライアントは接続時にそのロールとして識別できます。その接続中は、クライアントはそのロールに付与されたすべてのロールと権限を取得します。
クライアントがSUPERUSER
でない限り、データベースロールリソースに対するCREATE
権限を持つクライアントのみがCREATE ROLE
リクエストを発行できます(関連セクションを参照)。Cassandraでのロール管理はプラグイン可能であり、カスタム実装では、リストされているオプションの一部のみをサポートする場合があります。
ロール名に英数字以外の文字が含まれている場合は、引用符で囲む必要があります。
内部認証の資格情報の設定
内部認証のパスワードを設定するには、WITH PASSWORD
句を使用し、パスワードを単一引用符で囲みます。
内部認証が設定されていない場合、またはロールにLOGIN
権限がない場合、WITH PASSWORD
句は必要ありません。
jBcryptハッシュパスワードを直接提供するには、WITH HASHED PASSWORD
を使用します。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
ロールオプションの変更には、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になります。
jBcryptハッシュパスワードを直接提供するには、WITH HASHED PASSWORD
を使用します。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グループを確認できます。
DROP ROLE
ロールの削除には、DROP ROLE
ステートメントを使用します。
drop_role_statement ::= DROP ROLE [ IF EXISTS ] role_name
DROP ROLE
には、クライアントに問題のロールに対するDROP
DROP
できません。最後に、SUPERUSER
ステータスを持つクライアントのみが、別のSUPERUSER
ロールをDROP
できます。
IF EXISTS
オプションを使用しない限り、存在しないロールを削除しようとすると、無効なクエリ条件になります。このオプションを使用していて、ロールが存在しない場合は、ステートメントはno-opになります。
|
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
コマンドは、LOGIN
オプションがtrue
であるCREATE ROLE
と同等です。そのため、次のステートメントのペアは同等です。
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
を使用しない限り、ステートメントはエラーを返します。その場合、操作は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
ステートメントを使用します。
drop_user_statement ::= DROP USER [ IF EXISTS ] role_name
LIST USERS
既存のユーザーは、LIST USERS
ステートメントを使用して一覧表示できます。
list_users_statement::= LIST USERS
このステートメントはLIST ROLES
と等価ですが、出力には`LOGIN`権限を持つロールのみが含まれます。
データ制御
権限
リソースに対する権限はロールに付与されます。Cassandraにはいくつかの異なるタイプのリソースがあり、各タイプは階層的にモデル化されています。
-
データリソース、Keyspace、テーブルの階層構造は、
ALL KEYSPACES
→KEYSPACE
→TABLE
です。 -
関数リソースの構造は、
ALL FUNCTIONS
→KEYSPACE
→FUNCTION
です。 -
ロールを表すリソースの構造は、
ALL ROLES
→ROLE
です。 -
MBean/MXBeanのセットにマップされるJMX ObjectNameを表すリソースの構造は、
ALL MBEANS
→MBEAN
です。
権限はこれらの階層の任意のレベルで付与でき、下位に伝播します。そのため、上位のリソースに対する権限を付与すると、下位のリソースすべてに自動的に同じ権限が付与されます。例えば、KEYSPACE
に対するSELECT
権限を付与すると、そのKEYSPACE
内のすべてのTABLE
に自動的にSELECT
権限が付与されます。同様に、ALL FUNCTIONS
に対する権限を付与すると、どのKeyspaceにスコープされているかに関係なく、定義されているすべての関数に権限が付与されます。特定のKeyspaceにスコープされたすべての関数に権限を付与することも可能です。
権限の変更は既存のクライアントセッションに表示されます。つまり、権限の変更後、接続を再確立する必要はありません。
使用可能な権限の完全なセットは次のとおりです。
-
CREATE
-
ALTER
-
DROP
-
SELECT
-
MODIFY
-
AUTHORIZE
-
DESCRIBE
-
EXECUTE
-
UNMASK
-
SELECT_MASKED
すべての権限がすべてのリソースタイプに適用されるわけではありません。たとえば、EXECUTE
は関数またはmbeanのコンテキストでのみ関連性があり、テーブルを表すリソースにEXECUTE
を付与しても意味がありません。適用できないリソースに権限をGRANT
しようとすると、エラー応答が発生します。以下は、どのタイプのリソースにどの権限を付与できるか、そしてその権限によってどのステートメントが有効になるかを示しています。
権限 | リソース | 操作 |
---|---|---|
|
|
任意のKeyspaceでの |
|
|
指定されたKeyspaceでの |
|
|
任意のKeyspaceでの |
|
|
指定されたKeyspaceでの |
|
|
|
|
|
任意のKeyspaceでの |
|
|
指定されたKeyspaceでの |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
任意のロールに対する |
|
|
|
|
|
任意のKeyspaceでの |
|
|
指定されたKeyspaceでの |
|
|
|
|
|
任意のKeyspaceでの |
|
|
指定されたKeyspaceでの |
|
|
|
|
|
任意のロールに対する |
|
|
|
|
|
任意のテーブルに対する |
|
|
指定されたKeyspace内の任意のテーブルに対する |
|
|
指定されたテーブルに対する |
|
|
任意のmbeanに対するgetterメソッドの呼び出し |
|
|
ワイルドカードパターンに一致する任意のmbeanに対するgetterメソッドの呼び出し |
|
|
名前付きmbeanに対するgetterメソッドの呼び出し |
|
|
任意のテーブルに対する |
|
|
指定されたKeyspace内の任意のテーブルに対する |
|
|
指定されたテーブルに対する |
|
|
任意のmbeanに対するsetterメソッドの呼び出し |
|
|
ワイルドカードパターンに一致する任意のmbeanに対するsetterメソッドの呼び出し |
|
|
名前付きmbeanに対するsetterメソッドの呼び出し |
|
|
任意のテーブルに対する |
|
|
指定されたKeyspace内の任意のテーブルに対する |
|
|
指定されたテーブルに対する |
|
|
任意の関数に対する |
|
|
指定されたKeyspaceでの |
|
|
指定された関数に対する |
|
|
任意のmbeanに対する |
|
|
ワイルドカードパターンに一致する任意のmbeanに対する |
|
|
名前付きmbeanに対する |
|
|
任意のロールに対する |
|
|
指定されたロールに対する |
|
|
すべてのロール、または別の指定されたロールに付与されたロールのみに対する |
|
|
プラットフォームのMBeanServerから任意のmbeanに関するメタデータを取得する |
|
|
プラットフォームのMBeanServerからワイルドカードパターンに一致する任意のmbeanに関するメタデータを取得する |
|
|
プラットフォームのMBeanServerから名前付きmbeanに関するメタデータを取得する |
|
|
任意の関数を使用した |
|
|
指定されたKeyspace内の任意の関数を使用した |
|
|
指定された関数を使用した |
|
|
任意のmbeanに対する操作の実行 |
|
|
ワイルドカードパターンに一致する任意のmbeanに対する操作の実行 |
|
|
名前付きmbeanに対する操作の実行 |
|
|
任意のテーブルのマスクされた列のクリアなコンテンツを参照する |
|
|
Keyspace内の任意のテーブルのマスクされた列のクリアなコンテンツを参照する |
|
|
指定されたテーブルのマスクされた列のクリアなコンテンツを参照する |
|
|
任意のテーブルでマスクされた列を制限する |
|
|
指定された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
ロールを持つユーザーに、特定のkeyspace1.table1
をDROP
する権限を与えるには
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;
他のロールから推移的に取得した権限を含め、keyspace1.table1
に対してbob
に付与されたすべての権限を表示します。これには、keyspace1.table1
に適用できるリソース階層の上位にある権限も含まれます。たとえば、bob
がkeyspace1
に対してALTER
権限を持っている場合、その権限はクエリ結果に含まれます。NORECURSIVE
スイッチを追加すると、結果がbob
またはbob
のロールのいずれかに直接付与された権限のみに制限されます。
LIST SELECT PERMISSIONS OF carlos;
carlos
またはcarlos
のロールのいずれかに付与された権限を表示します。これは、任意のリソースに対するSELECT
権限に限定されます。