
1.はじめに
GDAI事業部Lakehouse部の坂下です。
本記事では、DatabricksのUnity Catalogを用いたABACの実装方法について、具体的なSQLコードとUI設定のプロセスを交えて解説します。
属性ベースのアクセス制御(ABAC)とは?
ABACとは、ユーザーの属性(例:部署、役職、地域)やデータ自体の属性(例:機密性レベル、データソース、地域)に基づいて、データへのアクセス権を動的に決定するセキュリティモデルです。
従来のモデルとの違い
従来のモデル(RBAC - ロールベースアクセス制御): ユーザーを特定の「ロール」に割り当て、そのロールに権限を付与します。例えば、「営業マネージャー」ロールを持つユーザーは、営業部門のデータにアクセスできる、といったシンプルな構造です。
Databricks ABACの実装前提条件
ABACをDatabricksで実装するには、まず以下の環境が整っている必要があります。
Databricks Unity Catalog: すべてのデータガバナンス機能の中心となるUnity Catalogが有効になっている必要があります。
適切な権限: カタログ、スキーマ、テーブル、関数を作成し、ポリシーを設定するための適切な管理者権限が必要です。
コンピュート環境: SQLウェアハウスServerlessあるいは標準アクセスモード(Standard access mode) を使用する場合、Databricks Runtime 12.2 LTS以上が必要です。専用アクセスモード(Dedicated access mode) を使用する場合、Databricks Runtime 15.4 LTS以上が必要です。
2.Databricks ABACの作成プロセス
ここでは、特定の地域(APAC)の従業員のみが、その地域に紐づいたデータにアクセスできるというシナリオを例に、ABACのセットアップ手順を解説します。
1. データ環境の準備
まず、ABACを適用する対象となるカタログ、スキーマ、およびテーブルを作成します。以下のSQLコマンドを実行します。
-- カタログを作成(存在しない場合) CREATE CATALOG IF NOT EXISTS abac; USE CATALOG abac; -- 新しいスキーマを作成 CREATE SCHEMA IF NOT EXISTS hr; USE SCHEMA hr; -- 従業員プロファイルテーブルを作成 CREATE TABLE IF NOT EXISTS employees ( employee_id INT, name STRING, email STRING, department STRING, salary DOUBLE, region STRING ) USING DELTA; -- データを挿入 INSERT INTO employees (employee_id, name, email, department, salary, region) VALUES (1, 'Alice Johnson', 'alice.j@example.com', 'Sales', 75000.00, 'APAC'), (2, 'Bob Williams', 'bob.w@example.com', 'Marketing', 68000.00, 'EMEA'), (3, 'Charlie Brown', 'charlie.b@example.com', 'Engineering', 92000.00, 'Americas'), (4, 'Diana Prince', 'diana.p@example.com', 'HR', 60000.00, 'APAC'), (5, 'Eve Davis', 'eve.d@example.com', 'Finance', 80000.00, 'EMEA'), (6, 'Frank White', 'frank.w@example.com', 'Sales', 70000.00, 'Americas'), (7, 'Grace Lee', 'grace.l@example.com', 'Engineering', 95000.00, 'APAC'), (8, 'Henry Kim', 'henry.k@example.com', 'Marketing', 65000.00, 'EMEA'), (9, 'Ivy Chen', 'ivy.c@example.com', 'HR', 58000.00, 'Americas'), (10, 'Jack Green', 'jack.g@example.com', 'Finance', 82000.00, 'APAC');
ここでテーブルの中身を確認しましょう。

2. 列へのタグ設定
ABACの核となる「属性」として、テーブルの列にタグを付与します。ここではアクセス制御の対象となる地域情報(region)にタグを付けます。
-- 'region' 列にアクセス制限タグを設定 ALTER TABLE abac.hr.employees ALTER COLUMN region SET TAGS ('region_access' = 'APAC');
これらのタグは、後で作成するポリシー(行フィルター、列マスク)の適用条件として使用されます。
3. 行フィルターポリシーで使用するUDFの作成
行フィルターは、テーブルの行を表示するかどうかを決定するロジックをカプセル化するユーザー定義関数(UDF)です。今回は、'APAC'地域のデータのみを表示するUDFを作成します。
CREATE OR REPLACE FUNCTION abac.hr.is_apac_region(employee_region STRING) RETURNS BOOLEAN RETURN ( SELECT CASE WHEN employee_region = 'APAC' THEN TRUE ELSE FALSE END );
このUDFは、与えられた地域が'APAC'である場合にTRUEを返します。これにより、ポリシーはTRUEが返された行のみを表示します。
4. カタログエクスプローラーでのポリシー設定
現在、DatabricksのABACポリシーは、SQLコマンドではなく、Databricks UIのCatalog Explorerから設定する必要があります。
- Catalog Explorerに移動: Databricksのワークスペース左側のナビゲーションでCatalogアイコンをクリックします。
- テーブルを選択: abacカタログ > hrスキーマ > employeesテーブルに移動します。
- 「Policies」タブをクリック: テーブルの詳細画面でPoliciesタブを選択します。
- 「New Policy」をクリック: 新しいポリシー作成画面が開きます。

- 下記のようにポリシー情報を入力します。

この設定により、Row filter functionで指定されたabac.hr.is_apac_region(region)が実行されます。is_apac_region関数がTRUEを返した行のみが、最終的なクエリ結果としてユーザーに表示されます。
5. 動作確認
設定が完了したら、ポリシーを適用されたユーザーとしてDatabricks SQLで以下のクエリを実行します
SELECT * FROM abac.hr.employees;
アウトプットはregionがAPACの行だけが表示されます。

3.まとめ
DatabricksのABACを活用することで、コンプライアンス要件を満たしながら、きめ細かくデータを保護することが可能になります。ぜひ、この強力な機能を活用し、よりセキュアなデータプラットフォームを構築してください。
お知らせ
私たちはDatabricksを用いたデータ分析基盤の導入から内製化支援まで幅広く支援をしております。 もしご興味がある方は、お問い合わせ頂ければ幸いです。
また、一緒に働いていただける仲間も募集中です! APCにご興味がある方の連絡をお待ちしております。 www.ap-com.co.jp