Note
このページでは、UDF を使用し、クエリの実行中に Databricks ランタイムによって適用される行フィルターポリシーと列マスク ポリシーの評価とランタイム動作について説明します。 GRANTポリシー(ベータ版)については、ABACのGRANTポリシー(ベータ版)をご覧ください。
このページでは、次のような ABAC ポリシーがクエリ時にどのように評価されるかについて説明します。
- 複数のポリシー間の競合の処理方法
- 列マスクによる型変換の仕組み
- ポリシーが依存するタグまたは機能が削除されたときにデータの漏えいを防ぐ保護策
ポリシーの評価と適用
ユーザーがテーブルに対してクエリを実行すると、ABAC の評価は、Unity カタログでのポリシー評価と Databricks ランタイムでのポリシーの適用という 2 つの段階で続行されます。
ポリシーの評価はユーザーの ID、グループ メンバーシップ、アクセスするデータのタグによって異なるため、同じクエリとは異なる結果が表示される場合があります。 グループ メンバーシップまたはタグの割り当てを変更すると、クエリ時に有効なポリシーが動的に変更されます。
ポリシーの評価 (Unity カタログ)
Unity Catalog では、セキュリティ保護可能なオブジェクトのメタデータ (管理タグの割り当てなど) と、クエリを実行するユーザーの ID とグループ メンバーシップを使用して、次の手順を実行します。
- クエリ対象テーブルのスコープを持つすべてのポリシーを識別します。
- これらの各ポリシーについて、クエリを実行するユーザーが
TOリストではなくEXCEPTリストに含まれているかどうかを確認します。 - ポリシーごとに、継承されたタグを含め、クエリ対象オブジェクトのタグに対してテーブルと列の条件を評価します。 列の条件は、少なくとも 1 つの列と一致する必要があります。
- ポリシーが適用される場合は、有効な行フィルターまたは列マスクを決定し、テーブル メタデータの一部として Databricks ランタイムに送信します。
ポリシーの適用 (Databricks ランタイム)
Databricks Runtime クエリ プランナーは、クエリの実行中にフィルター処理とマスクを適用するテーブル スキャンの上に、有効な行フィルターまたは列マスクを安全なビューに変換します。 これは、 テーブル レベルの行フィルターと列マスクに使用されるのと同じ適用メカニズムです。
フェールクローズ設計
ABAC は、フェールクローズ モデルに従います。Azure Databricksセキュリティを検証できない場合は、既定でアクセスが拒否されます。 Azure Databricksは、適用されるすべてのポリシーを安全に適用できる場合にのみ、ABAC で保護されたテーブルへのアクセスを許可します。 これは、サポートされていないコンピューティング バージョン、基になるテーブル データに対する特定の操作、およびポリシーの依存関係 (タグまたは関数) が削除された状況に適用されます。
サポートされていないコンピューティング バージョン
ABAC ポリシーには、Databricks Runtime 16.4 以降、またはサーバーレス コンピューティングが必要です。 ユーザーがサポートされていないバージョンから ABAC で保護されたテーブルにアクセスしようとすると、保護されていないデータの公開を防ぐために、クエリは閉じられ (アクセスが拒否されます) 失敗します。
専用アクセスモードでは、Azure Databricks はサーバーレス コンピューティングに権限制御の実施を委任し、きめ細かなアクセス制御の確実な適用を保証します。 古いランタイムのユーザーがこれらのテーブルにアクセスできるようにするには、ポリシーから明示的に除外する必要があります。
保護されたデータに対するサポートされていない操作
特定の操作は、行フィルターまたは列マスクと互換性がありません。 これらの操作は、適用の回避ではなく失敗します。 それらを実行するには、テーブルに適用されるすべての ABAC ポリシーの EXCEPT 句にプリンシパルを一覧表示する必要があります。 除外プリンシパルはポリシーの対象ではないため、Azure Databricksは適用する必要がないため、操作を安全に許可できます。
実行プリンシパルを除外する必要がある操作には、パイプラインの更新、バックアップ プロセス、および次のような管理ワークフローが含まれます。
- 16.4 より前の Databricks Runtime バージョンを実行しているコンピューティングから ABAC で保護されたテーブルにアクセスする
- タイム トラベル クエリ
- 深い複製および浅い複製
- 共有所有者がポリシーから除外され、必要な OpenSharing アクセス許可を持っている必要がある OpenSharing。 このポリシーは受信者のアクセス権を管理しないことに注意してください。
- AI Search インデックスの作成と同期
これらの制限とその他の制限の詳細については、 行フィルターポリシーと列マスク ポリシーの要件、クォータ、制限事項に関するページを参照してください。
ポリシーの依存関係を削除しました
ABAC ポリシーは、管理されたタグと UDF に依存します。 ポリシーが参照している間にこれらの依存関係のいずれかが削除された場合、ポリシーのスコープ内のテーブルに対するクエリは失敗します。
管理タグの削除
ABAC ポリシーが参照する管理タグを削除すると、ポリシーがアタッチされ、その子オブジェクトに対するすべてのクエリが失敗し、 INVALID_PARAMETER_VALUE.UC_ABAC_UNKNOWN_TAG_POLICY エラーが発生します。 これは、クエリされたテーブルにタグが適用されなかった場合でも発生します。
管理タグが削除されると、管理されていないタグになります。 許容値の制限は削除され、 APPLY TAG を持つすべてのユーザーは、 ASSIGN 特権なしで値を変更できます。
Warnung
UI と API は、ABAC ポリシーで参照されている管理タグの削除を妨げるものではありません。 管理タグを削除する前に、ABAC ポリシーで参照されていないことを確認してください。
エラーを解決するには、削除されたタグを復元するか、それを参照するポリシーを更新または削除します。 管理タグの作成と管理に関するページを参照してください。
タグが付いた列の削除
Azure Databricksでは、管理タグが適用されている列を削除できなくなります。 列を削除するには、タグに ASSIGN を持ち、オブジェクトの APPLY TAG を持つユーザーが最初にタグを削除してから、列を削除する必要があります。
これは、宣言型パイプラインや、テーブル スキーマを変更する他の自動化されたワークフローに関連します。 パイプラインがタグ付き列を削除しようとすると、操作は失敗します。 パイプラインのブロックを解除するには、必要なタグアクセス許可を持つユーザーがタグを削除し、スキーマの変更が成功するようにパイプラインを実行してから、タグを関連する列に再適用する必要があります。 タグが再適用されていない場合、ポリシーはまだスコープ内にあるが、予期されるタグがオブジェクト上にないため、データに対するクエリは失敗します。
ポリシー参照関数の削除
ポリシーがスコープ内にある間にポリシーによって参照される UDF が削除された場合、そのスコープ内のテーブルに対するクエリは UC_DEPENDENCY_DOES_NOT_EXISTで失敗します。 解決するには、関数を復元するか、別の UDF を参照するようにポリシーを更新します。
ID 属性の条件
恒等属性関数(has_identity_attribute_value および has_identity_attribute_tag_match)は次のように解決されます。
- ユーザーが属性の値を持たない場合、あるいはそもそも属性がない場合、またはポリシーが存在しない属性を名付けている場合、関数は
falseを返します。 エラーは発生しません。 値が存在しない場合はfalseが返されるため、値がない場合にアクセスを許可するのではなく、制限するように条件式を記述します。 - ポリシーに
has_identity_attribute_tag_match存在しないガバナンス対象のタグキーを渡した場合、ポリシーの作成に失敗します。
コンテキスト属性条件
コンテキスト属性関数(has_context_attribute および has_context_attribute_value)は次のように解決されます。
-
request.client_idは一部のリクエストパスにのみ存在します。 これはOAuthアプリケーションを通じて行われる代理リクエスト用に設定されており、それ以外の場合は存在しません。request.is_on_behalf_ofは'true'または'false'の数値で存在するか、サポートされていない計算経路には存在しません。 - リクエストに認識された属性が存在しない場合、関数は
falseを返しますが、エラーは発生しません。 この結果がアクセスを許可するのではなく制限するように、条件を記述してください。 - 認識済みの
request.*属性ではないキー(スペルミスしたキーなど)は、falseに解決されるのではなく、評価エラーが発生します。request.client_idとrequest.is_on_behalf_ofの正確な名前を使ってください。
これらの関数を使用する行フィルターまたは列マスク ポリシーがまだ存在している状態で UC ABAC Context Attributes プレビューを無効にすると、影響を受けるデータに対するクエリは、何も返さずに終了するのではなく、UC_ABAC_CONTEXT_ATTRIBUTE_FUNCTIONS_DISABLED で失敗します。 ポリシー管理には影響がありません。 それでも、ポリシーをリストアップ、変更、削除は可能です。 機能を無効にする前に、コンテキスト属性ポリシーを削除または書き換えてください。
複数のフィルターとマスクのルール
特定のテーブルとユーザーに対してクエリ時に適用できる個別の行フィルターは 1 つだけです。 同様に、特定の列とユーザーに対して実行時に解決できる個別の列マスクは、列ごとに 1 つだけです。 これにより、あいまいな結果が回避されます。
複数の個別のフィルターまたはマスクが同じユーザーとテーブル (または列) に適用される場合、Azure Databricksはアクセスをブロックし、エラーを返します。 例えば次が挙げられます。
- テーブル レベルのフィルターまたはマスクは、ABAC ポリシーと競合します。 手動で適用された行フィルターまたは列マスクが既にあるテーブルまたは列は、同じターゲット上の ABAC 定義フィルターまたはマスクと競合します。
- 行フィルターの
USING COLUMNS句は、複数の列に一致するMATCH COLUMNSエイリアスを参照します。USING COLUMNS句は、UDF に列の値を渡します。MATCH COLUMNS句のUSING COLUMNSエイリアスが複数の列と一致する場合、エンジンは UDF に渡す列を判断できず、クエリはエラーで失敗します。 - マスクされた列は、別のポリシーの
USING COLUMNS句で参照されます。 あるポリシーによって列がマスクされている場合、別のポリシーのUSING COLUMNS句の入力引数として使用することはできません。
同じテーブルまたは列に対して複数の ABAC ポリシーを共存させることができます。その結果、有効なフィルターまたはマスクが同じになります。 たとえば、同じ引数を持つ同じ UDF を参照する 2 つのポリシーは、同じフィルターまたはマスクに解決され、競合しません。
ポリシーの競合のトラブルシューティング
Azure Databricksは、特定のユーザーのポリシー評価中に複数の個別のフィルターまたはマスクを検出すると、INVALID_PARAMETER_VALUE.UC_ABAC_MULTIPLE_ROW_FILTERS または COLUMN_MASKS_FEATURE_NOT_SUPPORTED.MULTIPLE_MASKS エラーをスローし、競合が解決されるまでテーブルへのアクセスをブロックします。
診断して解決するには:
-
SHOW EFFECTIVE POLICIESを使用して、テーブルに適用されるすべてのポリシーを表示します。 - 競合する可能性があるテーブル レベルの行フィルターまたは列マスクを特定するには、
INFORMATION_SCHEMA.ROW_FILTERSとINFORMATION_SCHEMA.COLUMN_MASKSを確認します。 -
TO/EXCEPTプリンシパルとWHEN/MATCH COLUMNS条件で重複するポリシーを確認します。 - 次の方法で解決します。
- ポリシー条件の絞り込み。
WHEN句またはMATCH COLUMNS句をより具体的に更新して、異なるポリシーが異なるテーブルまたは列を対象とするようにします。 - 管理タグの調整。 意図しないポリシーの一致をトリガーする列またはテーブルのタグ割り当てを確認し、それらを削除または更新します。
- 主要要素の調整。 各ユーザーがテーブル (行フィルターの場合) または列 (列マスクの場合) ごとに最大 1 つのポリシーでカバーされるように、
TO/EXCEPT句を更新します。 - ポリシーの再構築。 重複するポリシーを 1 つのポリシーに統合するか、広範なポリシーを個別の明示的に対象とするポリシーに分割します。
- ポリシー条件の絞り込み。
カラムマスクの自動型変換
Azure Databricksは、ABAC ポリシーから解決された列マスク関数の入力と出力の両方を自動的にキャストします。 入力列の値はマスク関数のパラメーター型に一致するようにキャストされ、関数の出力はターゲット列のデータ型に一致するようにキャストされます。 これにより、列をマスクするときの型の一貫性と信頼性の高いクエリ動作が保証されます。 自動キャストは次のように動作します。
- マスク関数の実行: ポリシー評価でマスクが適用されると判断されると、マスク関数は一致する列の値に対して実行されます。
- 自動型キャスト: Azure Databricksは、入力列の値を関数のパラメーター型に一致するようにキャストし、ターゲット列のデータ型に一致するように関数の出力をキャストします。
- 結果の返却値: 正しく型指定された結果が問い合わせに返されます。
入力または出力の種類に互換性がない場合、キャストは失敗し、クエリはランタイム エラーを返します。 キャストは、 CAST 操作 (完全な互換性の詳細) に関する ANSI SQL 標準に従います。Databricks Runtime 18.1 以降では、ABAC 列マスク ポリシーで構造体を VARIANTにキャストできますが、一般的な SQL ではサポートされていません。
マスク関数の戻り値の型がターゲット列と互換性があることを確認する必要があります。 列の種類をまたがる柔軟なマスクの例と VARIANT アプローチについては、 キャスト互換 のマスク関数を参照してください。