ABAC ポリシーの作成と管理

このページでは、Unity カタログで ABAC ポリシーを作成、編集、表示、削除する方法について説明します。 ポリシーの概念の概要については、 ABAC のコア概念を参照してください。

必要条件

すべてのポリシー操作 (作成、編集、削除、表示、説明) には、セキュリティ保護可能な所有権またはオブジェクトの所有権に対する MANAGE が必要です。 ポリシーを作成するには、次のものが必要です。

  • Databricks Runtime 16.4 以降、またはサーバーレス コンピューティング。 コンピューティング 要件を参照してください。
  • フィルター処理またはマスク ロジックの場合、 EXECUTE されている Unity カタログ内のユーザー定義関数 (UDF)、またはポリシーの作成時にインラインで定義する SQL 関数。
  • ターゲット オブジェクトに適用される管理タグ。 管理タグを参照してください。

ポリシーを作成する

ポリシーは、カタログ エクスプローラー UI、CREATE POLICY SQL ステートメント、または Azure Databricks REST API、SDK、Terraform を使用して作成できます。

ポリシーを作成するには、ポリシーがアタッチされているセキュリティ保護可能なリソース (カタログ、スキーマ、またはテーブル) に MANAGE するか、セキュリティ保護可能なリソースを所有し、フィルター処理またはマスク ロジックを実装する UDF に EXECUTE する必要があります。

