行レベルのパーミッションの設定

テーブルに対して行レベルのアクセス制御を設定し、行に対するパーミッションをユーザーに付与します。

行レベル・アクセス制御(RLAC)は、テキストベースのパーティション・キーに適用されたフィルターと照合することで、テーブル内のデータに対する権限管理を可能にします。RLACを使用すると、テーブルのセキュリティを詳細に設定できるため、権限を付与されたユーザーのみがデータのサブセットを表示または変更できるようになります。
注: キースペースやテーブルなどに対してより上位のパーミッションを持つロールの場合、それらのパーミッションにより、ユーザーはテーブル内のすべての行にアクセスできます。
RLACの構成は複数の手順で行います。
  • パーティション・キーを選択する:テーブルごとに選択できるカラムは1つのみです。テーブルに対するMODIFYパーミッションが必要です。
  • フィルターを使用してアクセス権を付与する:任意の数のロールにさまざまなフィルターを付与できます。
注: デフォルトでは、行レベル・アクセス制御は無効になっています。RLACを有効にするには、allow_row_level_securityをtrueに設定します。「DSE Unified Authentication(DSE統合認証)の有効化」を参照してください。RLACパーミッションのフェッチはリソース使用量が多く、パフォーマンスに影響を与える場合があります。このため、RLACには個別のキャッシュがあります。パフォーマンスへの影響を制御するには、cassandra.yamlRLACキャッシュ設定を調整します。

手順

  1. テーブルで、パーミッションを構成するカラムを選択します。UTF-8パーティション・キー・カラムを設定します。カラムのフィルター処理はテーブルごとに1つだけ可能です。
    RESTRICT ROWS ON [keyspace_name.]table_name
    USING primary_key_column;
    このカラムに既存のフィルターが適用されている場合、この時点でフィルター処理されています。DESCRIBE TABLEコマンドを実行すると、行の制限が表示されます。
    DESCRIBE TABLE table_name;
  2. RLACをロールに割り当てます。
    GRANT permission ON 
    'filtering_string' ROWS IN [keyspace_name.]table_name
    TO role_name;

    ここで、filtering_stringは、完全に一致する必要のある、大文字と小文字が区別されているテキスト文字列です。

    パーミッションは、セッションがアクティブであっても直ちにロールに適用されます。LISTコマンドを使用して、設定を表示します。
    LIST ALL PERMISSIONS OF role_name;

  1. フィルター処理するカラムとして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;
  2. フィルターで使用するプライマリ・キーのリストを表示します。
    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)
  3. RLACを割り当てます。
    1. ロールdantest1が、Paolo TIRALONGOが入力した経費にのみアクセスできるようにします。
      GRANT SELECT ON 'Paolo TIRALONGO' ROWS IN cycling.cyclist_expenses TO dantest1;
    2. ロールjaneがVera ADRIANにのみアクセスできるようにします。
      GRANT SELECT ON 'Vera ADRIAN' ROWS IN cycling.cyclist_expenses TO jane;
  4. パーミッションを確認します。
    1. dantest1パーミッションをチェックします。
      LIST ALL PERMISSIONS OF dantest1;
      この例では、これらのパーミッションはDan専用です。
      
       role     | username | resource                                                   | permission
      ----------+----------+------------------------------------------------------------+------------
       dantest1 | dantest1 | 'Paolo TIRALONGO' rows IN <table cycling.cyclist_expenses> |     SELECT
    2. janeパーミッションをチェックします。
      LIST ALL PERMISSIONS OF jane;
      この例では、これらのパーミッションはDan専用です。
      
       role     | username | resource                                                   | permission
      ----------+----------+------------------------------------------------------------+------------
       dantest1 | dantest1 | 'Vera ADRIAN' rows IN <table cycling.cyclist_expenses> |     SELECT
Danがログインしてクエリーを実行すると、Danがアクセス・パーミッションを持っている行のみが結果セットに表示されます。
  1. dantest1としてログインします。
    cqlsh -p password -u dantest1
  2. クエリーを実行します。
    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