属性ベースのアクセス制御 (ABAC) ポリシーの作成と管理
プレビュー
この機能は パブリック プレビュー段階です。
このページでは、Unity Catalog で行フィルターと列マスクのポリシーを構成する方法について説明します。詳細については、 属性ベースのアクセス制御 (ABAC) とポリシーについては、 属性ベースのアクセス制御 (ABAC)Unity Catalogを参照してください。オブジェクトにタグを適用するには、「 管理タグ」 および「 Unity Catalog セキュリティ保護可能なオブジェクトにタグを適用する」を参照してください。
コンピュートの要件
ABAC ポリシーを使用するには、次のコンピュート構成のいずれかを使用する必要があります。
- サーバーレスコンピュート
- Databricks Runtime 16.4 以降の標準コンピューティング
- 専用コンピューティングDatabricks Runtime 16.4 以降(詳細なアクセス制御フィルタリングが有効)
古いランタイムを実行している標準および専用のコンピュートは、ABAC によって保護されたテーブルにアクセスできません。 一時的な回避策として、特定のグループにのみ適用するように ABAC を設定できます。そのグループに制限したいユーザーを追加します。グループに属していないユーザーでもテーブルにアクセスできます。
ポリシーの割り当て
以下に、さまざまなセキュリティ保護可能なオブジェクトに作成できる ABAC ポリシーの数を示します。
- カタログ : カタログごとに 10 ポリシー
- スキーマ : スキーマごとに 10 個のポリシー
- 表 : 表ごとに 5 つのポリシー
オブジェクトに対するポリシーの作成
行フィルターまたは列マスクポリシーを作成するには、次のものが必要です。
- 適用する行フィルターまたは列マスクのロジックを実装する、
EXECUTE権限を持つUnity Catalog内の既存の ユーザー定義関数 ( UDF ) 。
ベスト プラクティス、制限事項、および UDF の例については、 「ABAC ポリシーの UDF のベスト プラクティス」を参照してください。 MANAGEオブジェクトまたはオブジェクトの所有権について。
コンピュートの要件
- Databricks Runtime 16.4 以降またはサーバレス コンピュートでコンピュートを使用する必要があります。
古いランタイムを実行しているコンピュートは、ABAC によって保護されたテーブルにアクセスできません。 一時的な回避策として、特定のグループにのみ適用されるように ABAC を設定できます。そのグループに制限するユーザーを追加します。グループに属さないユーザーでも、テーブルにアクセスできます。
- Catalog Explorer
- SQL
-
Databricks ワークスペースで、
カタログ をクリックします。
-
ポリシーのスコープを決定するオブジェクト (カタログ、スキーマ、テーブルなど) を選択します。
-
[ ポリシー ] タブをクリックします。
-
[新しいポリシー ] をクリックします。
-
一般的 に :
- [名前] に、ポリシーの名前を入力します。
- [説明] に、ポリシーの説明を入力します。
- [適用先...] では、ポリシーを適用するプリンシパルを検索して選択します。
- [Except for...] では、ポリシーから除外するプリンシパルを追加します。
- [スコープ] では、ポリシーを適用するカタログ、スキーマ、およびテーブルを選択します。

-
目的 については、列をマスクするか行を非表示にするかを選択します。
-
[条件] セクションと [関数パラメーター] セクションで、ポリシーで列をマスクしたり行を非表示にしたりする方法を構成します。 これを行うには、マスク関数と、その関数を適用する条件を指定します。