カタログ エクスプローラー

  1. Azure Databricks ワークスペースで、Data icon.Catalog をクリックします。

  2. カタログ、スキーマ、テーブルなど、ポリシー スコープを決定するオブジェクトを選択します。

  3. [ポリシー] タブをクリックします。

  4. [新しいポリシー] をクリックします。

  5. ポリシーの識別 セクションに入力してください。 次の表は、各フィールドをまとめたものです。

    フィールド 説明
    氏名 ポリシーの名前。 同じセキュリティ保護可能なリソースに対して定義されているすべてのポリシーで一意である必要があります。 hide_eu_customersmask_ssn
    説明 任意。 ポリシーの説明。 監査ログに表示され、管理者がポリシーの意図を理解するのに役立ちます。 Restrict EU customer rows from US analystsMask SSN for all account users
  6. プリンシパルとスコープセクションを完成させてください。 次の表は、各フィールドをまとめたものです。

    フィールド 説明
    適用:... ポリシーの対象となるユーザー、グループ、またはサービス プリンシパル。 これらのプリンシパルがスコープ内のテーブルにクエリを実行すると、行フィルターまたは列マスクが適用されます。 アカウント内のすべてのプリンシパルにポリシーを適用するには、 All account usersを選択します。 us_analystsAll account users
    除く プリンシパルはポリシーから除外されます。 除外プリンシパルは、フィルター処理やマスクの対象ではなく、変更されていない完全なデータを表示します。 adminscompliance_team
    スコープ ポリシーがアタッチされているセキュリティ可能なリソース。 ポリシーは、選択したスコープ内のすべてのテーブルに対して評価されます。 カタログ、スキーマ、またはテーブルを選択します。 Azure Databricksでは、適用可能なレベルでポリシーをアタッチすることをお勧めします。 カタログ prodを選択し、スキーマ customersを選択します。
    テーブルの条件 ポリシーが適用されるスコープ内のテーブルを決定します。 条件なし: スコープ内のすべてのテーブルにポリシーを適用します。 これらのタグのいずれかに一致するテーブル: 指定されたタグ キーまたはタグ キーと値のペアのリストにポリシーを適用します。 これらのテーブルのいずれかがポリシーと一致します。 カスタム式に一致するテーブル: has_taghas_tag_valueを使用してブール式を作成し、 ANDOR、および NOT と組み合わせて、より複雑な一致ロジックを作成できます。 式が TRUE に評価され、ポリシーと一致するテーブルにポリシーを適用します。 スコープ内のテーブルが条件と一致しない場合、ポリシーはそのテーブルには適用されません。 これらのタグのいずれかに一致するテーブルを選択し、値sensitivityを持つタグ キー highを選択して、ポリシーを機密テーブルのみに制限します。

    [プリンシパルとスコープ] セクションの ABAC ポリシー設定の例。

  7. [ポリシーの種類] で、適用するアクセス制御の種類を選択します。

    オプション 説明 次の場合に使用します。
    行フィルター 行フィルター ポリシーを作成します。 UDF は各行を評価し、ブール値を返します。 UDF が FALSE を返す行は、クエリ結果から除外されます。 アクセスは、地理的リージョンを含む列の値によるフィルター処理など、各行の値によって異なります。
    列マスク 列マスク ポリシーを作成します。 UDF は列の値を入力として受け取り、元のバージョンまたはマスクされたバージョンを返します。 戻り値の型は、ターゲット列のデータ型にキャスト可能である必要があります。 プリンシパルがテーブルのクエリを実行できるようにしながら、SSN、電話番号、メール アドレスなどの機密フィールドを編集する必要があります。
  8. 次のいくつかのセクションは、 ポリシーの種類 の選択によって異なります。 選択内容に一致するセクションを展開します。

    行フィルター

    [ 行フィルター関数 ] セクションで、行フィルター関数を指定する方法を選択します。

    • 既存のものを選択: Unity カタログで既に定義されている UDF を選択します。 UDF は各行を評価し、ブール値を返します。 関数が FALSE を返す行は、クエリ結果から除外されます。 UDF に EXECUTE が必要です。
    • 作成: 行フィルター ロジックとして使用する SQL 関数を定義します。

    行フィルター関数セクションの ABAC 行フィルター ポリシー設定の例。

    [ 関数の入力 ] セクションで、各関数パラメーターの値を指定します。 各入力には、タグで一致する列、カスタム式で一致する列、または定数値を指定できます。

    関数入力セクションの ABAC 設定の例。

    列マスク

    [ 列の条件 ] セクションで、マスクする列を識別する方法を選択します。

    • これらのタグのいずれかに一致する列: タグ キーまたはタグ キーと値のペアの一覧を指定します。 これらの列のいずれかが含まれる列は、ポリシーによってマスクされます。
    • カスタム式に一致する列: has_taghas_tag_valueを使用してブール式を作成し、 ANDORNOT と組み合わせて、より複雑な一致ロジックを作成します。 式が TRUE に評価される列はマスクされます。

    [列条件] セクションの ABAC 列マスク ポリシー設定の例。

    次に、一致する列に適用する マスク関数 を選択します。

    • 既存のものを選択: Unity カタログで既に定義されている UDF を選択します。 UDF は、元の値またはマスクされた値を返します。 戻り値の型は、ターゲット列のデータ型にキャスト可能である必要があります。 UDF に EXECUTE が必要です。
    • 作成: 列マスク ロジックとして使用する SQL 関数を定義します。

    マスク関数セクションの ABAC 列マスク ポリシー設定の例。

    [ 関数の入力 ] セクションで、追加の関数パラメーターごとに値を指定します。 各入力には、タグで一致する列、カスタム式で一致する列、または定数値を指定できます。

    この例では、 4 の定数値を使用して、SSN の最後の 4 文字を表示します。

    関数入力セクションの ABAC 列マスク ポリシー設定の例。

  9. [ ポリシーの作成] をクリックします。

SQL

完全なドキュメントについては、 CREATE POLICY を参照してください。

CREATE [OR REPLACE] POLICY policy_name
ON { CATALOG catalog_name | SCHEMA schema_name | TABLE table_name }
[COMMENT description]
{ row_filter_body | column_mask_body }

行フィルター本文:

ROW FILTER function_name
TO principal [, ...]
[EXCEPT principal [, ...]]
FOR TABLES
[WHEN condition]
[MATCH COLUMNS condition [[AS] alias] [, ...]]
[USING COLUMNS (function_arg [, ...])]

列マスク本体:

