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

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

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

このチュートリアルには、次の手順が含まれています。

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

これらの手順を完了したら、必要に応じて、条件付きメール マスク (手順 10 ~ 12) を使用してチュートリアルを拡張できます。

前提条件

  • Databricks Runtime 16.4 以降、またはサーバーレス コンピューティング。
  • アカウント管理者またはワークスペース管理者のアクセス許可 (管理タグを作成するため)。
  • MANAGE ターゲット カタログまたはスキーマに対するアクセス許可。
  • UDF の EXECUTE。

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

手順 1: 管理タグを作成する

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

  • pii タグには、ssn、address、およびemailの3つの許可された値があります
  • 同意列を識別するための consent キー専用タグ (許可された値なし)

管理タグを作成するには、アカウント レベルで管理タグの CREATE アクセス許可が必要です。 アカウント管理者とワークスペース管理者は、既定で CREATE を使用します。

  1. Azure Databricks ワークスペースで、Data icon.Catalog をクリックします。
  2. シールド アイコンをクリックします。 [管理] ボタン。
  3. ドロップダウン メニューの [ 管理タグ] をクリックします。
  4. [ 管理タグの作成] をクリックします。
  5. タグ キーに「 pii」と入力します。
  6. 管理タグの説明を入力します。
  7. 使用できる値には、「 ssn、 address、 email」と入力します。 このタグ キーには、これらの値のみを割り当てることができます。
  8. 作成 をクリックします。
  9. 手順 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) したユーザーには、完全なメールが表示されます。他のユーザーには最初の文字とドメインのみが表示されます。

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