属性ベースのアクセス制御 (ABAC) ポリシーの作成と管理
ベータ版
この機能は ベータ版です。
このページでは、Unity Catalog で行フィルターと列マスクのポリシーを構成する方法について説明します。詳細については、 属性ベースのアクセス制御 (ABAC) とポリシーについては、 属性ベースのアクセス制御 (ABAC)Unity Catalogを参照してください。オブジェクトにタグを適用するには、「 管理タグ」 および「 Unity Catalog セキュリティ保護可能なオブジェクトにタグを適用する」を参照してください。
ABACを有効にする
ABAC ベータ版は、ワークスペース レベルで有効になります。Databricks は、共有カタログにアクセスする各ワークスペースでも ABAC が有効になっていない限り、共有カタログへの読み取り操作に ABAC を適用できません。
ABAC ベータ版を有効にするには、次の手順を実行します。
- ワークスペース管理者として、Databricks ワークスペースの上部バーでユーザー名をクリックします。
- メニューから「 プレビュー 」を選択します。
- 「属性ベースのアクセス制御 」トグルを 「オン」 に設定します。
コンピュートの要件
ABAC ポリシーを使用するには、次のコンピュート構成のいずれかを使用する必要があります。
- サーバーレスコンピュート
- Databricks Runtime 16.4 以降の標準コンピューティング
- 専用コンピューティングDatabricks Runtime 16.4 以降(詳細なアクセス制御フィルタリングが有効)
古いランタイムを実行している標準および専用のコンピュートは、ABAC によって保護されたテーブルにアクセスできません。 一時的な回避策として、特定のグループにのみ適用するように ABAC を設定できます。そのグループに制限したいユーザーを追加します。グループに属していないユーザーでもテーブルにアクセスできます。
ポリシーの割り当て
以下に、さまざまなセキュリティ保護可能なオブジェクトに作成できる ABAC ポリシーの数を示します。
- カタログ : カタログごとに 15 ポリシー
- スキーマ : スキーマあたり15個のポリシー
- 表 : 表ごとに 5 つのポリシー
オブジェクトに対するポリシーの作成
行フィルターまたは列マスクポリシーを作成するには、次のものが必要です。
- ワークスペースで ABAC ベータ版が有効になりました。「ABAC を有効にする」を参照してください。
- 適用する行フィルターまたは列マスク ロジックを実装する既存の ユーザー定義関数 (UDF)。
 ベスト プラクティス、制限事項、および UDF の例については、 「ABAC ポリシーの UDF のベスト プラクティス」を参照してください。
- MANAGEオブジェクトまたはオブジェクトの所有権について。
コンピュートの要件
- Databricks Runtime 16.4 以降またはサーバレス コンピュートでコンピュートを使用する必要があります。
古いランタイムを実行しているコンピュートは、ABAC によって保護されたテーブルにアクセスできません。 一時的な回避策として、特定のグループにのみ適用されるように ABAC を設定できます。そのグループに制限するユーザーを追加します。グループに属さないユーザーでも、テーブルにアクセスできます。
- Catalog Explorer
- SQL
- 
Databricks ワークスペースで、 カタログ をクリックします。 
- 
ポリシーのスコープを決定するオブジェクト (カタログ、スキーマ、テーブルなど) を選択します。 
- 
[ ポリシー ] タブをクリックします。 
- 
[新しいポリシー ] をクリックします。 
- 
[全般] に、ポリシーの名前と説明を入力します。 
- 
プリンシパル では: - [ 適用先] で、ポリシーが管理するプリンシパルを検索して選択します。
- [除外] で、ポリシーから除外するプリンシパルを検索して選択します。たとえば、ポリシーが適用されるグループに属するユーザーを除外できます。
  
- 
「タイプとターゲット 」で、次の操作を行います。 - [ポリシーの種類 ] で、[ 行フィルター ] または [列マスク ] を選択します。
- [ポリシー ターゲット ] で、ポリシーの範囲を選択します。これは、カタログ全体やスキーマなどの広範なスコープにすることも、その中の特定のテーブルや列などのより狭いスコープにすることもできます。
- [テーブル レベルの条件 ] で、このポリシーを適用するテーブルに一致する条件を指定します。たとえば、 hasTag("tag")やhasTagValue("tag", "value")などです。
 
- 
[関数] で、このポリシーで使用する関数を選択し、必要なパラメーターを入力します。  
- 
「 ポリシーの作成 」をクリックします。 
ポリシーを作成するための一般的な構文を次に示します。
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が定義されている場合、テーブル内の少なくとも 1 つの列が 3 つの条件すべてを満たす場合にのみ、ポリシーが有効になります。ポリシーのMATCH COLUMNS句には最大 3 つの列条件を含めることができます。
テーブル レベルの条件 ( 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 つの列のみに一致するようにします。たとえば、複数の条件を組み合わせて一致を絞り込むことができます。
- 
管理タグを調整する : どの列にポリシーをトリガーする管理タグがあるかを確認します。 行フィルターにこれらのタグを含めない場合は、削除または変更してください。 
- 
ポリシーを再構築する : 複数の列に一致する可能性のある条件に頼るのではなく、明示的に列をターゲットにした個別のポリシーを作成することを検討してください。これにより、行フィルターをトリガーする列をより詳細に制御できるようになります。