RLS ポリシーを使用する際の考慮事項と制限事項
考慮事項
RLS ポリシーを操作する際の考慮事項は次のとおりです。
Amazon Redshift は、RLS ポリシーを SELECT、UPDATE、DELETE ステートメントに適用します。
Amazon Redshift は、RLS ポリシーを INSERT、COPY、ALTER TABLE APPEND ステートメントに適用しません。
-
RLS ポリシーは、テーブル、ビュー、遅延バインディングビュー (LBV)、マテリアライズドビュー (MV) にアタッチできます。
行レベルのセキュリティは、列レベルのセキュリティと連携してデータを保護します。
ソース関係で RLS がオンになっているとき、Amazon Redshift は、スーパーユーザー、IGNORE RLS のシステムアクセス許可を明示的に付与されたユーザー、sys:secadmin ロールに対して ALTER TABLE APPEND ステートメントをサポートします。この場合、ALTER TABLE APPEND ステートメントを実行して、既存のソーステーブルからデータを移動することにより、ターゲットテーブルに行を追加できます。Amazon Redshift は、すべてのタプルをソース関係からターゲット関係に移動します。ターゲット関係の RLS ステータスは、ALTER TABLE APPEND ステートメントには影響しません。
他のデータウェアハウスシステムからの移行を容易にするには、変数名と値を指定することにより、接続用にカスタマイズされたセッションコンテキスト変数を設定と取得できます。
次の例では、行レベルセキュリティ (RLS) ポリシーのセッションコンテキスト変数を設定します。
-- Set a customized context variable. SELECT set_config(‘app.category’, ‘Concerts’, FALSE); -- Create a RLS policy using current_setting() to get the value of a customized context variable. CREATE RLS POLICY policy_categories WITH (catgroup VARCHAR(10)) USING (catgroup = current_setting('app.category', FALSE)); -- Set correct roles and attach the policy on the target table to one or more roles. ATTACH RLS POLICY policy_categories ON tickit_category_redshift TO ROLE analyst, ROLE dbadmin;
カスタマイズされたセッションコンテキスト変数の設定と取得の詳細については、「SET」、「SET_CONFIG」、「SHOW」、「CURRENT_SETTING」、「RESET」を参照してください。サーバー設定変更全般の詳細については、「サーバー設定の変更」を参照してください。
重要
RLS ポリシー内でセッションコンテキスト変数を使用する場合、セキュリティポリシーはポリシーを呼び出すユーザーまたはロールに依存します。RLS ポリシーでセッションコンテキスト変数を使用する場合は、セキュリティの脆弱性を避けるように注意してください。
DECLARE と FETCH の間、または後続の FETCH ステートメントの間に SET SESSION AUTHORIZATION を使用してセッションユーザーを変更しても、DECLARE 時のユーザーポリシーに基づいて既に準備されているプランは更新されません。RLS で保護されたテーブルでカーソルを使用する場合は、セッションユーザーを変更しないでください。
ビューオブジェクト内のベースオブジェクトが RLS で保護されている場合、クエリを実行しているユーザーにアタッチされたポリシーがそれぞれのベースオブジェクトに適用されます。これは、ビュー所有者の権限がビューベースオブジェクトと照合されるオブジェクトレベルのアクセス許可チェックとは異なります。クエリの RLS で保護されたリレーションは、EXPLAIN プランの出力で確認できます。
ユーザー定義関数 (UDF) がユーザーに関連付けられたリレーションの RLS ポリシーで参照される場合、リレーションをクエリするには UDF に対する EXECUTE 権限が必要です。
行レベルのセキュリティは、クエリの最適化を制限する可能性があります。RLS で保護されたビューを大きなデータセットにデプロイする前に、クエリのパフォーマンスを慎重に評価することをお勧めします。
遅延バインディングビューに適用される行レベルのセキュリティポリシーは、フェデレーションテーブルにプッシュされる可能性があります。これらの RLS ポリシーは、外部の処理エンジンログに表示される場合があります。
制限
RLS ポリシーを操作する場合の制限事項は次のとおりです。
-
RLS ポリシーは、外部テーブルやその他のいくつかの関係タイプにはアタッチできません。詳細については、「ATTACH RLS POLICY」を参照してください。
-
Amazon Redshift は、複雑な結合を持つルックアップを備える特定の RLS ポリシーの SELECT ステートメントをサポートしていますが、UPDATE または DELETE ステートメントはサポートしていません。UPDATE または DELETE ステートメントの場合、Amazon Redshift は次のエラーを返します。
ERROR: One of the RLS policies on target relation is not supported in UPDATE/DELETE.
-
ユーザー定義関数 (UDF) がユーザーに関連付けられたリレーションの RLS ポリシーで参照される場合は常に、リレーションをクエリするには UDF に対する EXECUTE 権限が必要です。
相関サブクエリはサポートされていません。Amazon Redshift は次のエラーを返します。
ERROR: RLS policy could not be rewritten.
Amazon Redshift は RLS とのデータの共有をサポートしていません。リレーションでデータ共有の RLS がオフになっていない場合、クエリはコンシューマークラスターで失敗し、次のエラーが表示されます。
RLS-protected relation "rls_protected_table" cannot be accessed via datasharing query.
パラメータ ROW LEVEL SECURITY OFF FOR DATASHARES を指定して ALTER TABLE コマンドを使用すると、データ共有の RLS をオフにできます。ALTER TABLE を使用して RLS を有効または無効にする方法の詳細については、「ALTER TABLE」を参照してください。
クロスデータベースクエリでは、Amazon Redshift は RLS で保護されたリレーションへの読み取りをブロックします。IGNORE RLS 権限を持つユーザーは、クロスデータベースクエリを使用して保護されたリレーションにアクセスできます。IGNORE RLS 権限のないユーザーが、クロスデータベースクエリを通じて RLS で保護されたリレーションにアクセスすると、次のエラーが表示されます。
RLS-protected relation "rls_protected_table" cannot be accessed via cross-database query.
ALTER RLS POLICY では、USING (using_predicate_exp) 句を使用する、RLS ポリシーの変更のみがサポートされています。ALTER RLS POLICY を実行しているときに WITH 句を使用して RLS ポリシーを変更することはできません。
-
以下の設定オプションのいずれかの値がセッションのデフォルト値と一致しない場合、行レベルのセキュリティが有効になっているリレーションをクエリすることはできません。
enable_case_sensitive_super_attribute
enable_case_sensitive_identifier
downcase_delimited_identifier
行レベルのセキュリティをオンにしてリレーションをクエリしようとして、「RLS で保護されたリレーションは、大文字と小文字の区別がデフォルト値と異なるため、セッションレベルの設定をサポートしていません」というメッセージが表示される場合は、セッションの設定オプションをリセットすることを検討してください。
プロビジョニングされたクラスターまたはサーバーレス名前空間に行レベルのセキュリティポリシーが適用されている場合、以下のコマンドは標準ユーザーにはブロックされます。
ALTER <current_user> SET enable_case_sensitive_super_attribute/enable_case_sensitive_identifier/downcase_delimited_identifier
RLS ポリシーを作成するときは、ポリシー作成時のセッションの設定オプションの設定と一致するように、標準ユーザーのデフォルトの設定オプション設定を変更することをお勧めします。スーパーユーザーと ALTER USER 権限を持つユーザーは、パラメータグループ設定または ALTER USER コマンドを使用して、この操作を行うことができます。パラメータグループの詳細については、「Amazon Redshift 管理ガイド」の「Amazon Redshift パラメータグループ」を参照してください。ALTER USER コマンドの詳細については、「ALTER USER」を参照してください。
-
行レベルのセキュリティポリシーが設定されたビューや遅延バインディングビューは、通常のユーザーが CREATE VIEW コマンドを使用して置き換えることはできません。ビューまたは LBV を RLS ポリシーに置き換えるには、まず、それらにアタッチされている RLS ポリシーをすべてデタッチし、ビューまたは LBV を置き換えてから、ポリシーを再アタッチします。スーパーユーザーと、
sys:secadmin permission
を持っているユーザーは、ポリシーをデタッチしなくても、RLS ポリシーが設定されたビューまたは LBV で CREATE VIEW を使用できます。 -
行レベルのセキュリティポリシーが設定されているビューは、システムテーブルやシステムビューを参照できません。
-
通常のビューが参照する遅延バインディングビューは RLS 保護ができません。
-
RLS 保護がなされた関係と、データレイクからのネストされたデータには、同じクエリではアクセスできません。