-
「 ポリシーの作成 」をクリックします。
ポリシーを作成するための一般的な構文を次に示します。
CREATE POLICY <policy_name>
ON <securable_type> <securable_name>
COMMENT '<policy_description>'
-- One of the following:
ROW FILTER <udf_name>
| COLUMN MASK <udf_name> ON COLUMN <target_column>
TO `<principal_name>`[, `<principal_name>`, ...]
[EXCEPT `<principal_name>`[, `<principal_name>`, ...]]
FOR TABLES
[WHEN hasTag('<key>') OR hasTagValue('<key>', '<value>')]
MATCH COLUMNS hasTag('<key>') OR hasTagValue('<key>', '<value>') AS <alias>
USING COLUMNS <alias>[, <alias>, ...];
テーブル レベルの条件 ( MATCH COLUMNS ) を定義すると、すべての条件が少なくとも 1 つの列に一致する場合にのみ、ポリシーがテーブルに適用されます。条件がテーブル内のどの列にも一致しない場合、ポリシーはテーブルに適用されず、Databricks は行フィルタリングや列マスクをスキップします。
たとえば、ポリシーでMATCH COLUMNS condition1, condition2, condition3が定義されている場合、3 つの条件のそれぞれがテーブル内の少なくとも 1 つの列と一致する場合にのみ、ポリシーが有効になります。
ポリシーのMATCH COLUMNS句には最大 3 つの列条件を含めることができます。
この例では、米国を拠点とするアナリストによるクエリからヨーロッパの顧客の行を除外する行フィルタポリシーを定義しています。
CREATE POLICY hide_eu_customers
ON SCHEMA prod.customers
COMMENT 'Hide rows with European customers from sensitive tables'
ROW FILTER non_eu_region
TO `us_analysts`
FOR TABLES
MATCH COLUMNS
hasTag('geo_region') AS region
USING COLUMNS (region);
この例では、米国のアナリストから社会保障番号を非表示にする列マスク ポリシーを定義します ( admins グループ内のアナリストを除く)。
CREATE POLICY mask_SSN
ON SCHEMA prod.customers
COMMENT 'Mask social security numbers'
COLUMN MASK mask_SSN
TO `us_analysts`
EXCEPT `admins`
FOR TABLES
MATCH COLUMNS
hasTagValue('pii', 'ssn') AS ssn
ON COLUMN ssn;
タグデータはプレーンテキストとして保存され、グローバルに複製できます。リソースのセキュリティを損なう可能性のあるタグ名、値、または記述子は使用しないでください。たとえば、個人情報や機密情報を含むタグ名、値、または記述子は使用しないでください。
ポリシーの編集
必要な権限: オブジェクトまたはオブジェクトの所有者に対する MANAGE 。
- Catalog Explorer
- SQL
- Databricks ワークスペースで、
カタログ をクリックします。
- ポリシーのスコープを決定するオブジェクト (カタログ、スキーマ、テーブルなど) を選択します。
- [ ポリシー ] タブをクリックします。
- ポリシーを選択し、編集します。
- [ ポリシーの更新 ] をクリックします。
CREATE OR REPLACE POLICY <policy_name>
ON <securable_type> <securable_name>
COMMENT '<policy_description>'
-- One of the following:
ROW FILTER <udf_name>
| COLUMN MASK <udf_name> ON COLUMN <target_column>
TO `<principal_name>`[, `<principal_name>`, ...]
[EXCEPT `<principal_name>`[, `<principal_name>`, ...]]
FOR TABLES
[WHEN hasTag('<key>') OR hasTagValue('<key>', '<value>')]
MATCH COLUMNS hasTag('<key>') OR hasTagValue('<key>', '<value>') AS <alias>
USING COLUMNS <alias>[, <alias>, ...];
ポリシーを削除する
必要な権限: オブジェクトまたはオブジェクトの所有者に対する MANAGE 。
- Catalog Explorer
- SQL
- Databricks ワークスペースで、
カタログ をクリックします。
- ポリシーのスコープを決定するオブジェクト (カタログ、スキーマ、テーブルなど) を選択します。
- [ ポリシー ] タブをクリックします。
- ポリシーを選択します。
- [ ポリシーの削除 ] をクリックします。
DROP POLICY <policy_name> ON <securable_type> <securable_name>
複数のフィルターまたはマスクのトラブルシューティング
ABAC では、テーブルごとに 1 つの行フィルターと列ごとに 1 つの列マスクの制限が適用されます。これにより、複数のフィルターやマスクが相互作用した場合に不明確な結果が発生するのを防ぎます。
Databricks は、ポリシー評価中に複数のフィルターまたはマスクを検出すると、 INVALID_PARAMETER_VALUE.UC_ABAC_MULTIPLE_ROW_FILTERSまたはCOLUMN_MASKS_FEATURE_NOT_SUPPORTED.MULTIPLE_MASKSエラーをスローします。この動作は仕様によるもので、競合が解決されるまでテーブルへのアクセスをブロックします。
複数の行のフィルタまたはマスクがどのように発生するかを理解する
複数のフィルターまたはマスクは、いくつかの方法で発生する可能性があります。
-
単一のポリシーで複数のフィルターまたはマスクが生成されます。
これは、複数の列がポリシー条件に一致する場合に発生する可能性があります。たとえば、次のポリシーは、region=EMEAタグが付けられた列に基づいて行フィルターを定義します。SQLCREATE OR REPLACE POLICY region_filter_policy
ON TABLE my_catalog.my_schema.customer_data
ROW FILTER my_catalog.my_schema.filter_by_region
TO `account users`
FOR TABLES
MATCH COLUMNS
hasTagValue('region', 'EMEA') AS region_cols
USING COLUMNS (region_cols);customer_dataテーブルにregion=EMEAタグが付けられた列が複数ある場合、この単一のポリシーによって、一致する列ごとに 1 つの行フィルターが生成されます。Databricks がポリシーを評価すると、複数の行フィルターが検出され、エラーがスローされます。 -
複数のポリシーが同じテーブルまたは列にフィルターまたはマスクを定義します。複数の ABAC ポリシーが同じテーブルまたは列に適用される場合、Databricks は複数の有効なフィルターまたはマスクを検出します。
-
テーブルまたは列には、フィルターまたはマスクが手動で既に適用されています。テーブルまたは列に、手動で適用された (ABAC 以外の) 行フィルターまたは列マスクと、1 つ以上の ABAC 定義のフィルターまたはマスクの両方が含まれている場合にも、競合が発生する可能性があります。
エラーを解決する方法
複数行フィルターのエラーは、次のいずれかの方法で解決できます。
-
ポリシーの列の一致を調整します 。
MATCH COLUMNS句をより具体的に更新し、1 つの列のみに一致するようにします。たとえば、複数の条件を組み合わせて一致を絞り込むことができます。 -
管理タグを調整する : どの列にポリシーをトリガーする管理タグがあるかを確認します。 行フィルターにこれらのタグを含めない場合は、削除または変更してください。
-
ポリシーを再構築する : 複数の列に一致する可能性のある条件に頼るのではなく、明示的に列をターゲットにした個別のポリシーを作成することを検討してください。これにより、行フィルターをトリガーする列をより詳細に制御できるようになります。