チュートリアル:SQLを使用してABACを設定する
このチュートリアルでは、 SQLを使用してUnity Catalogで行フィルターと列マスクの ABAC ポリシーを設定する方法を示します。 カタログエクスプローラーのUIベースバージョンについては、 「チュートリアル: ABACの設定」を参照してください。
この例では、アナリティクス チームは EU 顧客レコードにアクセスできず、SSN は常にマスクされています。 データ共有に同意した顧客には、完全な電子メールが表示されます。 他のユーザーには、マスクされたバージョンしか表示されない。
このチュートリアルには次のステップが含まれています。
- 管理タグを作成する
- Unity Catalogカタログ、スキーマ、およびテーブルを作成します。
- 列に管理タグを適用する
- EUの住所を検出するUDFを作成します。
- 行フィルタポリシーを作成する
- 行フィルターをテストする
- SSNをマスクするUDFを作成します
- 列マスクポリシーを作成する
- 列マスクをテストする
これらのステップを完了した後、オプションで条件付き電子メール マスキングを使用してチュートリアルを拡張できます (ステップ 10–12)。
前提条件
- Databricks Runtime 16.4 以降、またはサーバレス コンピュート。
- アカウント管理者またはワークスペース管理者権限(管理タグを作成するため)。
MANAGE対象のカタログまたはスキーマに対する権限。EXECUTEUDFについて。
古いランタイムを実行しているコンピュートは、ABAC によって保護されたテーブルにアクセスできません。
ステップ 1: 管理タグを作成する
アカウントレベルで定義されたキーと値のペアを管理します。 ABAC ポリシーはこれらを使用して、フィルタまたはマスクする列を見つけます。 このチュートリアルでは、2つの管理タグを作成します。
piiタグには、ssn、address、および 3 つの許可された値があります。email- 同意列を識別するためのキーのみのタグ(値は指定不可)
consent
管理タグを作成するには、アカウントレベルで管理タグの CREATE 権限が必要です。アカウント管理者とワークスペース管理者には、デフォルトで CREATE があります。
- Databricks ワークスペースで、
カタログ をクリックします。
- クリック
統治 ボタン。
- ドロップダウン メニューで、 [管理タグ] をクリックします。
- 管理タグを作成 をクリックします。
- タグキーには
piiを入力してください。 - 管理タグの説明を入力します。
- 許可される値には、
ssn、address、emailを入力してください。このタグキーには、これらの値のみを割り当てることができます。 - 作成 をクリックします。
- ステップ 4–8 を繰り返して、キー
consentを持つ 2 番目の管理タグを作成します。 許可される値は空欄のままにしてください(キーのみのタグ)。
タグデータはプレーンテキストとして保存され、グローバルに複製される可能性があります。リソースのセキュリティを損なう可能性のあるタグ名、値、または記述子を使用しないでください。例えば、個人情報や機密情報を含むタグ名、値、記述子は使用しないでください。
ステップ 2: 顧客テーブルを作成する
顧客プロファイルを含むカタログ、スキーマ、およびテーブルを作成します。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の同意を考慮したマスキング ポリシーに必要であり、 USING COLUMNSを介してhas_consent UDF に渡します。
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
);
これは説明のために簡略化されたチェックです。本番運用では、国コード列やルックアップテーブルなど、より堅牢な方法を使用して地域を特定してください。
ステップ 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);
カタログエクスプローラーのユーザーインターフェースからもポリシーを作成できます。詳細については、「ABAC ポリシーの作成と管理」を参照してください。
ステップ 6: 行フィルターをテストする
行フィルタポリシーが正しく機能していることを確認するには、次のクエリを実行してください。
SELECT * FROM abac_tutorial.customers.profiles;
EU域外居住者に関する10件の行のみが返されます。EUの顧客5人(リアム、ソフィー、ハンス、エレナ、ヨハン)は非公開です。
ステップ 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: 一致した列からの実際のEメール値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に渡します。
has_consent列はステップ 3で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の顧客にはマスクされたバージョンが表示されます。社会保障番号は完全に匿名化されており、EU圏外の顧客のみが返送されます。
ファーストネーム | 同意している | メール | 社会保障番号 |
|---|---|---|---|
ジョン | True | ***-**-**** | |
Jane | False | ***-**-**** | |
Alice | True | ***-**-**** | |
Bob | False | ***-**-**** | |
Charlie | True | ***-**-**** | |
Emily | False | ***-**-**** | |
Frank | True | ***-**-**** | |
Grace | True | ***-**-**** | |
Hank | False | ***-**-**** | |
Ivy | True | ***-**-**** |
まとめ
このチュートリアルでは、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;
piiおよびconsent管理タグを削除するには、カタログ エクスプローラー UI を使用します。