MaxCompute プロジェクトで、特定のユーザーには機密データの表示を許可しつつ、重要な情報を非表示にするには、動的データマスキングを有効にします。この機能は、アクセス時に機密データをリアルタイムで非表示または置換することで、データ漏洩を防ぎます。本トピックでは、MaxCompute で動的データマスキングを有効にする方法と、その使用例について説明します。
はじめに
MaxCompute は、開発、テスト、データ共有、運用などのシナリオで、個人を特定できる情報 (PII) などの機密データを保護するために、動的データマスキングを提供します。列レベルのアクセス制御リスト (ACL) では、ユーザーがアクセスできない列を除外するためにクエリを変更する必要があるのに対し、動的データマスキングは既存のクエリを変更することなく自動的に機能します。ユーザーがデータにアクセスすると、システムはユーザーまたはそのロールに基づいて適切なマスキングポリシーを自動的に適用します。これにより、クエリ、ダウンロード、結合、ユーザー定義関数 (UDF) の計算時にデータがマスクされ、機密データの漏洩リスクが軽減されます。
マスキングポリシーは、マスキング、ハッシュ化、文字置換、数値の丸め、日付の切り捨てなど、さまざまな方法をサポートし、識別番号、銀行カード番号、住所、電話番号などのデータを保護します。MaxCompute は、ストレージからデータを取得する最も早い段階でデータマスキングを適用します。このアプローチにより、高いパフォーマンスとセキュリティが確保されます。

注意事項
サポートリージョン
この機能はパブリックプレビュー段階のため、次のリージョンでのみ利用できます:China (Hangzhou)、China (Shanghai)、China (Beijing)、China (Zhangjiakou)、China (Ulanqab)、China (Shenzhen)、China (Chengdu)、China (Hong Kong)、Japan (Tokyo)、Singapore、Malaysia (Kuala Lumpur)、Indonesia (Jakarta)、Germany (Frankfurt)、US (Silicon Valley)、US (Virginia)。
サポート対象のドライバーバージョン
接続方法
最小バージョン
マスキングのサポート
Java SDK
0.48.0-public 以降
サポート
odpscmd
0.47.1 以降
サポート
JDBC
3.4.3 以降
サポート
MaxFrame
すべてのバージョン
サポート
PyODPS
すべてのバージョン
サポート
Go SDK
すべてのバージョン
サポート
内部テーブルと外部テーブル
マスキングポリシーは、MaxCompute の内部テーブルと外部テーブルの両方でサポートされています。
動的データマスキングと行レベルのアクセス許可は相互に排他的です。マスキングポリシーが既に設定されているテーブルに行レベルのアクセス許可を設定することはできません。逆の場合も同様です。
中国語の文字にマスキングポリシーを適用する場合、文字エンコーディングは UTF-8 にする必要があります。
ビュー
標準ビューはマスキングポリシーをサポートします。ビューのポリシーは、ソーステーブルのポリシーと同期されます。ソーステーブルにマスキングポリシーがバインドまたはバインド解除されると、その変更はビューに即座に反映されます。
マテリアライズドビューは、作成時にソーステーブルからマスキングポリシーを継承します。その後のソーステーブルのポリシーへの変更は、マテリアライズドビューには反映されません。
マスキングポリシー
ユーザーに複数のマスキングポリシーが適用される場合、優先度が最も高いポリシーが使用されます。詳細については、「ポリシーの優先度」をご参照ください。
仕組み
プロジェクト所有者、または Super_Administrator ロールか Admin ロールを持つユーザーは、マスキングポリシーを管理できます。ユーザーが機密データを含むテーブルにアクセスすると、システムはユーザーまたはそのロールに関連付けられたマスキングポリシーを確認し、その結果に応じてマスクされたデータまたはプレーンテキストデータを返します。

