このチュートリアルでは、SQL を使用して Unity カタログで行フィルターと列マスク ABAC ポリシーを構成する方法について説明します。 カタログ エクスプローラーの UI ベースのバージョンについては、「 チュートリアル: ABAC の構成」を参照してください。
この例では、分析チームは EU の顧客レコードにアクセスできず、SSN は常にマスクされます。 データ共有に同意した顧客には、完全な電子メールが表示されます。 他のユーザーには、マスクされたバージョンのみが表示されます。
このチュートリアルには、次の手順が含まれています。
- 管理タグを作成する
- Unity カタログ カタログ、スキーマ、およびテーブルを作成する
- 列に管理タグを適用する
- EU アドレスを検出する UDF を作成する
- 行フィルター ポリシーを作成する
- 行フィルターをテストする
- SSN をマスクする UDF を作成する
- 列マスク ポリシーを作成する
- 列マスクをテストする
これらの手順を完了したら、必要に応じて、条件付きメール マスク (手順 10 ~ 12) を使用してチュートリアルを拡張できます。
前提条件
- Databricks Runtime 16.4 以降、またはサーバーレス コンピューティング。
- アカウント管理者またはワークスペース管理者のアクセス許可 (管理タグを作成するため)。
-
MANAGEターゲット カタログまたはスキーマに対するアクセス許可。 - UDF の
EXECUTE。
以前のランタイムを実行しているコンピューティングは、ABAC によってセキュリティ保護されたテーブルにアクセスできません。
手順 1: 管理タグを作成する
管理タグ は、アカウント レベルで定義されたキーと値のペアです。 ABAC ポリシーでは、フィルター処理またはマスクする列を検出するために使用されます。 このチュートリアルでは、次の 2 つの管理タグを作成します。
-
piiタグには、ssn、address、およびemailの3つの許可された値があります - 同意列を識別するための
consentキー専用タグ (許可された値なし)
管理タグを作成するには、アカウント レベルで管理タグの CREATE アクセス許可が必要です。 アカウント管理者とワークスペース管理者は、既定で CREATE を使用します。
- Azure Databricks ワークスペースで、
Catalog をクリックします。
-
[管理] ボタン。
- ドロップダウン メニューの [ 管理タグ] をクリックします。
- [ 管理タグの作成] をクリックします。
- タグ キーに「
pii」と入力します。 - 管理タグの説明を入力します。
- 使用できる値には、「
ssn、address、email」と入力します。 このタグ キーには、これらの値のみを割り当てることができます。 - 作成 をクリックします。
- 手順 4 から 8 を繰り返して、キー
consentを含む 2 つ目の管理タグを作成します。 使用できる値は空のままにします (キー専用タグ)。
Warnung
タグ データはプレーン テキストとして格納され、グローバルにレプリケートされる場合があります。 リソースのセキュリティを損なう可能性のあるタグ名、値、または記述子は使用しないでください。 たとえば、個人または機密情報を含むタグ名、値、記述子は使用しないでください。
手順 2: customers テーブルを作成する
顧客プロファイルを含むカタログ、スキーマ、およびテーブルを作成します。
has_consent列は、後で条件付きメール マスクに使用されます。 同意 (TRUE) したお客様には、完全な電子メールが表示されます。
Databricks Runtime 16.4 以降のコンピューティングに接続されているノートブックで、次のコマンドを実行します。
-- Create catalog (if not already exists)
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;
-- Create schema
CREATE SCHEMA IF NOT EXISTS customers;
USE SCHEMA customers;
CREATE OR REPLACE TABLE profiles (
first_name STRING,
last_name STRING,
email STRING,
phone_number STRING,
home_address STRING,
ssn_number STRING,
has_consent BOOLEAN
);
INSERT INTO profiles (first_name, last_name, email, phone_number, home_address, ssn_number, has_consent)
VALUES
('John', 'Doe', 'john.doe@example.com', '123-456-7890', '123 Main St, NY', '123-45-6789', TRUE),
('Jane', 'Smith', 'jane.smith@example.com', '234-567-8901', '456 Oak St, CA', '234-56-7890', FALSE),
('Alice', 'Johnson', 'alice.j@example.com', '345-678-9012', '789 Pine St, TX', '345-67-8901', TRUE),
('Bob', 'Brown', 'bob.brown@example.com', '456-789-0123', '321 Maple St, FL', '456-78-9012', FALSE),
('Charlie', 'Davis', 'charlie.d@example.com', '567-890-1234', '654 Cedar St, IL', '567-89-0123', TRUE),
('Emily', 'White', 'emily.w@example.com', '678-901-2345', '987 Birch St, WA', '678-90-1234', FALSE),
('Frank', 'Miller', 'frank.m@example.com', '789-012-3456', '741 Spruce St, WA', '789-01-2345', TRUE),
('Grace', 'Wilson', 'grace.w@example.com', '890-123-4567', '852 Elm St, NV', '890-12-3456', TRUE),
('Hank', 'Moore', 'hank.moore@example.com', '901-234-5678', '963 Walnut St, CO', '901-23-4567', FALSE),
('Ivy', 'Taylor', 'ivy.taylor@example.com', '012-345-6789', '159 Aspen St, AZ', '012-34-5678', TRUE),
('Liam', 'Connor', 'liam.c@example.com', '111-222-3333', '12 Abbey Street, Dublin, Ireland EU', '111-22-3333', TRUE),
('Sophie', 'Dubois', 'sophie.d@example.com', '222-333-4444', '45 Rue de Rivoli, Paris, France Europe', '222-33-4444', FALSE),
('Hans', 'Müller', 'hans.m@example.com', '333-444-5555', '78 Berliner Str., Berlin, Germany E.U.', '333-44-5555', TRUE),
('Elena', 'Rossi', 'elena.r@example.com', '444-555-6666', '23 Via Roma, Milan, Italy Europe', '444-55-6666', FALSE),
('Johan', 'Andersson', 'johan.a@example.com', '555-666-7777', '56 Drottninggatan, Stockholm, Sweden EU', '555-66-7777', TRUE);
手順 3: 列に管理タグを追加する
ssn_number、home_address、およびemailの列に、pii管理タグを使用してタグ付けします。 ABAC ポリシーは、名前ではなくタグごとに列を照合します。
has_consent列には、consent管理タグが付けられます。 これは、手順 11 の同意に対応したマスク ポリシーに必要です。このポリシーは、has_consent経由で UDF にUSING COLUMNSを渡します。
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN ssn_number
SET TAGS ('pii' = 'ssn');
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN home_address
SET TAGS ('pii' = 'address');
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN email
SET TAGS ('pii' = 'email');
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN has_consent
SET TAGS ('consent' = '');
手順 4: EU アドレスを検出する UDF を作成する
この UDF には、 pii = address タグ付けされたすべての列の値が渡され、次の値が返されます。
-
FALSEアドレスにEU、E.U.、またはEuropeが含まれている場合、行は非表示になります。 -
TRUEそれ以外の場合は、行が表示されます。
CREATE OR REPLACE FUNCTION 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
);
Note
これは、デモンストレーションを目的とした簡略化されたチェックです。 運用環境では、国コード列や参照テーブルなどのより堅牢な方法を使用して、リージョンを特定します。
手順 5: 行フィルター ポリシーを作成する
ポリシーを作成するには、オブジェクトまたはオブジェクトの所有権に MANAGE が必要です。 UDF をポリシーに追加するには、UDF に EXECUTE が必要です。
CREATE POLICY hide_eu_customers
ON SCHEMA abac_tutorial.customers
ROW FILTER is_not_eu_address
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'address') AS addr_col
USING COLUMNS (addr_col);
カタログ エクスプローラー UI を使用してポリシーを作成することもできます。 詳細については、「 行フィルターポリシーと列マスク ポリシーの作成と管理 」を参照してください。
手順 6: 行フィルターをテストする
次のクエリを実行して、行フィルター ポリシーが動作していることを確認します。
SELECT * FROM abac_tutorial.customers.profiles;
10 行の非 EU 常駐行のみが返されます。 EU の 5 人の顧客 (Liam、Sophie、Hans、Elena、Johan) は非表示になっています。
手順 7: SSN をマスクする UDF を作成する
この UDF は、渡された SSN 値の完全に編集されたプレースホルダーを返します。
CREATE OR REPLACE FUNCTION redact_ssn(ssn STRING)
RETURNS STRING
RETURN '***-**-****';
手順 8: 列マスク ポリシーを作成する
pii = ssnタグ付けされたすべての列を対象とするポリシーを作成し、それぞれにredact_ssn関数を適用します。
CREATE POLICY redact_ssn_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK redact_ssn
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;
手順 9: 列マスクをテストする
次のクエリを実行して、行フィルターと列マスクの両方がアクティブであることを確認します。
SELECT * FROM abac_tutorial.customers.profiles;
SSN は ***-**-****として返されるようになりました。 行フィルターもアクティブであるため、EU 以外の居住者のみが返されます。
拡張: 条件付きメール マスク
次の手順では、同意に対応した電子メール マスクを使用してチュートリアルを拡張します。 オプトイン (has_consent = TRUE) したユーザーには、完全なメールが表示されます。他のユーザーには最初の文字とドメインのみが表示されます。
手順 10: 同意に対応した電子メール マスク UDF を作成する
この UDF は、次の 2 つの引数を受け取ります。
-
email: 一致した列からの実際の電子メール値 -
consent: 同じ行のhas_consent列の値
CREATE OR REPLACE FUNCTION mask_email_by_consent(email STRING, consent BOOLEAN)
RETURNS STRING
RETURN CASE
WHEN consent = TRUE THEN email
ELSE CONCAT(LEFT(email, 1), '***@', SUBSTRING_INDEX(email, '@', -1))
END;
手順 11: 条件付きメール マスク ポリシーを作成する
このポリシーは、 pii = email タグ付けされた列を対象とし、 has_consent 列を UDF に渡します。
Note
has_consent列には、consent で管理タグが付けられています。 これは、 USING COLUMNS が MATCH COLUMNSを介して一致する列のみを参照できるために必要です。
has_consentがマスクされていない場合でも、ポリシーがその値を UDF に渡すことができるようにタグ付けする必要があります。
CREATE POLICY mask_email_by_consent_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK mask_email_by_consent
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'email') AS email_col,
has_tag('consent') AS consent_col
ON COLUMN email_col
USING COLUMNS (consent_col);
手順 12: 条件付きメール マスクをテストする
次のクエリを実行して、3 つのポリシーすべてが連携していることを確認します。
SELECT * FROM abac_tutorial.customers.profiles;
has_consent = TRUEをお持ちのお客様には、完全な電子メールが表示されます。
has_consent = FALSEをお持ちのお客様には、マスクされたバージョンが表示されます。 SSNは完全にマスクされたままであり、EU以外の顧客のみが返されます。
| first_name | 同意あり | メール | ssn_number |
|---|---|---|---|
| John | 正しい | john.doe@example.com | ***-**-**** |
| ジェーン | FALSE | j***@example.com | ***-**-**** |
| アリス | 正しい | alice.j@example.com | ***-**-**** |
| ボブ | FALSE | b***@example.com | ***-**-**** |
| チャーリー | 正しい | charlie.d@example.com | ***-**-**** |
| エミリー | FALSE | e***@example.com | ***-**-**** |
| フランク | 正しい | frank.m@example.com | ***-**-**** |
| グレース | 正しい | grace.w@example.com | ***-**-**** |
| ハンク | FALSE | h***@example.com | ***-**-**** |
| Ivy | 正しい | ivy.taylor@example.com | ***-**-**** |
まとめ
このチュートリアルでは、次の 3 つの ABAC パターンを示しました。
- 行のフィルター処理: 管理タグによって一致する列値に基づいて行を非表示にする
- 列マスク: 管理タグに一致する列をマスクする
-
条件付きマスク: コンテキスト列にタグを付け、それを介して UDF に渡すことによって、同じ行の別の列の値に基づいて列をマスクする
USING COLUMNS
クリーンアップ
このチュートリアルで作成したすべてのオブジェクトを削除するには、次のコマンドを実行します。 条件付きメール マスクの手順をスキップした場合、 DROP POLICY mask_email_by_consent_policy ステートメントと DROP FUNCTION mask_email_by_consent ステートメントは失敗します。これは想定されています。
DROP POLICY hide_eu_customers ON SCHEMA abac_tutorial.customers;
DROP POLICY redact_ssn_policy ON SCHEMA abac_tutorial.customers;
DROP POLICY mask_email_by_consent_policy ON SCHEMA abac_tutorial.customers;
DROP FUNCTION IF EXISTS abac_tutorial.customers.is_not_eu_address;
DROP FUNCTION IF EXISTS abac_tutorial.customers.redact_ssn;
DROP FUNCTION IF EXISTS abac_tutorial.customers.mask_email_by_consent;
DROP TABLE IF EXISTS abac_tutorial.customers.profiles;
DROP SCHEMA IF EXISTS abac_tutorial.customers CASCADE;
管理タグとpiiconsentを削除するには、カタログ エクスプローラー UI を使用します。