MaxCompute プロジェクトで特定のユーザーにマスキングされた機密データのみの表示を許可するには、動的データマスキングを有効にします。この機能は、データへのアクセスまたは表示中に機密データをリアルタイムで非表示または置換することにより、機密データの漏洩を防ぎます。このトピックでは、例を用いて MaxCompute で動的データマスキングを有効にする方法について説明します。
機能の説明
MaxCompute は、個人識別用情報 (PII) などの機密データを表示時にマスキングすることで保護する、動的データマスキング機能を提供します。この機能は、ビジネス開発のテスト、データ共有、運用保守 (O&M) などのシナリオに適用できます。動的データマスキングは、アクセス制御リスト (ACL) の列レベルの権限とは異なります。ACL の列レベルの権限を使用する場合、ユーザーはアクセス権のない列を除外するために SQL クエリを修正する必要があります。対照的に、データマスキングポリシーでは、ユーザーが既存の SQL クエリを変更する必要はありません。ユーザーがデータにアクセスすると、システムはユーザーの ID とロールに基づいて関連する列のデータを自動的にマスキングします。これにより、クエリ、ダウンロード、関連付け、およびユーザー定義関数 (UDF) の計算中にデータがマスキングされたままになり、機密データの漏洩を防ぎます。
データマスキングポリシーは、マスキング、ハッシュ化、文字置換、数値の丸め、日付の丸めなど、さまざまなメソッドをサポートしており、ID 情報、銀行カード番号、住所、電話番号など、さまざまなマスキング要件に対応します。MaxCompute は、ストレージからのデータ取得に最も近い時点でデータマスキングを実装するため、高いパフォーマンスと堅牢なセキュリティが保証されます。

適用範囲
サポートされているリージョン
この機能はパブリックプレビュー段階にあり、中国 (杭州)、中国 (上海)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (成都)、中国 (香港)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、ドイツ (フランクフルト)、米国 (シリコンバレー) の各リージョンで利用できます。
サポートされているドライバーバージョン
MaxCompute 接続方法
ドライバーバージョン
データマスキングのサポート
Java SDK
0.48.0-public 以降
サポート
odpscmd
0.47.1 以降
サポート
JDBC
3.4.3 以降
サポート
MaxFrame
制限なし
サポート
PyODPS
制限なし
サポート
Go SDK
制限なし
サポート
内部テーブル
MaxCompute は内部テーブルのデータマスキングポリシーをサポートしますが、外部テーブルはサポートしません。
動的データマスキング機能と行レベルの権限機能は相互排他的です。同じテーブルにデータマスキングポリシーと行レベルの権限ポリシーの両方を設定することはできません。
マスキングポリシーを使用して中国語の文字をマスキングする場合、文字コードは UTF-8 である必要があります。
ビュー
従来ビューはデータマスキングポリシーをサポートします。従来ビューのデータマスキングポリシーは、ソーステーブルのポリシーと同期されます。ソーステーブルからデータマスキングポリシーをアタッチまたはデタッチすると、その変更は従来ビューにも反映されます。
マテリアライズドビューを作成すると、ソーステーブルのデータマスキングポリシーがマテリアライズドビューに適用されます。マテリアライズドビューの作成後にソーステーブルに新しいマスキングポリシーをアタッチしたり、既存のマスキングポリシーをデタッチしたりしても、マテリアライズドビューのマスキングポリシーは変更されません。
データマスキングポリシー
ユーザーが機密データにアクセスする際に、複数のデータマスキングポリシーが同時に有効である場合、システムは最も優先度の高いポリシーに基づいて機密データをマスキングします。詳細については、「事前定義されたデータマスキングポリシーの優先度」をご参照ください。
データマスキングのフロー
プロジェクトオーナーおよび Super_Administrator または Admin ロールが割り当てられたユーザーは、データマスキングポリシーを管理できます。ユーザーが機密データを含むテーブルにアクセスすると、システムはユーザーまたはロールに関連付けられたマスキングポリシーを確認し、マスキングされたデータまたはプレーンテキストのデータを返します。

