タグイントロスペクションを使用して型でPII列をマスクする
このチュートリアルでは、個人を特定できる情報(PII)のマスキングルールを選択するために、ガバナンス対象の列タグの値を使用する方法を説明します。属性ベースのアクセス制御(ABAC)による単一の列マスクポリシーで、Eメールアドレスまたは電話番号としてタグ付けされたすべての列を対象とし、1つのSQLユーザー定義関数(UDF)が各列に適切なマスクを適用します。このポリシーでは、get_column_tag_value()タグのイントロスペクション関数を使用して、各列のタグ値をUDFに渡します。
タグのイントロスペクション関数の構文と動作については、タグのイントロスペクション関数をご覧ください。
前提条件
- ポリシーを作成するためのSQL Warehouse、Serverlessコンピュート、またはDatabricks Runtime 18 LTS以降。保護されたテーブルに対してクエリーを実行するには、ABAC コンピュート要件を満たすコンピュートを使用します。
- アカウントレベルでの管理タグに対する
CREATE権限。アカウント管理者とワークスペース管理者には、defaultでこれらの権限があります。 - 作成する管理タグに対する
ASSIGN権限。アカウント管理者には、defaultでこれらの権限があります。「 管理タグの権限の管理」を参照してください。 - ステップ3で列タグを設定するための
contactsテーブルに対するAPPLY TAG権限。 MANAGEターゲット・カタログまたはスキーマに対する権限。EXECUTEUDF で。
シナリオ
組織では、PII列を管理タグpii_typeで分類しています。このタグの値は、emailやphoneなどのデータの種類を識別します。種類ごとに異なるマスクが必要です。Eメールアドレスのローカル部分は隠し、電話番号の下4桁は保持します。
タグイントロスペクションを使用すると、1つのポリシーでpii_typeでタグ付けされたすべての列を保護し、各 PII タイプに異なるマスクを適用できます。
ポリシーは pii_type タグを持つすべての列に一致し、各列のタグ値を UDF に渡します。UDF はその値を使用して、適切なマスクを選択します。
PII タイプごとに個別のポリシーを作成するのではなく、1 つのポリシーを PII タイプ間で再利用できます。
タグイントロスペクションが必要かどうかは、タグの値によって UDF がどのようにデータをマスクするかが決定されるかどうかによって異なります。
対象 | パターン |
|---|---|
UDF は、タグ値に基づいて異なるマスクを適用します |
|
UDF は、一致するすべての列に同じマスクを適用します | タグのイントロスペクションなしの |
ステップ 1: 管理タグを作成する
2 つの PII 型で許可された値を持つ管理タグを作成するには、次を実行します:
CREATE GOVERNED TAG pii_type
DESCRIPTION 'PII type used by the ABAC tag introspection tutorial'
VALUES ('email', 'phone');
管理タグのキーは、アカウント内で一意です。pii_type という名前の管理タグが既に存在する場合、ステートメントは ALREADY_EXISTS エラーを返します。別のキーを選択し、チュートリアル全体でそれを使用してください。完全な構文については、「CREATE 管理タグ」を参照してください。
タグのデータはプレーンテキストとして保存され、全体で複製される可能性があります。リソースのセキュリティを危険にさらす可能性のあるタグ名、値、または記述子は使用しないでください。たとえば、個人情報や機密情報を含むタグ名、値、または記述子は使用しないでください。
ステップ 2: サンプルデータの作成
カタログ、スキーマ、Eメール列と電話番号列を含むcontactsテーブルを作成します:
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;
CREATE SCHEMA IF NOT EXISTS introspection_demo;
USE SCHEMA introspection_demo;
CREATE OR REPLACE TABLE contacts (
contact_id INT,
email STRING,
phone STRING
);
INSERT INTO contacts VALUES
(1, 'alex@example.com', '123-456-7890'),
(2, 'sam@example.com', '234-567-8901');
ステップ 3: 管理タグを適用する
同じタグキーの異なる値で 2 つの列にタグを付けます:
ALTER TABLE contacts
ALTER COLUMN email SET TAGS ('pii_type' = 'email');
ALTER TABLE contacts
ALTER COLUMN phone SET TAGS ('pii_type' = 'phone');
両方の列で pii_type タグキーが共有されるようになりました。タグ値は、UDF が適用するマスクを示します。
ステップ 4: マスキング UDF を作成する
列の値とその PII 型を受け取る SQL UDF を作成します:
CREATE OR REPLACE FUNCTION abac_tutorial.introspection_demo.mask_pii_by_type(
col_value STRING,
pii_type STRING
)
RETURNS STRING
RETURN CASE
WHEN col_value IS NULL THEN NULL
WHEN pii_type = 'email' THEN regexp_replace(col_value, '(^[^@]+)', '***')
WHEN pii_type = 'phone' THEN concat('***-***-', right(col_value, 4))
ELSE '***'
END;
UDF が認識しない PII タイプ、またはタイプをまったく受信しない場合、ELSE Branch は値を完全にマスクします。
ステップ 5:列マスク・ポリシーを作成する
pii_type タグを持つスキーマ内のすべての列に適用される単一のポリシーを作成します:
CREATE POLICY mask_pii_columns
ON SCHEMA abac_tutorial.introspection_demo
COLUMN MASK abac_tutorial.introspection_demo.mask_pii_by_type
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag('pii_type') AS pii_col
ON COLUMN pii_col
USING COLUMNS (get_column_tag_value(pii_col, 'pii_type'));
このポリシーでは:
has_tag('pii_type')タグを持つすべての列に、その値にかかわらず一致します。ON COLUMN pii_col一致した列のデータをUDFの最初の引数として渡します。USING COLUMNS (get_column_tag_value(pii_col, 'pii_type'))その列のタグ値であるemailまたはphoneを、第 2 引数として渡します。
ステップ 6:結果を確認する
ポリシーは account users に適用されるため、ユーザーにも適用されます。マスクされた値を確認するには、次をラン:
SELECT * FROM abac_tutorial.introspection_demo.contacts;
クエリーの結果:
contact_id email phone
1 ***@example.com ***-***-7890
2 ***@example.com ***-***-8901
Eメールと電話番号の列はそれぞれ異なる方法でマスクされますが、同じポリシーで両方とも保護されます。
このパターンが機能する理由
ポリシーは、値が email か phone かに関係なく、タグキーに基づいて列を照合します。UDF はタグ値を受け取り、対応するマスクを適用します。
ssn などの別の PII 型をサポートするには:
- 管理タグの許可される値に
ssnを追加します。 - UDFに
ssnBranchを追加します。 - 新しい列にタグを付けます。
ポリシーは変更されません。
このパターンは、データのマスク方法のみが異なるポリシーを統合します。異なる PII 型に異なる TO または EXCEPT プリンシパルが必要な場合は、引き続き個別のポリシーが必要です。例については、「感度ティアによる複数ドメインの列マスキングを実装する」を参照してください。
get_tag_value() を使用したテーブルタグのイントロスペクションについては、タグイントロスペクション関数を参照してください。
クリーンアップ
このチュートリアルで作成されたオブジェクトを削除するには、以下をランします。
DROP POLICY mask_pii_columns ON SCHEMA abac_tutorial.introspection_demo;
DROP FUNCTION IF EXISTS abac_tutorial.introspection_demo.mask_pii_by_type;
DROP TABLE IF EXISTS abac_tutorial.introspection_demo.contacts;
DROP SCHEMA IF EXISTS abac_tutorial.introspection_demo CASCADE;
他の ABAC チュートリアルでも abac_tutorial カタログを使用しているため、このクリーンアップではそのまま残します。削除するには、DROP CATALOG IF EXISTS abac_tutorial CASCADE をランします。
管理タグを削除するには、先にポリシーをドロップしてから、次を実行します。
DROP GOVERNED TAG pii_type;