MaxCompute では、プロジェクトレベルでユーザーにラベルベースのアクセスレベルを割り当て、テーブルまたはテーブル列に秘密度ラベルを設定できます。ユーザーは、自身のアクセスレベル以下である秘密度レベルのテーブルまたは列のデータにのみアクセス可能です。本トピックでは、ラベルベースの権限付与方法とその使用例について説明します。
概要
ラベルベースのアクセス制御(LabelSecurity とも呼ばれます)は、プロジェクトレベルで適用される強制アクセス制御ポリシーです。デフォルトでは無効になっています。
プロジェクトオーナーは、プロジェクトレベルで 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;コマンドを実行してプロジェクト保護を有効にしてください。プロジェクト保護を有効化すると、ユーザーはプロジェクト内でのみデータにアクセス可能となり、プロジェクト外へのデータ流出を防ぎます。詳細については、「データ保護メカニズム」をご参照ください。オブジェクトが削除されると、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 を割り当てて列にレベルを割り当てない場合、すべての列はレベル 2 になります。
列レベルのラベルは、レベル値に関係なく、テーブルレベルのラベルよりも優先されます。テーブルレベルのラベルが列レベルのラベルをオーバーライドすることはありません。たとえば、テーブルにレベル 2 を割り当て、その後 col1 列にレベル 3 を割り当てた場合、テーブルはレベル 2 のままとなり、col1 はレベル 3、他の列はレベル 2 のままとなります。
テーブルまたは列の既存の秘密度ラベルを変更するには、新しいレベルを指定して再度コマンドを実行します。
説明
パラメーター名
必須
説明
number
はい
感度レベル。有効値:0~9。値が大きいほどセキュリティレベルが高くなります。
table_name
はい
対象テーブルまたはビューの名前。
MaxCompute クライアント で
SHOW TABLES;コマンドを実行して、テーブルまたはビュー名の一覧を表示できます。column_list
いいえ
列名。複数の列名を指定する場合は、カンマ(,)で区切ります。
ユーザーまたはロールにアクセスレベルラベルを割り当てる
プロジェクトオーナーまたは 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
いいえ
権限の生存時間(TTL)、単位は日。有効値:0~263-1。省略した場合、デフォルトの TTL は 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 の下にいる RAM ユーザーであり、test_project に追加済みです。
テーブル作成文は次のとおりです。
CREATE TABLE sale_detail (
shop_name STRING COMMENT '店舗名',
customer_id STRING COMMENT '顧客 ID',
total_price DOUBLE COMMENT '注文合計金額'
);例 1:sale_detail テーブルまたはその列に秘密度ラベルを割り当てる
-- Bob が test_project に移動します。
USE test_project;
-- テーブル sale_detail の感度レベルを 1 に設定します。すべての列がレベル 1 になります。
SET Label 1 TO TABLE 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 | | 注文合計金額 |
+------------------------------------------------------------------------------------+
-- テーブル 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 | 注文合計金額 |
+------------------------------------------------------------------------------------+
-- 列 shop_name および customer_id をレベル 4 に変更します。他の列はレベル 3 のままです。
SET Label 4 TO TABLE sale_detail(shop_name, customer_id);
-- テーブルのラベル情報を表示します。
DESCRIBE sale_detail;
-- 出力
+------------------------------------------------------------------------------------+
| TableLabel: |
| MaxLabel: L4 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | 4 | 店舗名 |
| customer_id | string | 4 | 顧客 ID |
| total_price | double | | 注文合計金額 |
+------------------------------------------------------------------------------------+例 2:プロジェクト内の一般ユーザおよび RAM ユーザーにアクセスレベルラベルを割り当てる
プロジェクト内の一般ユーザ: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:Allen に高秘密度データへのアクセス権限を明示的に付与する
-- 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 の高秘密度データへのアクセス権限を取り消す
-- 以前の状態:
-- 最初に、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;
-- 出力:
-- 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
+-------------+--------------+---------+
| Column | GrantedLabel | Expires |
+-------------+--------------+---------+
| total_price | 1 | |
+-------------+--------------+---------+次のステップ
ラベルベースの権限付与の仕組みを理解したら、ビジネス要件に基づいて権限を付与してください。