COLUMN MASK function_name
TO principal [, ...]
[EXCEPT principal [, ...]]
FOR TABLES
[WHEN condition]
[MATCH COLUMNS condition [[AS] alias] [, ...]]
ON COLUMN alias
[USING COLUMNS (function_arg [, ...])]

Parameters:

  • policy_name: ポリシーの名前。 同じセキュリティ保護可能なリソースに対して定義されているすべてのポリシーで一意である必要があります。
  • ON { CATALOG | SCHEMA | TABLE }: ポリシーがアタッチされているスコープ。 ポリシーは、このセキュリティオブジェクトの子孫であるすべてのテーブルに対して評価されます。
  • function_name: フィルター処理またはマスク ロジックを実装する UDF の完全修飾名。
  • TO principal [, ...]: ポリシーが適用されるユーザー、グループ、またはサービス プリンシパル。
  • EXCEPT principal [, ...]: プリンシパルはポリシーから除外されます。 除外プリンシパルは、フィルター処理やマスクの対象になりません。
  • FOR TABLES: ポリシーがテーブルを対象とすることを指定します。 現在、テーブルは、サポートされている唯一のセキュリティ保護可能な種類であり、ストリーミング テーブルと具体化されたビューが含まれます。
  • WHEN condition:タグに基づいてポリシーが適用されるテーブルを決定するブール式。 組み込みの関数 has_tag('tag_name')has_tag_value('tag_name', 'tag_value')を使用します。 省略した場合、既定値は TRUE (スコープ内のすべてのテーブルに適用されます)。
  • MATCH COLUMNS condition [[AS] alias] [, ...]: ポリシーが対象とする列を識別する列条件。 各条件は、 has_tag('tag_name')has_tag_value('tag_name', 'tag_value')から構築されたブール式であり、必要に応じて、 ANDOR、および NOTと組み合わされます。 各条件には、 ON COLUMN および USING COLUMNSで使用するエイリアスを割り当てることができます。 ポリシーには最大 3 つの MATCH COLUMNS 式を含めることができます。ポリシーを適用するには、すべて一致する必要があります。
  • ON COLUMN alias: 列マスク ポリシーの場合は、マスクする一致する列を指定し、そのエイリアスによって MATCH COLUMNSから参照されます。
  • USING COLUMNS (function_arg [, ...]): UDF に渡される引数。 各引数には、 MATCH COLUMNS のエイリアスまたは定数リテラルを指定できます。

例: 列マスク ポリシー。 pii:ssn スキーマ内のprod.customersでタグ付けされたすべての列をマスクし、最後の 4 文字のみを表示します。 ポリシーは、us_analystsを除くadminsに適用されます。

CREATE FUNCTION ssn_to_last_nr (ssn STRING, nr INT) RETURNS STRING
  RETURN right(ssn, nr);

CREATE POLICY mask_ssn
ON SCHEMA prod.customers
COLUMN MASK ssn_to_last_nr
TO us_analysts EXCEPT admins
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn
ON COLUMN ssn
USING COLUMNS (4);

例: 行フィルター ポリシー。 sensitivity:high スキーマのprod.customersでタグ付けされたテーブルから、ヨーロッパのお客様の行を除外します。 このポリシーは us_analysts に適用され、 geo_region 列に基づいて行がフィルター処理されます。

CREATE FUNCTION non_eu_region (geo_region STRING) RETURNS BOOLEAN
  RETURN geo_region <> 'eu';

CREATE POLICY hide_eu_customers
ON SCHEMA prod.customers
COMMENT 'Exclude rows with European customers from sensitive tables'
ROW FILTER non_eu_region
TO us_analysts
FOR TABLES
WHEN has_tag_value('sensitivity', 'high')
MATCH COLUMNS has_tag('geo_region') AS region
USING COLUMNS (region);

Python SDK

完全なドキュメントについては、Databricks SDK for Python ドキュメントを参照してください。

