このページでは、次のような 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 で保護されたテーブルにアクセスしようとすると、保護されていないデータの公開を防ぐために、クエリは閉じられ (アクセスが拒否されます) 失敗します。
dedicated アクセス モードでは、Azure Databricksはサーバーレス コンピューティングに適用を委任して、きめ細かなアクセス制御が適用されることを保証します。 古いランタイムのユーザーがこれらのテーブルにアクセスできるようにするには、ポリシーから明示的に除外する必要があります。
保護されたデータに対するサポートされていない操作
特定の操作は、行フィルターまたは列マスクと互換性がありません。 これらの操作は、適用の回避ではなく失敗します。 それらを実行するには、テーブルに適用されるすべての ABAC ポリシーの EXCEPT 句にプリンシパルを一覧表示する必要があります。 除外プリンシパルはポリシーの対象ではないため、Azure Databricksは適用する必要がないため、操作を安全に許可できます。
実行プリンシパルを除外する必要がある操作には、パイプラインの更新、バックアップ プロセス、および次のような管理ワークフローが含まれます。
- 16.4 より前の Databricks Runtime バージョンを実行しているコンピューティングから ABAC で保護されたテーブルにアクセスする
- タイム トラベル クエリ
- 深い複製および浅い複製
- 差分共有。共有所有者はポリシーから除外され、必要な 差分共有アクセス許可を持っている必要があります。 このポリシーは受信者のアクセス権を管理しないことに注意してください。
- ベクター検索インデックスの作成と同期
これらの制限とその他の制限の詳細については、 ABAC の要件、クォータ、制限事項に関するページを参照してください。
ポリシーの依存関係を削除しました
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 を参照するようにポリシーを更新します。
複数のフィルターとマスクのルール
特定のテーブルとユーザーに対してクエリ時に適用できる個別の行フィルターは 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 アプローチについては、 キャスト互換 のマスク関数を参照してください。