データマスキングコマンド
プロジェクトのデータマスキング機能を有効または無効にする
odps.data.masking.policy.enable は、データマスキング機能を有効または無効にするために使用されるプロジェクトレベルのプロパティです。この機能を有効または無効にできるのは、プロジェクトオーナーまたはプロジェクトレベルの Super_Administrator もしくは Admin ロールが割り当てられたユーザーのみです。詳細については、「ユーザーへの組み込み管理ロールの割り当て」をご参照ください。
プロジェクトのデータマスキング機能を有効にします。
setproject odps.data.masking.policy.enable=true;プロジェクトのデータマスキング機能を無効にします。
setproject odps.data.masking.policy.enable=false;
データマスキングポリシーの作成と削除
コマンドフォーマット
データマスキングポリシーを作成します。
CREATE DATA MASKING POLICY [IF NOT EXISTS] <policy_name> TO { USER <user_list> | ROLE <role_list> | default } USING <定義済みマスキングポリシー>;データマスキングポリシーを削除します。
DROP DATA MASKING POLICY <policy_name>;
パラメーターの説明
パラメーター
必須
説明
policy_name
はい
データマスキングポリシーの名前。ポリシー名は大文字と小文字を区別せず、特殊文字を含めることはできません。英字、数字、アンダースコア (_) のみを含めることができます。名前は英字で始めることを推奨します。名前の長さは 128 バイトを超えることはできません。
USER | ROLE | default
はい
3 つのパラメーターから 1 つを選択します。
USER:特定のユーザーのデータをマスキングします。<user_list> には、ユーザーの名前を指定します。MaxCompute で
list users;コマンドを実行してロール情報を取得できます。ROLE:特定のロールのデータをマスキングします。<role_list> には、ロールの名前を指定します。MaxCompute で
list roles;コマンドを実行してロール情報を取得できます。default:デフォルトのデータマスキングポリシー。ユーザーまたはロールが機密列にアクセスした際に、一致するデータマスキングポリシーがない場合、デフォルトのポリシーが使用されて機密列のデータがマスキングされます。
定義済みマスキングポリシー
はい
定義済みのデータマスキングポリシー。詳細については、「定義済みデータマスキングポリシー」をご参照ください。
例
例 1: ユーザー userA、userB、userC の MD5 ハッシュマスキングポリシーを作成します。
CREATE data masking policy IF NOT EXISTS masking_test_001 TO USER (userA, userB, userC) USING MASKED_MD5(0);例 2:プロジェクトの開発者および O&M ロールのために MD5 ハッシュマスキングポリシーを作成します。
CREATE data masking policy IF NOT EXISTS masking_test_001 TO ROLE (role_project_deploy, role_project_dev) USING MASKED_MD5(0);
機密データ列へのデータマスキングポリシーの適用
コマンドフォーマット
--テーブルの機密データ列にデータマスキングポリシーを適用します。 APPLY DATA MASKING POLICY <policy_name> BIND TO TABLE <table_name> COLUMN <column_name>; --テーブルの機密データ列に対して指定されたデータマスキングポリシーをキャンセルします。 APPLY DATA MASKING POLICY <policy_name> UNBIND FROM TABLE <table_name> COLUMN <column_name>; --テーブルの機密データ列に対するすべてのデータマスキングポリシーをキャンセルします。 APPLY DATA MASKING POLICY UNBIND ALL FROM TABLE <table_name> COLUMN <column_name>; --テーブルのすべての機密データ列に対するすべてのデータマスキングポリシーをキャンセルします。 APPLY DATA MASKING POLICY UNBIND ALL FROM TABLE <table_name>;パラメーターの説明
パラメーター
必須
説明
policy_name
はい
データマスキングポリシーの名前。
table_name
はい
機密データを含むテーブルの名前。
column_name
はい
機密データを含む列の名前。
データマスキングポリシーの表示
コマンドフォーマット
--データマスキングポリシーの作成情報を表示します。 DESC DATA MASKING POLICY <policy_name>; --機密データ列や適用されたデータマスキングポリシーの情報を含む、テーブルの拡張情報を表示します。 DESC EXTENDED <table_name>; --現在のプロジェクト内のすべてのデータマスキングポリシーの名前を表示します。 LIST DATA MASKING POLICY; --指定されたユーザーにアタッチされているデータマスキングポリシーの名前を表示します。 LIST DATA MASKING POLICY TO USER <user_name>; --指定されたロールにアタッチされているデータマスキングポリシーの名前を表示します。 LIST DATA MASKING POLICY TO ROLE <role_name>; --指定されたテーブルにアタッチされているすべてのデータマスキングポリシーの名前を表示します。 LIST DATA MASKING POLICY ON <table_name>; --指定されたテーブルの指定された列にアタッチされているすべてのデータマスキングポリシーの名前を表示します。 LIST DATA MASKING POLICY ON <table_name> TO COLUMN <column_name>;パラメーターの説明
パラメーター
必須
説明
policy_name
はい
データマスキングポリシーの名前。
table_name
はい
機密データを含むテーブルの名前。
column_name
はい
機密データを含む列の名前。
user_name
はい
ユーザー名。
role_name
はい
ロールの名前。
定義済みデータマスキングポリシー
事前定義されたデータマスキングポリシーには、マスキング、ハッシュ化、文字置換、丸めが含まれます。データを保護するために、機密データのデータ型に基づいて事前定義されたデータマスキングポリシーを選択できます。
ポリシータイプ | ポリシー名 | コマンドフォーマット | 説明 |
一般 | マスキングなし | UNMASKED | データをマスキングしません。 サポート対象の型:すべての型。 |
NULL に設定 | MASKED_NULLIFY | 値を NULL に設定します。データマスキング後、NULL が返されます。
| |
デフォルト値を割り当て | MASKED_DV | デフォルト値を使用してデータをマスキングします。各データ型のデフォルト値の詳細については、「MASKED_DV ポリシーのデータ型のデフォルト値」をご参照ください。
| |
年のみ保持 | MASKED_DATE_YEAR | 時刻値の年部分のみを保持します。年以外の部分は 1 月 1 日 00:00 (UTC) に設定されます。
| |
丸め | MASKED_POINT_RESERVE(<num>) | 値を丸めて、小数点以下 0〜5 桁を保持します。
| |
マスク | 文字列の先頭と末尾をマスク | MASKED_STRING_MASKED_BA(<before>, <after>) | 文字列の先頭と末尾の部分を
|
文字列の中央をマスク | MASKED_STRING_UNMASKED_BA(<before>, <after>) | 文字列の先頭と末尾の部分をプレーンテキストで表示し、中央部分の文字をアスタリスク (
| |
ハッシュ | SHA256 ハッシュ化 | MASKED_SHA256(<salt>) | SHA256 ハッシュアルゴリズムを使用してデータをマスキングします。
|
SHA512 ハッシュ化 | MASKED_SHA512(<salt>) | SHA512 ハッシュアルゴリズムを使用してデータをマスキングします。
| |
MD5 ハッシュ | MASKED_MD5(<salt>) | MD5 ハッシュアルゴリズムを使用してデータをマスキングします。
| |
SM3 ハッシュ | MASKED_SM3(<salt>) | SM3 ハッシュアルゴリズムを使用してデータをマスキングします。
| |
文字置換 | ランダムな文字置換 | MASKED_REPLACE_RANDOM(<position>) | データをランダムな文字に置き換えます。置換後も文字列の長さは変わりません。ランダムな値には数字と文字が含まれます。
|
先頭と末尾のランダム文字置換 | MASKED_REPLACE_RANDOM_BA(<before>, <after>) | データの先頭と末尾をランダムな文字に置き換えます。置換後も文字列の長さは変わりません。ランダムな値には数字と文字が含まれます。
| |
固定文字置換 | MASKED_REPLACE_FIXED(<position>, <fixed_string>) |
|
例
機密性の高い個人情報をマスキングする
この例では、データマスキングポリシーを設定して機密性の高い個人情報をマスキングする方法を示します。
データを準備します。
個人情報用のテーブルを作成し、機密データを挿入します。
-- 機密情報用のテーブルを作成します。 CREATE TABLE if NOT EXISTS personal_info ( id bigint COMMENT 'ユーザーの一意の ID。', name string COMMENT 'ユーザーの名前。', age int COMMENT 'ユーザーの年齢。', gender string COMMENT 'ユーザーの性別。', height float COMMENT 'ユーザーの身長。', birthday date COMMENT 'ユーザーの生年月日。', phone_number string COMMENT 'ユーザーの電話番号。', email string COMMENT 'ユーザーのメールアドレス。', address string COMMENT 'ユーザーの住所。', salary decimal(18, 2) COMMENT 'ユーザーの給与。', create_time timestamp COMMENT 'ユーザー情報が作成された時刻。', update_time timestamp COMMENT 'ユーザー情報が更新された時刻。', is_deleted boolean COMMENT 'ユーザー情報が削除されたかどうかを示すフラグ。' ); -- 機密データを挿入します。 INSERT INTO personal_info VALUES (1, '田中 太郎', 18, 'Male', 178.56, '1990-01-01', '13800000000', 'taro.tanaka@example.com', '東京都千代田区', 5000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00', false), (2, '鈴木 花子', 20, 'Female', 162.70, '1992-02-02', '13900000000', 'hanako.suzuki@example.com', '大阪府大阪市中央区', 6000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00',false), (3, '佐藤 次郎', 22, 'Male', 185.21, '1994-03-03', '14000000000', 'jiro.sato@example.com', '福岡県福岡市博多区', 7000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00', false);データマスキングポリシーの設定
名前の最初の文字のみを保持し、他の文字を
*に置き換えます。CREATE data masking policy IF NOT EXISTS masking_name TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_STRING_UNMASKED_BA(1, 0); apply data masking policy masking_name bind TO TABLE personal_info COLUMN name;height フィールドの値を丸めます。
CREATE data masking policy IF NOT EXISTS masking_height TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_POINT_RESERVE(0); apply data masking policy masking_height bind TO TABLE personal_info COLUMN height;生年月日の年のみを保持します。
CREATE data masking policy IF NOT EXISTS masking_birthday TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_DATE_YEAR; apply data masking policy masking_birthday bind TO TABLE personal_info COLUMN birthday;デフォルトユーザーの電話番号を SM3 アルゴリズムでハッシュ化します。
CREATE DATA MASKING POLICY default_sm3 TO DEFAULT USING MASKED_SM3(0); apply data masking policy default_sm3 bind TO TABLE personal_info COLUMN phone_number;
データマスキングポリシーの対象となるアカウントを使用して、マスキングされたデータをクエリします。
SELECT id, name, height, birthday, phone_number FROM personal_info; -- マスキング前 +------------+-----------+--------+----------+--------------+ | id | name | height | birthday | phone_number | +------------+-----------+--------+----------+--------------+ | 1 | 田中 太郎 | 178.56 | 1990-01-01 | 13800000000 | | 2 | 鈴木 花子 | 162.7 | 1992-02-02 | 13900000000 | | 3 | 佐藤 次郎 | 185.21 | 1994-03-03 | 14000000000 | +------------+-----------+--------+----------+--------------+ -- マスキング後 +------------+------------+------------+------------+--------------+ | id | name | height | birthday | phone_number | +------------+------------+------------+------------+--------------+ | 1 | 田* | 179.0 | 1990-01-01 | lvYJaH4ElL2ilpQx/8tfMUw7xP22yblIgmfWp0/msUQ= | | 2 | 鈴* | 163.0 | 1992-01-01 | 9fFWacNSwCRZLAjMHqunlfwkqhTbP2ubuDOeOSh4N1c= | | 3 | 佐* | 185.0 | 1994-01-01 | k/0JoQCSarJg9ATJ5tyVnhQf1jIBxHXRbB+cvUm4OmE= | +------------+------------+------------+------------+--------------+
すべてのユーザーとロールのデータをデフォルトでマスキングする
次の例は、ユーザーまたはロールが複数のデータマスキングポリシーに一致する場合、最も優先度の高いポリシーが有効になることを示しています。
デフォルトユーザーには MASKED_SHA256(5) マスキングポリシーを使用します。
CREATE DATA MASKING POLICY default_hash_policy
TO DEFAULT
USING MASKED_SHA256(5);特別なユーザー A と B には UNMASKED ポリシーを使用します。
CREATE DATA MASKING POLICY ab_unmask_policy
TO USER (A, B)
USING UNMASKED;結果:ユーザー A と B はプレーンテキストデータにアクセスできます。他のユーザーは SHA256 ハッシュアルゴリズムでマスキングされたデータにのみアクセスできます。
ユーザー A と B は MASKED_SHA256(5) と UNMASKED の両方のポリシーにヒットします。UNMASKED ポリシーは優先度が高いため有効になります (詳細については、「事前定義されたマスキングポリシーの優先度」をご参照ください)。他のユーザーは MASKED_SHA256(5) ポリシーにヒットします。
付録
定義済みマスキングポリシーの優先順位
ユーザーが機密データにアクセスする際に、複数のデータマスキングポリシーが有効な場合、優先度の高いポリシーが実行されます。
たとえば、ユーザー A が col_string 列にアクセスし、優先度 3 の MASKED_REPLACE_RANDOM(3) と優先度 4 の MASKED_SM3 の 2 つのデータマスキングポリシーに一致した場合、システムは優先度の高いポリシーを実行します。この場合、MASKED_REPLACE_RANDOM(3) が使用され、ユーザー A にはランダムな文字に置き換えられたデータが表示されます。
優先度 | 事前定義されたデータマスキングポリシー |
0 (高) | UNMASKED |
1 | MASKED_POINT_RESERVE(num) |
2 | MASKED_DATE_YEAR |
3 | MASKED_STRING_MASKED_BA(before, after) |
MASKED_STRING_UNMASKED_BA(before, after) | |
MASKED_REPLACE_RANDOM(position) | |
MASKED_REPLACE_RANDOM_BA(before, after) | |
MASKED_REPLACE_FIXED(position) | |
4 | MASKED_SHA256 |
MASKED_SHA512 | |
MASKED_MD5 | |
MASKED_SM3 | |
5 | MASKED_DV |
6 (低) | MASKED_NULLIFY |
MASKED_DV データマスキングポリシーのデフォルト値
データ型 | デフォルト値 |
bigint | 0 |
double | 0.0 |
decimal | 0 |
string | "" |
datetime | DATETIME'1970-01-01 00:00:00' (UTC) |
boolean | false |
tinyint | 0 |
smallint | 0 |
int | 0 |
binary | '' |
float | 0.0 |
double | 0.0 |
decimal | 0 |
varchar(n) | "" |
char(n) | " " (n 個のスペース) |
date | DATE'1970-01-01' |
timestamp | TIMESTAMP'1970-01-01 00:00:00' (UTC) |
timestamp_ntz | TIMESTAMP'1970-01-01 00:00:00' (UTC) |
array | {子クラスのデフォルト値} |
map | {key:value} (key と value は子クラスのデフォルト値に対応) |
json | "" |
struct | (子クラスのデフォルト値) |