この例では、米国ベースのアナリスト向けにヨーロッパのお客様の行を除外する行フィルター ポリシーを作成します。

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.catalog import (
    FunctionArgument,
    MatchColumn,
    PolicyInfo,
    PolicyType,
    RowFilterOptions,
    SecurableType,
)

w = WorkspaceClient()

w.policies.create_policy(PolicyInfo(
    name="hide_eu_customers",
    comment="Exclude rows with European customers from sensitive tables",
    on_securable_type=SecurableType.SCHEMA,
    on_securable_fullname="prod.customers",
    for_securable_type=SecurableType.TABLE,
    policy_type=PolicyType.POLICY_TYPE_ROW_FILTER,
    to_principals=["us_analysts"],
    match_columns=[
        MatchColumn(condition="has_tag('geo_region')", alias="region"),
    ],
    row_filter=RowFilterOptions(
        function_name="prod.customers.non_eu_region",
        using=[FunctionArgument(alias="region")],
    ),
))

次の例では、 admins グループ内のものを除き、米国のアナリストの社会保障番号をマスクする列マスク ポリシーを作成します。

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.catalog import (
    ColumnMaskOptions,
    FunctionArgument,
    MatchColumn,
    PolicyInfo,
    PolicyType,
    SecurableType,
)

w = WorkspaceClient()

w.policies.create_policy(PolicyInfo(
    name="mask_ssn",
    comment="Mask social security numbers",
    on_securable_type=SecurableType.SCHEMA,
    on_securable_fullname="prod.customers",
    for_securable_type=SecurableType.TABLE,
    policy_type=PolicyType.POLICY_TYPE_COLUMN_MASK,
    to_principals=["us_analysts"],
    except_principals=["admins"],
    match_columns=[
        MatchColumn(condition="has_tag_value('pii', 'ssn')", alias="ssn"),
    ],
    column_mask=ColumnMaskOptions(
        function_name="prod.customers.ssn_to_last_nr",
        on_column="ssn",
        using=[FunctionArgument(constant="4")],
    ),
))

ポリシーを編集する

カタログ エクスプローラー

  1. Azure Databricks ワークスペースで、Data icon.Catalog をクリックします。
  2. ポリシーがアタッチされているオブジェクトを選択します。
  3. [ポリシー] タブをクリックします。
  4. 編集するポリシーを選択します。
  5. 変更するフィールドを更新します。 説明、プリンシパル、ポリシーの種類、条件、および関数の入力マッピングを変更できます。 ポリシー名と、ポリシーが適用されているセキュリティ保護可能なオブジェクトは編集できません。 フィールドの説明については、「 ポリシーの作成」を参照してください。
  6. [ポリシーの更新] をクリックします。

SQL

CREATE OR REPLACE POLICY は、ポリシー定義全体を置き換えます。 変更するフィールドだけでなく、すべての句を指定します。 置換ポリシーは、同じ名前で、同じセキュラブルにある必要があります。

CREATE OR REPLACE POLICY mask_ssn
ON SCHEMA prod.customers
COLUMN MASK ssn_to_last_nr
TO us_analysts EXCEPT admins, compliance_team
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn
ON COLUMN ssn
USING COLUMNS (4);

Python SDK

SQL の CREATE OR REPLACE POLICY とは異なり、 update_policy では部分的な更新がサポートされます。 update_mask パラメーターを使用して、変更するフィールドを指定します。 これらのフィールドのみが更新されます。 update_mask"*"または空の場合、policy_info内のすべてのフィールドが適用されます。

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.catalog import PolicyInfo

w = WorkspaceClient()

w.policies.update_policy(
    on_securable_type="SCHEMA",
    on_securable_fullname="prod.customers",
    name="mask_ssn",
    policy_info=PolicyInfo(
        except_principals=["admins", "compliance_team"],
    ),
    update_mask="except_principals",
)

ポリシーを削除する