マスキング権限
プロジェクトの動の的データマスキング機能を有効化または無効化できるのは、プロジェクト所有者、またはプロジェクトレベルの Super_Administrator ロールや管理者ロールが付与されたユーザーのみです。
テーブルのマスキングポリシーを管理するために必要な権限は次のとおりです。
デフォルトでは、プロジェクト所有者、またはプロジェクトレベルの Super_Administrator ロールや管理者ロールを持つユーザーが、必要な権限を持っています。
カスタム管理プロジェクトロールを使用して、RAM ユーザーまたは RAM ロールに権限を付与することもできます。MaxCompute コンソールにログインします。左側のナビゲーションペインで、 を選択します。プロジェクトの管理ページで、プロジェクト設定 ページに移動し、ロール権限 タブを選択します。プロジェクトレベルロールの作成 をクリックして、MaxCompute 権限を持つプロジェクトロールを作成します。[Role Type] を [Admin (management role)] に設定し、次の例のようなポリシーステートメントを使用します。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "odps:CreateDataMaskingPolicy","odps:ListDataMaskingPolicies"], "Resource": [ "acs:odps:*:projects/[project_name]/authorization/datamaskingpolicies" ] }, { "Effect": "Allow", "Action": [ "odps:DropDataMaskingPolicy", "odps:DescribeDataMaskingPolicy" ], "Resource": [ "acs:odps:*:projects/[project_name]/authorization/datamaskingpolicies/*" ] }, { "Effect": "Allow", "Action": "odps:ApplyDataMaskingPolicy", "Resource": [ "acs:odps:*:projects/[project_name]/authorization/tables/*", "acs:odps:*:projects/[project_name]/authorization/datamaskingpolicies/*" ] } ] }
コマンド
データマスキングの有効化または無効化
データマスキングスイッチ odps.data.masking.policy.enable は、プロジェクトレベルのプロパティです。このプロパティを設定できるのは、プロジェクト所有者、またはプロジェクトレベルの Super_Administrator または Admin ロールを付与されたユーザーのみです。詳細については、「組み込みロールの管理」をご参照ください。
データマスキングを有効化または無効化した後、キャッシュ更新のレイテンシーにより、変更が反映されるまで約 15 分かかります。
プロジェクトの動的データマスキングを有効にします。
setproject odps.data.masking.policy.enable=true;プロジェクトの動的データマスキングを無効にします。
setproject odps.data.masking.policy.enable=false;
マスキングポリシーの作成と削除
1 つのプロジェクトに、最大 1,000 個のマスキングポリシーを設定できます。
構文
マスキングポリシーを作成します。
CREATE DATA MASKING POLICY [IF NOT EXISTS] <policy_name> TO { USER <user_list> | ROLE <role_list> | default } USING <Predefined Masking Policy>;マスキングポリシーを削除します。
DROP DATA MASKING POLICY <policy_name>;
パラメーター
パラメーター
必須
説明
policy_name
はい
マスキングポリシーの名前です。ポリシー名はケースインセンシティブで、英字 (a–z、A–Z)、数字 (0–9)、アンダースコア (_) のみで構成できます。名前は英字で始めることを推奨します。名前は最大 128 バイトまで指定できます。
USER | ROLE | default
はい
次のいずれかのオプションを選択します。
USER: 特定のユーザーにポリシーを適用します。
<user_list>には、ユーザー名を指定します。list users;コマンドを実行してユーザー情報を表示できます。ROLE: 特定のロールにポリシーを適用します。
<role_list>には、ロールの名前を指定します。list roles;コマンドを実行してロール情報を表示できます。default:デフォルトでポリシーを適用します。ユーザーまたはロールに一致する他のマスキングポリシーがない場合、デフォルトポリシーが適用されます。
Predefined Masking Policy
はい
事前定義されたマスキングポリシーです。詳細については、「事前定義されたマスキングポリシー」をご参照ください。
例
例 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:プロジェクトの開発ロールと運用ロールに対して 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 <table_name> COLUMN <column_name>;パラメーター
パラメーター
必須
説明
policy_name
はい
マスキングポリシーの名前です。
table_name
はい
機密データを含むテーブルの名前です。
column_name
はい
機密データを含む列の名前です。
user_name
はい
ユーザー名です。
role_name
はい
ロール名です。
プリセットのマスキングポリシー
プリセットのマスキングポリシーには、マスキング、ハッシュ化、文字置換、丸めなどの方法があります。データ型と保護要件に基づいてポリシーを選択してください。
ポリシータイプ | ポリシー名 | 構文 | 説明 |
一般 | マスキングなし | UNMASKED | プレーンテキストでデータを返します。 サポートされるデータ型:すべて。 |
Null 化 | MASKED_NULLIFY | データを NULL に置き換えます。
| |
デフォルト値 | MASKED_DV | データを対応するデータ型のデフォルト値に置き換えます。詳細については、「MASKED_DV のデフォルト値」をご参照ください。
| |
日付の切り捨て | MASKED_DATE_YEAR | 時刻値の年の部分のみを保持し、月、日、時刻をその年の開始時点 (1 月 1 日 00:00:00 UTC) にリセットします。
| |
丸め | MASKED_POINT_RESERVE(<num>) | 数値を指定された小数点以下の桁数 (0 から 5) に丸めます。
| |
マスキング | 先頭と末尾のマスク | MASKED_STRING_MASKED_BA(<before>, <after>) | 文字列の先頭と末尾をアスタリスク (
|
中央のマスク | MASKED_STRING_UNMASKED_BA(<before>, <after>) | 文字列の先頭と末尾をプレーンテキストで表示し、中間部分をアスタリスク(
| |
ハッシュ化 | SHA-256 ハッシュ化 | MASKED_SHA256(<salt>) | SHA-256 ハッシュアルゴリズムを使用してデータをマスクします。
|
SHA-512 ハッシュ化 | MASKED_SHA512(<salt>) | SHA-512 ハッシュアルゴリズムを使用してデータをマスクします。
| |
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, '男性', 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, '女性', 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, '男性', 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;身長の値を最も近い整数に丸めます。
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;生年月日については、年を保持し、月と日を 01-01 にリセットします。
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 はプレーンテキストデータにアクセスできます。他のユーザーは SHA-256 でハッシュ化されたデータにのみアクセスできます。
ユーザー 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, fixed_string) | |
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' |
ARRAY | 空の配列 |
MAP | 空のマップ |
JSON | "" (空の文字列) |
STRUCT | (フィールド型のデフォルト値) |