MaxCompute は、ラベルベースのアクセス制御をサポートしています。プロジェクトレベルで、テーブルまたは列に秘密度レベルのラベルを、ユーザーにアクセスレベルのラベルを割り当てることができます。ユーザーは、データの秘密度レベルが割り当てられたアクセスレベル以下の場合にのみ、MaxCompute プロジェクト内のデータにアクセスできます。このトピックでは、これらの権限を管理する方法について説明し、例を示します。
仕組み
ラベルベースのアクセス制御 (LabelSecurity とも呼ばれます) は、プロジェクトレベルの強制アクセス制御 (MAC) ポリシーで、デフォルトでは無効になっています。
プロジェクトオーナーは、SET LabelSecurity=true|false; コマンドを実行して、プロジェクトレベルで LabelSecurity を有効または無効にすることができます。
LabelSecurity を有効にした後、プロジェクトオーナーは次の操作を実行する必要があります。
テーブルまたは列に明確な 秘密度レベル を定義します。
ユーザーの アクセスレベル 分類を定義します。
テーブルまたは列に秘密度レベルの ラベル を割り当て、ユーザーまたはロールにアクセスレベルの ラベル を割り当てます。
ユーザーが秘密度レベルが割り当てられたデータにアクセスする場合、対象テーブルに対する SELECT 権限を持っている必要があり、データの秘密度レベルがユーザーのアクセスレベル以下の場合にのみ、テーブルまたは列のデータにアクセスできます。
サポートされる機能
列レベルのサポート:サポートされる最も細かい粒度は列レベルです。テーブル内の任意の 列 に秘密度レベルのラベルを設定できます。これにより、テーブルは異なる秘密度レベルの列で構成できます。
ビューのサポート:ビューに秘密度レベルのラベルを設定できます。ビュー の秘密度レベルのラベルは、その ソーステーブル のラベルとは独立しています。
パーティション列 への秘密度レベルのラベルの設定は サポートされていません。
サポートされる操作
プロジェクトオーナーまたは Admin ロールを持つユーザーは、次の操作を実行できます。
これらの操作は、MaxCompute クライアント、MaxCompute Studio、DataWorks などのツールを使用して実行できます。
デフォルトのアクセス制御ポリシー
No-ReadUp:ユーザーが自身のアクセスレベルより高い秘密度レベルのデータに アクセスする ことを禁止します。ビジネスシナリオでこれが必要な場合は、明示的な付与を実行する必要があります。詳細については、「ラベル権限の明示的な付与」をご参照ください。
Trusted-User:ユーザーが自身のアクセスレベル以下の秘密度レベルのデータを 書き込む ことを許可します。新しく作成されたテーブルまたはビューは、デフォルトでレベル 0 (機密ではない) に設定されます。新しいユーザーもデフォルトでレベル 0 に設定されます。
注意事項
一部の従来の MAC システムは、プロジェクト内でのデータの任意の配布を防ぐために、より複雑なセキュリティポリシーをサポートしています。
たとえば、No-WriteDown ポリシーは、ユーザーが自身のアクセスレベルより低い秘密度レベルにデータを書き込むことを禁止します。データの秘密度レベルの管理コストを削減するため、MaxCompute は デフォルトでは No-WriteDown ポリシーをサポートしていません。
プロジェクトで同様の制限が必要な場合は、
Set ObjectCreatorHasGrantPermission=false;コマンドを実行して、プロジェクトのセキュリティ構成を変更し、ニーズを満たすことができます。異なるプロジェクト間でのデータの流出を防ぐために、
set ProjectProtection=true;コマンドを実行して ProjectProtection 機能を有効にすることができます。有効にすると、この機能はデータアクセスを現在のプロジェクトに制限し、データがプロジェクトから流出することを防ぎます。プロジェクトデータ保護の詳細については、「データ保護メカニズム」をご参照ください。オブジェクトを削除すると、MaxCompute は自動的に関連するすべてのラベル権限を取り消します。
プロジェクトからユーザーを削除すると、MaxCompute はそのユーザーの権限を保持します。後でユーザーをプロジェクトに再度追加すると、以前の権限が再度有効になります。ユーザーの権限情報を完全にクリアするには、「削除されたユーザーが残した権限情報を完全にクリアする」をご参照ください。
前提条件
ラベルベースのアクセス制御ソリューションを使用する前に、次の情報が必要です。
権限受領者のアカウント名またはロール名。アカウントまたはロールを MaxCompute プロジェクトに追加する必要があります。
Alibaba Cloud アカウントの形式: ALIYUN$<account_id>
RAM ユーザーアカウントの形式: RAM$<account_id>:<RAM_user_UID>
RAM ロールアカウントの形式:
RAM$<account_id>:role/<RAM_role_name>
MaxCompute クライアントで
LIST users;またはLIST roles;コマンドを実行して、アカウントまたはロール情報を取得できます。新しいユーザーまたはロールを追加するには、「ユーザーの計画と管理」または「ロールの計画」をご参照ください。
対象テーブルまたは列の名前。
MaxCompute クライアントで
SHOW TABLES;コマンドを実行して、テーブル、ビュー、列の名前を取得できます。
テーブルまたは列への秘密度レベルの設定
プロジェクトオーナーまたは Admin ロールを持つユーザーは、テーブルまたは列に秘密度レベルのラベルを設定できます。
コマンド構文
SET LabelSecurity=true; SET Label <number> TO TABLE <table_name>[(<column_list>)];使用上の注意
テーブルに秘密度レベルのラベルを設定し、列には設定しない場合、テーブル内のすべての列がテーブルの秘密度レベルを継承します。
列レベルのラベルは常にテーブルレベルのラベルを上書きします。テーブルレベルのラベルを設定しても、既存の列レベルのラベルには影響しません。たとえば、最初にテーブルの秘密度レベルを 2 に設定し、次に
col1という名前の列の秘密度レベルを 3 に設定した場合、テーブルの秘密度レベルは 2 のままで、col1の秘密度レベルは 3 となり、他の列はレベル 2 のままになります。テーブルまたは列の既存の秘密度レベルのラベルを変更するには、新しいレベルでコマンドを再度実行してください。
ラベルを削除するには、秘密度レベルを 0 に設定してください。
パラメータ
パラメータ
必須
説明
number
はい
秘密度レベルを指定します。有効な値:0~9。値が大きいほど秘密度が高くなります。
table_name
はい
対象テーブルまたはビューの名前。
MaxCompute クライアントで
SHOW TABLES;コマンドを実行して、テーブルまたはビューの名前を取得できます。column_list
いいえ
1つ以上の列名を指定します。複数の列名はカンマ (,) で区切ります。
ユーザーまたはロールへのアクセスレベルの設定
プロジェクトオーナーまたは Admin ロールを持つユーザーは、他のユーザーまたはロールにアクセスレベルのラベルを設定できます。
コマンド構文
SET LabelSecurity=true; SET Label <number> TO {USER|ROLE} <name>;使用上の注意
ユーザーにアクセスレベルのラベルが設定されると、ユーザーは自身のアクセスレベル以下の秘密度レベルのデータにのみアクセスできます。たとえば、ユーザーにアクセスレベル 3 が割り当てられている場合、秘密度レベル 0~3 のデータにのみアクセスできます。
ユーザーまたはロールの既存のアクセスレベルのラベルを変更するには、新しいアクセスレベルのラベルでコマンドを再度実行してください。
パラメータ
パラメータ
必須
説明
number
はい
ユーザーまたはロールがアクセスできる最も高いデータの秘密度レベルを指定します。有効な値:0~9。
name
はい
ユーザーまたはロールの名前。
MaxCompute クライアントで
LIST users;またはLIST roles;コマンドを実行して、アカウントまたはロール情報を取得できます。
ラベル権限の明示的な付与
プロジェクトオーナーまたは Admin ロールを持つユーザーは、割り当てられたアクセスレベルを超えるデータにアクセスする権限をユーザーに付与できます。
コマンド構文
GRANT Label <number> ON TABLE <table_name> [(<column_list>)] TO {USER|ROLE} <name> [WITH exp <days>];使用上の注意
特定のユーザーに対して、列への明示的な付与は親テーブルへの明示的な付与を上書きします。
パラメータ
パラメータ
必須
説明
number
はい
ユーザーまたはロールがアクセスできる最も高いデータの秘密度レベルを指定します。
この値はデータの秘密度レベルのラベルに対応します。有効な値:0~9。
table_name
はい
対象テーブルまたはビューの名前。
MaxCompute クライアントで
SHOW TABLES;コマンドを実行して、テーブルまたはビューの名前を取得できます。column_list
いいえ
権限を付与する列を指定します。複数の列名をカンマ (,) で区切って指定できます。
name
はい
ユーザーまたはロールの名前。
MaxCompute クライアントで
LIST users;またはLIST roles;コマンドを実行して、アカウントまたはロール情報を取得できます。days
いいえ
権限の有効期間を日数で指定します。有効な値:0~263-1。このパラメータを指定しない場合、権限はデフォルトで 180 日間有効です。
明示的なラベル権限の取り消し
プロジェクトオーナーまたは Admin ロールを持つユーザーは、明示的なラベル権限を取り消すことができます。
コマンド構文
REVOKE Label ON TABLE <table_name> [(<column_list>)] FROM {USER|ROLE} <name>;使用上の注意
テーブルへの明示的な付与を取り消すと、同じユーザーに対するそのテーブルの列への明示的な付与もすべて取り消されます。
明示的な付与を取り消しても、ユーザーに割り当てられたアクセスレベルには影響しません。たとえば、ユーザーのアクセスレベルが 2 で、テーブル内の秘密度レベル 3 までのデータへのアクセスが明示的に付与されている場合、明示的な付与が取り消された後も、ユーザーはテーブル内の秘密度レベル 2 以下のデータにアクセスできます。
パラメータ
パラメータ
必須
説明
table_name
はい
対象テーブルまたはビューの名前。
MaxCompute クライアントで
SHOW TABLES;コマンドを実行して、テーブルまたはビューの名前を取得できます。column_list
いいえ
権限を取り消す列を指定します。複数の列名をカンマ (,) で区切って指定できます。
name
はい
ユーザーまたはロールの名前。
MaxCompute クライアントで
LIST users;またはLIST roles;コマンドを実行して、アカウントまたはロール情報を取得できます。
期限切れ権限のクリア
明示的な付与の有効期限が切れた後、プロジェクトオーナーまたは Admin ロールを持つユーザーは、次のコマンドを実行して、期限切れの権限をクリアする必要があります。
clear expired grants;例
test_project という名前のプロジェクトに、sale_detail という名前のテーブルが含まれているとします。このテーブルには、shop_name、customer_id、total_price という列があります。
Bob@aliyun.com は test_project のプロジェクトオーナーです。Allen は Bob の Alibaba Cloud アカウント配下の RAM ユーザーで、Bob は Allen を test_project プロジェクトに追加しています。
次のステートメントでテーブルを作成します。
CREATE TABLE sale_detail (
shop_name STRING COMMENT '店舗名',
customer_id STRING COMMENT '顧客 ID',
total_price DOUBLE COMMENT '注文合計金額'
);例 1:秘密度レベルの設定
-- Bob が test_project プロジェクトを使用します。
USE test_project;
-- sale_detail テーブルのラベルをレベル 1 に設定します。この時点で、テーブル内のすべての列の秘密度レベルは 1 になります。
SET Label 1 TO TABLE sale_detail;
-- sale_detail の shop_name と customer_id 列のラベルをレベル 2 に設定します。他の列はレベル 1 のままです。
SET Label 2 TO TABLE sale_detail(shop_name, customer_id);
-- テーブルのラベル情報を表示します。
DESCRIBE sale_detail;
-- 結果は次のとおりです。
+------------------------------------------------------------------------------------+
| TableLabel: |
| MaxLabel: L2 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | 2 | 店舗名 |
| customer_id | string | 2 | 顧客 ID |
| total_price | double | 1 | 注文合計金額 |
+------------------------------------------------------------------------------------+
-- sale_detail テーブルのラベルをレベル 3 に変更します。shop_name と customer_id 列のラベルはレベル 2 のままで、他の列のラベルは 3 に変更されることに注意してください。
SET Label 3 TO TABLE sale_detail;
-- テーブルのラベル情報を表示します。
DESCRIBE sale_detail;
-- 結果は次のとおりです。
+------------------------------------------------------------------------------------+
| TableLabel: 3 |
| MaxLabel: L3 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | 2 | 店舗名 |
| customer_id | string | 2 | 顧客 ID |
| total_price | double | 3 | 注文合計金額 |
+------------------------------------------------------------------------------------+
-- sale_detail テーブルの shop_name と customer_id 列のラベルをレベル 4 に変更します。他の列のラベルはレベル 3 のままです。
SET Label 4 TO TABLE sale_detail(shop_name, customer_id);
-- テーブルのラベル情報を表示します。
DESCRIBE sale_detail;
-- 結果は次のとおりです。
+------------------------------------------------------------------------------------+
| TableLabel: 3 |
| MaxLabel: L4 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | 4 | 店舗名 |
| customer_id | string | 4 | 顧客 ID |
| total_price | double | 3 | 注文合計金額 |
+------------------------------------------------------------------------------------+例 2:ユーザーアクセスレベルの設定
プロジェクト内の通常のユーザー:Kate@aliyun.com
プロジェクト内の RAM ユーザー:RAM$Bob@aliyun.com:Allen
-- Bob が test_project プロジェクトを使用します。
USE test_project;
-- Kate のアクセスレベルのラベルを 3 に設定します。Kate は秘密度レベル 0 ~ 3 のデータにアクセスできます。
SET Label 3 TO USER ALIYUN$Kate@aliyun.com;
-- RAM ユーザー Allen のアクセスレベルのラベルを 1 に設定します。Allen は秘密度レベル 0 ~ 1 のデータにアクセスできます。
SET Label 1 TO USER RAM$Bob@aliyun.com:Allen;
-- Allen のアクセスレベル情報を表示します。
SHOW LABEL GRANTS FOR RAM$Bob@aliyun.com:Allen;
-- 結果は次のとおりです。
User Label: 1
(granted label list is empty)例 3:権限の明示的な付与
-- test_project プロジェクトを使用します。
USE test_project;
-- Allen に sale_detail テーブル内の秘密度レベル 3 までのデータへのアクセス権限を明示的に付与します。権限は 4 日間有効です。
GRANT LABEL 3 ON TABLE sale_detail TO USER RAM$Bob@aliyun.com:Allen WITH exp 4;
-- Allen への明示的な付与の結果を表示します。
SHOW LABEL GRANTS ON TABLE sale_detail FOR USER RAM$Bob@aliyun.com:Allen;
-- 結果は次のとおりです。
User Label: 1
+-------------+--------------+--------------------------+
| Column | GrantedLabel | Expires |
+-------------+--------------+--------------------------+
| total_price | 3 | 2025-12-26T11:13:20+0800 |
+-------------+--------------+--------------------------+
-- Allen に sale_detail テーブルの shop_name、customer_id、total_price 列の秘密度レベル 4 までのデータへのアクセス権限を明示的に付与します。権限は 10 日間有効です。
GRANT LABEL 4 ON TABLE sale_detail(shop_name, customer_id, total_price) TO USER RAM$Bob@aliyun.com:Allen WITH exp 10;
-- Allen への明示的な付与の結果を表示します。
SHOW LABEL GRANTS ON TABLE sale_detail FOR USER RAM$Bob@aliyun.com:Allen;
-- 結果は次のとおりです。
User Label: 1
+-------------+--------------+--------------------------+
| Column | GrantedLabel | Expires |
+-------------+--------------+--------------------------+
| customer_id | 4 | 2026-01-01T11:14:40+0800 |
+-------------+--------------+--------------------------+
| shop_name | 4 | 2026-01-01T11:14:40+0800 |
+-------------+--------------+--------------------------+
| total_price | 4 | 2026-01-01T11:14:40+0800 |
+-------------+--------------+--------------------------+例 4:明示的な権限の取り消し
-- 以前のデータ権限設定では:
-- 最初に、Allen に sale_detail テーブル内の秘密度レベル 3 までのデータへのアクセス権限が明示的に付与されました。
-- 次に、Allen に sale_detail テーブルの shop_name、customer_id、total_price 列の秘密度レベル 4 までのデータへのアクセス権限が明示的に付与されました。
-- Allen の sale_detail テーブルの shop_name、customer_id、total_price 列に対する列レベルのデータアクセス権限を取り消します。
REVOKE LABEL ON TABLE sale_detail(shop_name, customer_id, total_price) FROM USER RAM$Bob@aliyun.com:Allen;
-- Allen の権限が取り消された後の結果を表示します。
SHOW LABEL GRANTS ON TABLE sale_detail FOR USER RAM$Bob@aliyun.com:Allen;
-- 結果は次のとおりです。
User Label: 1
+-------------+--------------+--------------------------+
| Column | GrantedLabel | Expires |
+-------------+--------------+--------------------------+
| total_price | 3 | 2025-12-26T11:13:20+0800 |
+-------------+--------------+--------------------------+
-- Allen の sale_detail テーブル内の機密データへのアクセス権限を取り消します。
REVOKE LABEL ON TABLE sale_detail FROM USER RAM$Bob@aliyun.com:Allen;
-- Allen の権限が取り消された後の結果を表示します。
SHOW LABEL GRANTS ON TABLE sale_detail FOR USER RAM$Bob@aliyun.com:Allen;
-- 結果は次のとおりです。
User Label: 1
(granted label list is empty)次のステップ
ラベルベースの認可メカニズムを理解した後、必要に応じて権限を付与できます。