カタログ エクスプローラー

  1. Azure Databricks ワークスペースで、Data icon.Catalog をクリックします。
  2. ポリシーがアタッチされているオブジェクトを選択します。
  3. [ポリシー] タブをクリックします。
  4. ポリシーを選択します。
  5. [ ポリシーの削除] をクリックします。

SQL

DROP POLICYを使用してポリシーを削除します。

DROP POLICY policy_name ON { CATALOG | SCHEMA | TABLE } securable_name

例:

DROP POLICY mask_ssn ON SCHEMA prod.customers;
DROP POLICY hide_eu_customers ON SCHEMA prod.customers;

Python SDK

from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

w.policies.delete_policy(
    on_securable_type="SCHEMA",
    on_securable_fullname="prod.customers",
    name="mask_ssn",
)

ポリシーを表示する

SHOW POLICIESを使用して、セキュリティ保護可能なリソースに定義されているポリシーを一覧表示します。 SHOW EFFECTIVE POLICIESを使用して、テーブルに影響を与えるカタログ レベルのポリシーなど、親スコープのポリシーも含めます。

SHOW [EFFECTIVE] POLICIES ON { CATALOG | SCHEMA | TABLE } securable_name

結果には、ポリシー名、ポリシーの種類、および各ポリシーが定義されているカタログ、スキーマ、またはテーブルが含まれます。

テーブルの有効なポリシーを表示するには、親カタログまたはスキーマに対するアクセス許可は必要ありません。 これにより、テーブル管理者は、兄弟テーブルのポリシーへの読み取りアクセス権を持たずに適用されるルールを表示できます。

例:

SHOW EFFECTIVE POLICIES ON SCHEMA prod.customers;
ポリシー名 ポリシー タイプ カタログ スキーマ コメント
非表示_EU顧客 ROW FILTER prod 顧客
mask_ssn COLUMN マスク prod 顧客

ポリシーについて説明する

DESCRIBE POLICYを使用して、特定のポリシーの詳細を表示します。 ターゲットのセキュリティ保護可能なオブジェクトや所有権に対して MANAGE が必要です。

{ DESC | DESCRIBE } POLICY policy_name ON { CATALOG | SCHEMA | TABLE } securable_name

結果には、名前、セキュリティ保護可能な型、セキュリティ保護可能な名前、プリンシパル、条件、関数名、タイムスタンプなど、ポリシーのプロパティがキーと値のペアとして表示されます。

例:

DESCRIBE POLICY hide_eu_customers ON SCHEMA prod.customers;
info_name info_value
名前 非表示_EU顧客
セキュリティ保護可能な種類 SCHEMA
セキュリティ設定可能 prod.customers (プロダクトの顧客)
プリンシパルへ us_analysts
セキュリティ保護のタイプの場合 TABLE
列を対応させる has_tag('geo_region') AS リージョン
ポリシー タイプ 行フィルター
関数名 prod.customers.non_eu_region
列の使用 リージョン

監査ログ記録

Azure Databricks は、管理タグと ABAC ポリシー操作を監査ログシステムテーブルに記録します。 クエリの例を次に示します。 詳細については、「監査ログ」を参照してください。

-- All tag assignment and deletion events from the audit log
SELECT
  event_time,
  action_name,
  user_identity.email AS actor,
  request_params.workspace_id,
  request_params.metastore_id,
  request_params.tag_assignment,
  response.status_code,
  source_ip_address
FROM system.access.audit
WHERE service_name = 'unityCatalog'
  AND action_name IN (
    'createEntityTagAssignment',
    'deleteEntityTagAssignment'
  )
ORDER BY event_time DESC;

-- All ABAC policy CRUD operations
SELECT
  event_time,
  action_name,
  user_identity.email AS actor,
  request_params.name AS policy_name,
  request_params.on_securable_type,
  request_params.on_securable_fullname,
  request_params.policy_info,
  response.status_code
FROM system.access.audit
WHERE service_name = 'unityCatalog'
  AND action_name IN ('createPolicy', 'deletePolicy', 'getPolicy', 'listPolicies')
ORDER BY event_time DESC;

詳細情報