コントロールタグを使用して、新しいテーブルをデフォルトで保護します。
このチュートリアルでは、新しいテーブルを自動的にロックダウンし、データスチュワードがその内容をレビューして分類した後にのみ解放する方法を示します。 使用するもの:
- スキーマレベルの
review_status制御タグにより、スキーマ内のすべての新しいテーブルはデフォルトでマスクされます。 - データを分類すると、機密列が自動的に検出され、
class.*システム タグでタグ付けされます - 型認識マスキングのための組み込み関数
system.data_classification.mask_value - 2つのポリシー:1つはテーブルのレビュー待ちの間、すべての列をマスクするポリシー、もう1つはレビュー後に分類された列のみをマスクするポリシー。
前提条件
- Databricks Runtime 16.4 以降、またはサーバレス コンピュート。
- アカウント管理者またはワークスペース管理者権限 (管理タグを作成し、データ分類を有効にするため)。
MANAGE対象のカタログまたはスキーマに対する権限。EXECUTEUDFについて。- SQLノートブックまたはクエリ エディター。
シナリオ
組織では、買収、パートナーとの統合、または新しい製品機能によって、 Unity Catalogスキーマに新しいテーブルを定期的に追加しています。 デフォルトでは、スキーマ上でSELECT権限を持つユーザーは、分類されていない個人情報を含む可能性のある列を含め、新しいテーブルを即座にクエリできます。
制御タグパターンはこの問題を解決します。スキーマレベルのreview_status = pendingタグを使用すると、スキーマ内のすべての新しいテーブルがデフォルトで完全にマスクされます。データ分類はバックグラウンドでテーブルをスキャンし、検出された機密列にclass.*タグを適用します。データスチュワードは分類をレビューし、誤検知を修正した後、テーブル レベルでreview_statusをreviewedに反転します。 これにより、継承されたスキーマ タグがオーバーライドされ、2 番目のポリシーが引き継ぎます。つまり、機密でない列はアクセス可能なままにして、 class.* -タグ列のみをマスクします。
ステップ 1: カタログでデータ分類を有効にする
データ分類はバックグラウンドでテーブルをスキャンし、 class.name 、 class.email_address 、 class.us_ssnなどのclass.*システム管理タグを適用します。列レベルの検出には、カスタムタグは必要ありません。
- カタログエクスプローラーで、カタログを選択し、 「詳細」 タブに移動します。
- データ分類の 横にある 「有効にする」 をクリックします。
- 必要に応じて、含めるスキーマを選択できます。
自動タグは、最初の検出を確認した後、データ分類結果ページから後で有効になります (ステップ 6)。
詳細については、 「データ分類」を参照してください。
ステップ 2: review_status管理タグを作成する
カタログ エクスプローラー UI で次の管理タグを作成します ( [カタログ] > [管理] > [管理タグ] > [管理タグの作成] )。
タグキー | 許容値 |
|---|---|
|
|
タグデータはプレーンテキストとして保存され、グローバルに複製される可能性があります。リソースのセキュリティを損なう可能性のあるタグ名、値、または記述子を使用しないでください。例えば、個人情報や機密情報を含むタグ名、値、記述子は使用しないでください。
ステップ 3: スキーマを構築し、コントロール タグを適用する
スキーマを作成し、コントロールタグをpendingに設定します。このスキーマで作成されたすべてのテーブルは、このタグを自動的に継承します。
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;
CREATE SCHEMA IF NOT EXISTS secure_default;
ALTER SCHEMA abac_tutorial.secure_default
SET TAGS ('review_status' = 'pending');
ステップ 4: 保留中のレビューを作成する ポリシー
テーブルにreview_status = pendingが含まれている場合、すべての列がマスクされます。MATCH COLUMNS TRUEタグに関係なくすべての列に一致します。
system.data_classification.mask_value これは、Databricksが提供する型認識型マスキング関数です。ランタイム データ型に基づいて安全なプレースホルダーを返します。 例えば、整数に対しては0 、日付に対してはDATE '1970-01-01' 、文字列に対してはSHA-256ハッシュを返します。カスタムUDFは不要です。
CREATE POLICY review_pending_policy
ON SCHEMA abac_tutorial.secure_default
COLUMN MASK system.data_classification.mask_value
TO `account users`
FOR TABLES
WHEN has_tag_value('review_status', 'pending')
MATCH COLUMNS TRUE AS m ON COLUMN m;
特定のグループをポリシーの適用対象から除外するには、 EXCEPT条項を追加します。例えば、 TO \アカウントユーザー` EXCEPT `data_admins` lets members of the data_admins` グループはマスクをバイパスしてマスクされていないデータを見ることができます。
ステップ 5: テーブルを作成してロックダウンを確認する
スキーマ内にテーブルを作成します。スキーマからreview_status = pending継承するため、すべての列が即座にマスクされます。
CREATE OR REPLACE TABLE abac_tutorial.secure_default.employee_directory (
id INT,
full_name STRING,
personal_email STRING,
ssn_number STRING,
phone STRING,
office_location STRING,
title STRING,
team STRING
);
INSERT INTO abac_tutorial.secure_default.employee_directory VALUES
(1, 'Alice Johnson', 'alice.j@gmail.com', '123-45-6789', '555-0101', 'NYC HQ Floor 12', 'Staff Engineer', 'Platform'),
(2, 'Bob Smith', 'bob.smith@yahoo.com', '234-56-7890', '555-0202', 'LA Office Suite 4', 'Sales Director', 'Enterprise'),
(3, 'Carol White', 'carol.w@outlook.com', '345-67-8901', '555-0303', 'Chicago Rm 301', 'Senior Engineer', 'Platform'),
(4, 'David Lee', 'david.lee@gmail.com', '456-78-9012', '555-0404', 'Houston Floor 2', 'Marketing Lead', 'Growth'),
(5, 'Eva Martinez', 'eva.m@hotmail.com', '567-89-0123', '555-0505', 'Phoenix Building B', 'HR Business Partner', 'People');
すべての列がマスクされていることを確認するには、次のクエリを実行してください。
SELECT * FROM abac_tutorial.secure_default.employee_directory;
ステップ 6: 分類を確認し、自動タグを有効にする
データ分類によってテーブルがスキャンされたら(有効にしてから 24 時間以内)、検出を確認し、自動タグを有効にして、 class.*タグが既存の検出と今後の検出の両方に適用されるようにします。
- カタログエクスプローラーで、カタログを選択し、 「詳細」 タブに移動します。
- データ分類の 横にある 「結果を表示」 をクリックします。
- 検出結果を確認し、誤った検出結果の横にある 除外 アイコンをクリックして、間違いについてフィードバックを提供してください。
- 適用したい分類タグの自動タグを有効にします。 タグは次回のスキャン時(24時間以内)に表示されます。
データ分類 UI と自動タグの詳細については、 「分類結果の表示」と「自動タグを有効にする」を参照してください。
このチュートリアルでは、以下を実行して自動タグが適用されるclass.*タグをシミュレートします。これにより、バックグラウンド スキャンを待たずにエンドツーエンドのフローを確認できます。
-- Simulate Data Classification tags (in production, these are applied automatically)
ALTER TABLE abac_tutorial.secure_default.employee_directory
ALTER COLUMN full_name SET TAGS ('class.name' = '');
ALTER TABLE abac_tutorial.secure_default.employee_directory
ALTER COLUMN personal_email SET TAGS ('class.email_address' = '');
ALTER TABLE abac_tutorial.secure_default.employee_directory
ALTER COLUMN ssn_number SET TAGS ('class.us_ssn' = '');
ALTER TABLE abac_tutorial.secure_default.employee_directory
ALTER COLUMN phone SET TAGS ('class.phone_number' = '');
ステップ 7: レビューしたポリシーを作成する
テーブルがreviewedとしてマークされている場合、 class.*タグを持つ列タグのみがマスクされます。 分類されていない列が表示されます。
CREATE POLICY review_complete_policy
ON SCHEMA abac_tutorial.secure_default
COLUMN MASK system.data_classification.mask_value
TO `account users`
FOR TABLES
WHEN has_tag_value('review_status', 'reviewed')
MATCH COLUMNS (
has_tag('class.name')
OR has_tag('class.email_address')
OR has_tag('class.us_ssn')
OR has_tag('class.phone_number')
OR has_tag('class.credit_card')
OR has_tag('class.date_of_birth')
) AS m
ON COLUMN m;
ステップ 8: コントロールタグを反転して確認します
表を確認済みとしてマークしてください。テーブルレベルのreviewedタグは、継承されたスキーマレベルのpendingタグを上書きするため、保留中のポリシーは適用されなくなり、レビュー済みのポリシーが適用されます。
ALTER TABLE abac_tutorial.secure_default.employee_directory
SET TAGS ('review_status' = 'reviewed');
変更内容を確認するには、以下のクエリを実行してください。class.*タグ( full_name 、 personal_email 、 ssn_number 、 phone )が付いた列はマスクされたままです。分類されていない列( id 、 office_location 、 title 、 team )が表示されるようになりました。
SELECT * FROM abac_tutorial.secure_default.employee_directory;
ステップ 9: 新しいテーブルの自動継承を確認する
同じスキーマ内に別のテーブルを作成します。これはreview_status = pendingを継承し、自動的に完全にロックダウンされます。追加の設定は不要です。
CREATE OR REPLACE TABLE abac_tutorial.secure_default.transaction_log (
txn_id INT, account_holder STRING, amount DOUBLE, txn_date DATE, description STRING
);
INSERT INTO abac_tutorial.secure_default.transaction_log VALUES
(1001, 'Alice Johnson', 2500.00, '2026-01-15', 'Wire transfer'),
(1002, 'Bob Smith', 1800.00, '2026-01-16', 'Direct deposit'),
(1003, 'Carol White', 4200.00, '2026-01-17', 'Invoice payment');
新しいテーブルが完全にマスクされていることを確認するには、次のクエリを実行してください。データ分類がスキャンした後、 reviewedに切り替えた後、 class.*タグの付いた列のみがマスクされたままになります。
SELECT * FROM abac_tutorial.secure_default.transaction_log;
掃除
このチュートリアルで作成したすべてのオブジェクトを削除するには、次のコマンドを実行します。
DROP POLICY review_pending_policy ON SCHEMA abac_tutorial.secure_default;
DROP POLICY review_complete_policy ON SCHEMA abac_tutorial.secure_default;
DROP TABLE IF EXISTS abac_tutorial.secure_default.employee_directory;
DROP TABLE IF EXISTS abac_tutorial.secure_default.transaction_log;
DROP SCHEMA IF EXISTS abac_tutorial.secure_default CASCADE;
DROP CATALOG IF EXISTS abac_tutorial;
review_status管理タグを削除するには、カタログ エクスプローラー UI を使用します。