メインコンテンツまでスキップ

チュートリアル:SQLを使用してABACを設定する

このチュートリアルでは、 SQLを使用してUnity Catalogで行フィルターと列マスクの ABAC ポリシーを設定する方法を示します。 カタログエクスプローラーのUIベースバージョンについては、 「チュートリアル: ABACの設定」を参照してください。

この例では、アナリティクス チームは EU 顧客レコードにアクセスできず、SSN は常にマスクされています。 データ共有に同意した顧客には、完全な電子メールが表示されます。 他のユーザーには、マスクされたバージョンしか表示されない。

このチュートリアルには次のステップが含まれています。

  1. 管理タグを作成する
  2. Unity Catalogカタログ、スキーマ、およびテーブルを作成します。
  3. 列に管理タグを適用する
  4. EUの住所を検出するUDFを作成します。
  5. 行フィルタポリシーを作成する
  6. 行フィルターをテストする
  7. SSNをマスクするUDFを作成します
  8. 列マスクポリシーを作成する
  9. 列マスクをテストする

これらのステップを完了した後、オプションで条件付き電子メール マスキングを使用してチュートリアルを拡張できます (ステップ 10–12)。

前提条件

  • Databricks Runtime 16.4 以降、またはサーバレス コンピュート。
  • アカウント管理者またはワークスペース管理者権限(管理タグを作成するため)。
  • MANAGE 対象のカタログまたはスキーマに対する権限。
  • EXECUTE UDFについて。

古いランタイムを実行しているコンピュートは、ABAC によって保護されたテーブルにアクセスできません。

ステップ 1: 管理タグを作成する

アカウントレベルで定義されたキーと値のペアを管理します。 ABAC ポリシーはこれらを使用して、フィルタまたはマスクする列を見つけます。 このチュートリアルでは、2つの管理タグを作成します。

  • piiタグには、 ssnaddress 、および 3 つの許可された値があります。 email
  • 同意列を識別するためのキーのみのタグ(値は指定不可) consent

管理タグを作成するには、アカウントレベルで管理タグの CREATE 権限が必要です。アカウント管理者とワークスペース管理者には、デフォルトで CREATE があります。

  1. Databricks ワークスペースで、データアイコン。 カタログ をクリックします。
  2. クリック盾のアイコン。 統治 ボタン。
  3. ドロップダウン メニューで、 [管理タグ] をクリックします。
  4. 管理タグを作成 をクリックします。
  5. タグキーにはpiiを入力してください。
  6. 管理タグの説明を入力します。
  7. 許可される値には、 ssnaddressemailを入力してください。このタグキーには、これらの値のみを割り当てることができます。
  8. 作成 をクリックします。
  9. ステップ 4–8 を繰り返して、キーconsentを持つ 2 番目の管理タグを作成します。 許可される値は空欄のままにしてください(キーのみのタグ)。
警告

タグデータはプレーンテキストとして保存され、グローバルに複製される可能性があります。リソースのセキュリティを損なう可能性のあるタグ名、値、または記述子を使用しないでください。例えば、個人情報や機密情報を含むタグ名、値、記述子は使用しないでください。

ステップ 2: 顧客テーブルを作成する

顧客プロファイルを含むカタログ、スキーマ、およびテーブルを作成します。has_consent列は、後で条件付き電子メール マスキングに使用されます。 同意した顧客 ( TRUE ) には、完全な電子メールが表示されます。

Databricks Runtime 16.4 以降のコンピュートに接続されたノートブックで次のコマンドを実行します。

SQL
-- 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;
SQL
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
);
SQL
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_numberhome_address 、およびemail列をpii管理タグでタグ付けします。 ABAC ポリシーでは、列は名前ではなくタグで照合されます。

has_consent列は、 consent管理タグでタグ付けされています。 これは、ステップ 11の同意を考慮したマスキング ポリシーに必要であり、 USING COLUMNSを介してhas_consent UDF に渡します。

