行レベルのパーミッションの設定
テーブルに対して行レベルのアクセス制御を設定し、行に対するパーミッションをユーザーに付与します。
行レベル・アクセス制御(RLAC)は、テキストベースのパーティション・キーに適用されたフィルターと照合することで、テーブル内のデータに対する権限管理を可能にします。RLACを使用すると、テーブルのセキュリティを詳細に設定できるため、権限を付与されたユーザーのみがデータのサブセットを表示または変更できるようになります。
注: キースペースやテーブルなどに対してより上位のパーミッションを持つロールの場合、それらのパーミッションにより、ユーザーはテーブル内のすべての行にアクセスできます。
RLACの構成は複数の手順で行います。
- パーティション・キーを選択する:テーブルごとに選択できるカラムは1つのみです。テーブルに対するMODIFYパーミッションが必要です。
- フィルターを使用してアクセス権を付与する:任意の数のロールにさまざまなフィルターを付与できます。
注: デフォルトでは、行レベル・アクセス制御は無効になっています。RLACを有効にするには、allow_row_level_securityをtrueに設定します。「DSE Unified Authentication(DSE統合認証)の有効化」を参照してください。RLACパーミッションのフェッチはリソース使用量が多く、パフォーマンスに影響を与える場合があります。このため、RLACには個別のキャッシュがあります。パフォーマンスへの影響を制御するには、cassandra.yamlのRLACキャッシュ設定を調整します。
手順
-
テーブルで、パーミッションを構成するカラムを選択します。UTF-8パーティション・キー・カラムを設定します。カラムのフィルター処理はテーブルごとに1つだけ可能です。
RESTRICT ROWS ON [keyspace_name.]table_name USING primary_key_column;
このカラムに既存のフィルターが適用されている場合、この時点でフィルター処理されています。DESCRIBE TABLEコマンドを実行すると、行の制限が表示されます。DESCRIBE TABLE table_name;
-
RLACをロールに割り当てます。
GRANT permission ON 'filtering_string' ROWS IN [keyspace_name.]table_name TO role_name;
ここで、filtering_stringは、完全に一致する必要のある、大文字と小文字が区別されているテキスト文字列です。
パーミッションは、セッションがアクティブであっても直ちにロールに適用されます。LISTコマンドを使用して、設定を表示します。LIST ALL PERMISSIONS OF role_name;
例
- フィルター処理するカラムとしてcyclist_nameカラムを選択します。
RESTRICT ROWS ON cycling.cyclist_expenses USING cyclist_name ;
テーブルに対する変更を表示します。DESC cycling.cyclist_expenses;
制限文が最後に表示されます。CREATE TABLE cycling.cyclist_expenses ( cyclist_name text, expense_id int, amount float, balance float static, description text, paid boolean, PRIMARY KEY (cyclist_name, expense_id) ) WITH CLUSTERING ORDER BY (expense_id ASC) AND bloom_filter_fp_chance = 0.01 AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} AND comment = '' AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} AND crc_check_chance = 1.0 AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99PERCENTILE'; RESTRICT ROWS ON cycling.cyclist_expenses USING cyclist_name;
- フィルターで使用するプライマリ・キーのリストを表示します。
SELECT DISTINCT cyclist_name FROM cycling.cyclist_expenses ;
cyclist_name ---------------------- Marianne VOS Alex FRAME Steven KRUIKSWIJK Vera ADRIAN Michael MATTHEWS Anna VAN DER BREGGEN Paolo TIRALONGO (7 rows)
- RLACを割り当てます。
- ロールdantest1が、Paolo TIRALONGOが入力した経費にのみアクセスできるようにします。
GRANT SELECT ON 'Paolo TIRALONGO' ROWS IN cycling.cyclist_expenses TO dantest1;
- ロールjaneがVera ADRIANにのみアクセスできるようにします。
GRANT SELECT ON 'Vera ADRIAN' ROWS IN cycling.cyclist_expenses TO jane;
- ロールdantest1が、Paolo TIRALONGOが入力した経費にのみアクセスできるようにします。
- パーミッションを確認します。
- dantest1パーミッションをチェックします。
LIST ALL PERMISSIONS OF dantest1;
この例では、これらのパーミッションはDan専用です。role | username | resource | permission ----------+----------+------------------------------------------------------------+------------ dantest1 | dantest1 | 'Paolo TIRALONGO' rows IN <table cycling.cyclist_expenses> | SELECT
- janeパーミッションをチェックします。
LIST ALL PERMISSIONS OF jane;
この例では、これらのパーミッションはDan専用です。role | username | resource | permission ----------+----------+------------------------------------------------------------+------------ dantest1 | dantest1 | 'Vera ADRIAN' rows IN <table cycling.cyclist_expenses> | SELECT
- dantest1パーミッションをチェックします。
Danがログインしてクエリーを実行すると、Danがアクセス・パーミッションを持っている行のみが結果セットに表示されます。
- dantest1としてログインします。
cqlsh -p password -u dantest1
- クエリーを実行します。
dantest1@cqlsh> SELECT * FROM cycling.cyclist_expenses ;
フィルターに完全に一致するレコードのみが表示されます。cyclist_name | expense_id | balance | amount | description | paid -----------------+------------+---------+--------+-------------+------ Paolo TIRALONGO | 11 | null | 10 | dinner | null Paolo TIRALONGO | 12 | null | 10 | dinner | null Paolo TIRALONGO | 24 | null | 10 | lunch | null Paolo TIRALONGO | 25 | null | 11 | dinner | null Paolo TIRALONGO | 26 | null | 12 | lunch | null Paolo TIRALONGO | 27 | null | 13 | lunch | null Paolo TIRALONGO | 28 | null | 14 | lunch | null Paolo TIRALONGO | 29 | null | 15 | dinner | null Paolo TIRALONGO | 30 | null | 16 | lunch | null Paolo TIRALONGO | 31 | null | 17 | dinner | null Paolo TIRALONGO | 32 | null | 18 | breakfast | null (11 rows)
cassandra.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストールInstaller-Servicesインストール |
/etc/dse/cassandra/cassandra.yaml |
tarボール・インストールInstaller-No Servicesインストール |
installation_location/resources/cassandra/conf/cassandra.yaml |