行レベル・アクセス制御(RLAC)の設定

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

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

cassandra.yaml

cassandra.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra.yaml
tarボール・インストール installation_location/resources/cassandra/conf/cassandra.yaml

手順

  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;

次の例では、cyclist_expensesとサイクリング・ロールを使用しています。
  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 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 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
                Joe WALLS
          Paolo TIRALONGO
    
    (8 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 | granted | restricted | grantable
      ----------+----------+------------------------------------------------------------+------------+---------+------------+-----------
       dantest1 | dantest1 | 'Paolo TIRALONGO' rows IN <table cycling.cyclist_expenses> |     SELECT |    True |      False |     False
      
      (1 rows)
    2. janeパーミッションをチェックします。
      LIST ALL PERMISSIONS OF jane;
      この例では、これらのパーミッションはDan専用です。
      
       role | username | resource                                               | permission | granted | restricted | grantable
      ------+----------+--------------------------------------------------------+------------+---------+------------+-----------
       jane |     jane | 'Vera ADRIAN' rows IN <table cycling.cyclist_expenses> |     SELECT |    True |      False |     False
      
      (1 rows)
Danがログインしてクエリーを実行すると、Danがアクセス・パーミッションを持っている行のみが結果セットに表示されます。
  1. dantest1としてログインします。
    cqlsh -p password -u dantest1
  2. クエリーを実行します。
    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)