SQL
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 アドレスにEUE.U. 、またはEuropeが含まれている場合、その行は非表示になります。
  • TRUE それ以外の場合は、行が表示されます。
SQL
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指定する必要があります。

SQL
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: 行フィルターをテストする

行フィルタポリシーが正しく機能していることを確認するには、次のクエリを実行してください。

SQL
SELECT * FROM abac_tutorial.customers.profiles;

EU域外居住者に関する10件の行のみが返されます。EUの顧客5人(リアム、ソフィー、ハンス、エレナ、ヨハン)は非公開です。

ステップ 7: SSN をマスクするUDFを作成する

このUDFは、渡されたSSN値に対して、完全に匿名化されたプレースホルダーを返します。

SQL
CREATE OR REPLACE FUNCTION redact_ssn(ssn STRING)
RETURNS STRING
RETURN '***-**-****';

ステップ 8: 列マスクを作成する

タグpii = ssnが付いたすべての列を対象とし、それぞれの列にredact_ssn関数を適用するポリシーを作成します。

SQL
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: 列マスクをテストする

行フィルターと列マスクの両方が有効になっていることを確認するには、次のクエリを実行してください。

SQL
SELECT * FROM abac_tutorial.customers.profiles;

SSN は現在***-**-****として返されます。行フィルターも有効になっているため、EU域外居住者のみが返されます。

拡張: 条件付き電子メールマスキング

次のステップは、同意を認識する電子メール マスキングを使用してチュートリアルを拡張します。 オプトインした顧客( has_consent = TRUE )にはメールアドレス全体が表示されます。それ以外の顧客には最初の文字とドメインのみが表示されます。

ステップ 10: 同意を認識する電子メール マスキングUDFを作成する

このUDFは2つの引数を取ります。

  • email: 一致した列からの実際のEメール値
  • consent: 同じ行のhas_consent列の値
SQL
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列はステップ 3consent管理タグでタグ付けされました。 これは、 USING COLUMNS MATCH COLUMNSを介して一致する列のみを参照できるため必要です。has_consentはマスクされていませんが、ポリシーがその値をUDFに渡せるようにタグ付けする必要があります。

SQL
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つのポリシーすべてが連携して動作していることを確認してください。

SQL
SELECT * FROM abac_tutorial.customers.profiles;

has_consent = TRUEの顧客には完全な電子メールが表示されます。 has_consent = FALSEの顧客にはマスクされたバージョンが表示されます。社会保障番号は完全に匿名化されており、EU圏外の顧客のみが返送されます。

ファーストネーム

同意している

メール

社会保障番号

ジョン

True

john.doe@example.com

***-**-****

Jane

False

j***@example.com

***-**-****

Alice

True

alice.j@example.com

***-**-****

Bob

False

b***@example.com

***-**-****

Charlie

True

charlie.d@example.com

***-**-****

Emily

False

e***@example.com

***-**-****

Frank

True

frank.m@example.com

***-**-****

Grace

True

grace.w@example.com

***-**-****

Hank

False

h***@example.com

***-**-****

Ivy

True

ivy.taylor@example.com

***-**-****

まとめ

このチュートリアルでは、3つのABACパターンを解説しました。

  • 行フィルタリング :管理タグに一致する列値に基づいて行を非表示にする
  • 列マスキング :管理タグに一致する列をマスクします
  • 条件付きマスキング : コンテキスト列にタグを付けて UDF に渡すことで、同じ行の別の列の値に基づいて列をマスクします。 USING COLUMNS

掃除

このチュートリアルで作成したすべてのオブジェクトを削除するには、次のコマンドを実行します。条件付き電子メール マスキング ステップをスキップした場合、 DROP POLICY mask_email_by_consent_policyステートメントとDROP FUNCTION mask_email_by_consentステートメントは失敗しますが、これは予想通りです。

SQL
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 を使用します。