Databricksの属性ベースのアクセス制御(ABAC)

こちらのアップデートです。

https://docs.databricks.com/aws/ja/release-notes/product/2025/june#attribute-based-access-control-abac-in-unity-catalog-is-in-beta

> **Unity Catalogの属性ベースのアクセス制御(ABAC)がベータになりました**
> Databricksでは、Unity Catalogで属性ベースのアクセス制御(ABAC)をサポートし、カタログ、スキーマ、テーブルに対して動的でタグに基づくアクセスポリシーを可能にしました。ABACでは、機密性、リージョン、ビジネスドメインのようなデータの属性に基づいたきめ細かいアクセス制御を強制するために、タグとユーザー定義関数(UDF)を使用します。
>
> ABACを用いることで、スケーラブルなポリシーを一度定義して、膨大なデータ資産セットに対して適用することができます。ポリシーはオブジェクトの階層構造を継承し、行レベルフィルターや列マスキングのロジックを含めることができます。これによって、ガバナンスをシンプルにし、ポリシー管理を集中化し、セキュリティ体制を改善します。[Unity Catalogの属性ベースのアクセス管理(ABAC)](https://docs.databricks.com/aws/ja/data-governance/unity-catalog/abac/)をご覧ください。

1年待ちましたがついに。

https://qiita.com/taka_yayoi/items/011f213d7de8e9f4c17b#unity-catalog

:::note info
**注意**
執筆時点では[ベータ版](https://docs.databricks.com/aws/ja/release-notes/release-types)です。
:::

# ABACとは

**ABAC(Attribute-Based Access Control)** は、Databricksが提供する新たなデータガバナンス機能です。従来のように「このユーザーにはこのテーブルの権限を与える」というロールベースの個別管理ではなく、データに付けたタグに基づいて自動的にアクセス制御を行う仕組みです。

## ABACの基本構造

```
┌─────────────────────────────────────────────────────────┐
│                    ABAC システム                          │
├─────────────────────────────────────────────────────────┤
│  1. 管理タグ（データの属性）                                │
│     ├─ 機密レベル: high, medium, low                      │
│     ├─ 地域: EMEA, APAC, Americas                        │
│     └─ 部門: sales, marketing, finance                   │
│                                                         │
│  2. ポリシー（アクセスルール）                               │
│     ├─ 行フィルタポリシー                                   │
│     └─ 列マスクポリシー                                    │
│                                                         │
│  3. UDF（ユーザー定義関数）                                 │
│     └─ 複雑な制御ロジックを実装                             │
└─────────────────────────────────────────────────────────┘
```

## 階層的な適用レベル

| レベル | 適用範囲 | 特徴 |
|--------|----------|------|
| **カタログレベル** | 全スキーマ・テーブル | 最も広範囲、管理効率が高い |
| **スキーマレベル** | 該当スキーマ内のテーブル | 中程度の粒度 |
| **テーブルレベル** | 個別テーブル | 最も細かい制御 |

## メリット、嬉しさ

### 1. スケーラビリティ

従来のアプローチでは、1000個のテーブルがあれば1000回の権限設定が必要でした。ABACなら**1つのポリシーで数百〜数千のテーブルを一括管理**できます。

```
従来: テーブル1つ × 権限設定1つ = 1000回の作業
ABAC: ポリシー1つ × タグ設定 = 数分の作業
```

### 2. 柔軟性
新しい要件が出てきても、**タグやポリシーを更新するだけ**で対応完了。個別のテーブル権限を変更する必要がありません。

### 3. 一元化されたガバナンス
複数のカタログ・スキーマにまたがるデータも、**統一したルールで管理**できます。バラバラだった権限管理が一箇所に集約されます。

### 4. 動的なセキュリティ強化
ユーザーの属性やデータの内容に応じて、**リアルタイムでアクセス制御が変化**します。機密データは自動的に保護されます。

### 5. 完全な監査可能性
すべてのデータアクセスが**監査ログに自動記録**され、コンプライアンス要件も簡単にクリアできます。


# ウォークスルー

チュートリアルに沿って操作します。

https://docs.databricks.com/aws/ja/data-governance/unity-catalog/abac/tutorial

## 有効化

アカウントコンソールのプレビューで**Tag Policies**、ワークスペースのプレビューで**Attribute Based Access Control**をオンにします。

![Screenshot 2025-06-10 at 16.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ac2881ba-d699-4257-84ba-514b73b36a2c.png)

![Screenshot 2025-06-10 at 16.13.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/dafd94d0-dd3e-4bac-bd96-5434722834fb.png)

## タグポリシーの作成

カタログエクスプローラにアクセスすると、**タグポリシー**が追加されています。タグポリシーで、使用するタグのキーと許容する値を定義します。

![Screenshot 2025-06-10 at 16.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3a67df4d-6def-4674-9e03-76c5475041c9.png)

以下のように個人特定情報のタグを作成します。

![Screenshot 2025-06-10 at 16.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f7c3a6c4-0697-4abc-a7a8-d7fe6f81b0af.png)
![Screenshot 2025-06-10 at 16.21.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3fc2e15b-ea37-4617-8cbb-963ddf6fcfda.png)

## テーブルの作成

ダミーデータを含むテーブルを作成します。

```sql
%sql
-- カタログを作成（存在しない場合）
CREATE CATALOG IF NOT EXISTS abac;
USE CATALOG abac;

-- スキーマを作成
CREATE SCHEMA IF NOT EXISTS customers;
USE SCHEMA customers;

-- テーブルを作成
CREATE TABLE IF NOT EXISTS profiles (
    First_Name STRING,
    Last_Name STRING,
    Phone_Number STRING,
    Address STRING,
    SSN STRING
)
USING DELTA;

-- データを挿入
INSERT INTO profiles (First_Name, Last_Name, Phone_Number, Address, SSN)
VALUES
('John', 'Doe', '123-456-7890', '123 Main St, NY', '123-45-6789'),
('Jane', 'Smith', '234-567-8901', '456 Oak St, CA', '234-56-7890'),
('Alice', 'Johnson', '345-678-9012', '789 Pine St, TX', '345-67-8901'),
('Bob', 'Brown', '456-789-0123', '321 Maple St, FL', '456-78-9012'),
('Charlie', 'Davis', '567-890-1234', '654 Cedar St, IL', '567-89-0123'),
('Emily', 'White', '678-901-2345', '987 Birch St, WA', '678-90-1234'),
('Frank', 'Miller', '789-012-3456', '741 Spruce St, WA', '789-01-2345'),
('Grace', 'Wilson', '890-123-4567', '852 Elm St, NV', '890-12-3456'),
('Hank', 'Moore', '901-234-5678', '963 Walnut St, CO', '901-23-4567'),
('Ivy', 'Taylor', '012-345-6789', '159 Aspen St, AZ', '012-34-5678'),
('Liam', 'Connor', '111-222-3333', '12 Abbey Street, Dublin, Ireland EU', '111-22-3333'),
('Sophie', 'Dubois', '222-333-4444', '45 Rue de Rivoli, Paris, France Europe', '222-33-4444'),
('Hans', 'Müller', '333-444-5555', '78 Berliner Str., Berlin, Germany E.U.', '333-44-5555'),
('Elena', 'Rossi', '444-555-6666', '23 Via Roma, Milan, Italy Europe', '444-55-6666'),
('Johan', 'Andersson', '555-666-7777', '56 Drottninggatan, Stockholm, Sweden EU', '555-66-7777');
```

![Screenshot 2025-06-10 at 16.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c618bb3c-cd21-4720-9586-e180a7aba34c.png)

こちらにEUの住所が含まれていることを覚えておいてください。
![Screenshot 2025-06-10 at 16.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7eaffcd8-5651-4234-b318-54d45f9f0e6b.png)

## タグの設定

上で定義したタグを対象のカラムに設定します。

```sql
%sql
-- SSN列にガバナンスタグを追加
ALTER TABLE abac.customers.profiles
ALTER COLUMN SSN
SET TAGS ('pii' = 'ssn');

-- Address列にガバナンスタグを追加
ALTER TABLE abac.customers.profiles
ALTER COLUMN Address
SET TAGS ('pii' = 'address');
```

カタログエクスプローラ上にもタグが表示されます。

![Screenshot 2025-06-10 at 16.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/60d8296f-a8a6-46e5-a14b-dacbc64d4a71.png)

## UDFの作成

次のステップで行フィルターポリシーを適用する際に使用する、検索用の関数を定義します。

```sql
%sql
-- 住所がEUにないかどうかを判定
CREATE OR REPLACE FUNCTION abac.customers.is_not_eu_address(address STRING)
RETURNS BOOLEAN
RETURN (
    SELECT CASE
        WHEN LOWER(address) LIKE '%eu%'
          OR LOWER(address) LIKE '%e.u.%'
          OR LOWER(address) LIKE '%europe%'
        THEN FALSE
        ELSE TRUE
    END
);
```

## 行フィルターポリシーの定義

今回はテーブルレベルでアクセス制御をかけます。上で作成した`profiles`テーブルにアクセスし、**Policies**タブを開いて、**新しいポリシー**をクリックします。

![Screenshot 2025-06-10 at 16.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/559277f8-8ec5-44cc-a45b-4473eaad5d31.png)

ポリシー名、説明文、適用対象のプリンシパル(ユーザー、グループ、サービスプリンシパル)、ポリシーの種類(行フィルター)、上で定義した行フィルター関数を指定します。

![Screenshot 2025-06-10 at 16.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1f151b7d-f5e6-442a-ba78-81d621891a1f.png)
![Screenshot 2025-06-10 at 16.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6ec6df53-2947-4c41-a8b1-c3e4fe416021.png)

そして、**列が次の場合**でタグ`pii`を指定します。これによって、行フィルター関数を適用する条件にタグを加えることができます。

![Screenshot 2025-06-10 at 16.30.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d0db05d-b182-42b6-824f-fbfce33d8d11.png)

![Screenshot 2025-06-10 at 16.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/015a18d5-9d4a-41bd-b19e-29b239156797.png)

## 動作確認

上記テーブルを参照します。

```sql
%sql
SELECT DISTINCT * FROM abac.customers.profiles
```

EUの行が除外されています。

|First_Name|Last_Name|Phone_Number|Address|SSN|
|---|---|---|---|---|
|Grace|Wilson|890-123-4567|852 Elm St, NV|890-12-3456|
|Alice|Johnson|345-678-9012|789 Pine St, TX|345-67-8901|
|Ivy|Taylor|012-345-6789|159 Aspen St, AZ|012-34-5678|
|Frank|Miller|789-012-3456|741 Spruce St, WA|789-01-2345|
|Jane|Smith|234-567-8901|456 Oak St, CA|234-56-7890|
|John|Doe|123-456-7890|123 Main St, NY|123-45-6789|
|Charlie|Davis|567-890-1234|654 Cedar St, IL|567-89-0123|
|Emily|White|678-901-2345|987 Birch St, WA|678-90-1234|
|Hank|Moore|901-234-5678|963 Walnut St, CO|901-23-4567|
|Bob|Brown|456-789-0123|321 Maple St, FL|456-78-9012|

今回は、テーブルレベルでのポリシーの適用でしたが、カタログレベルで適用することでタグが付与されているすべてのカラムに対して一括でポリシーを適用することもできます。

# 注意点

## ベータ版の制限事項

| 制限項目 | 内容 | 対策 |
|---------|------|------|
| **列削除問題** | MODIFY権限があるユーザーが管理タグ付き列を削除可能 | 権限管理の見直しが必要 |
| **ワークスペース依存** | ベータ有効化されていないワークスペースでは無効 | 全ワークスペースでの有効化を推奨 |
| **Delta Sharing制限** | 共有時にポリシーが適用されない | 共有前の事前確認が重要 |
| **ビュー未対応** | ビューではABAC利用不可 | テーブル直接アクセスでの設計が必要 |

## 運用上の推奨事項

1. **最上位レベルでの定義**
   - カタログレベルでポリシー定義を推奨
   - 管理効率とコスト削減を両立

2. **重複ポリシーの回避**
   - 1つの列・行には1つのポリシーのみ
   - 複数適用でアクセス不能になる可能性

3. **段階的導入**
   - 小規模なテストから開始
   - 徐々に適用範囲を拡大

4. **監査ログの活用**
   - 定期的なアクセスパターン確認
   - 異常なアクセスの早期発見


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)