MaxCompute では、プロジェクトレベルでユーザーのアクセスレベルラベルと、テーブルまたはテーブル内の列の秘密度レベルラベルを構成できます。 これらのラベルを構成すると、ユーザーは秘密度レベルがユーザーアクセスレベル以下のテーブルまたは列にのみアクセスできます。
背景情報
ラベルベースのアクセス制御は LabelSecurity とも呼ばれます。 これは、プロジェクトレベルで必須アクセス制御(MAC)ポリシーとして使用されます。 ラベルベースのアクセス制御は、新しく作成された MaxCompute プロジェクトではデフォルトで無効になっています。 プロジェクトオーナーは、プロジェクトレベルで Set LabelSecurity=truefalse; 文を実行して、MaxCompute プロジェクトのラベルベースのアクセス制御を有効または無効にすることができます。
MaxCompute プロジェクトでラベルベースのアクセス制御が有効になっている場合、プロジェクトオーナーは、テーブルまたはテーブル内の列の秘密度レベルと、ユーザーまたはロールのアクセスレベルを定義し、テーブルまたはテーブル内の列の秘密度レベルラベルと、ユーザーまたはロールのアクセスレベルラベルを構成する必要があります。 ユーザーが秘密度レベルのデータにアクセスする場合、ユーザーはデータが格納されているテーブルに対する SELECT 権限を持っている必要があり、秘密度レベルがユーザーアクセスレベル以下のテーブルまたは列のデータにのみアクセスできます。
ラベルベースのアクセス制御は、機密データに対して次の機能を提供します。
列は、秘密度レベルを構成するためにサポートされる最小粒度です。
秘密度レベルラベルは、テーブル内の任意の列に構成できます。 テーブルには、異なる秘密度レベルの列を含めることができます。
秘密度レベルラベルは、ビューに構成できます。 ビューの秘密度レベルラベルは、ビューに対応するソーステーブルの秘密度レベルラベルとは関係ありません。
ラベルベースのアクセス制御のデフォルトポリシー
テーブルまたは列とユーザーまたはロールのラベルを構成した後、ラベルベースのアクセス制御の次のデフォルトポリシーが使用されます。
No-ReadUp: ユーザーは、秘密度レベルがユーザーアクセスレベルよりも高いテーブルまたは列にアクセスできません。 ユーザーが秘密度レベルがユーザーアクセスレベルよりも高いテーブルまたは列にアクセスする場合、明示的な権限付与操作が必要です。 明示的な権限付与操作の詳細については、「GRANT LABEL」をご参照ください。
Trusted-User: ユーザーは、秘密度レベルがユーザーアクセスレベル以下のデータを書き込むことができます。 新しく作成されたテーブルまたはビューのデフォルトの秘密度レベルは 0 です。これは、すべてのユーザーまたはロールがテーブルまたはビューにアクセスできることを示します。 新しく追加されたユーザーのデフォルトのアクセスレベルは 0 です。
前提条件
ラベルベースのアクセス制御を実行する前に、次の情報が取得されていることを確認してください。
権限を付与するユーザーのアカウント、または権限を付与するロールの名前が取得されます。 ロールまたはアカウントは、MaxCompute プロジェクトに追加されます。 ユーザーのアカウントが Alibaba Cloud アカウントの場合、Alibaba Cloud アカウントを ALIYUN$<account_id> の形式で記録します。 ユーザーのアカウントが RAM ユーザーの場合、RAM ユーザーを RAM$<account_id>:<RAM user ID> の形式で記録します。 ユーザーのアカウントが RAM ロールの場合は、RAM ロールを `RAM$<account_id>:role/<Name of the RAM role>` の形式で記録します。
list users;コマンドまたはlist roles;コマンドを MaxCompute クライアント で実行して、アカウント名またはロール名をクエリできます。オブジェクトの名前。 オブジェクトは、テーブルまたは列です。
show tables;文を MaxCompute クライアント で実行して、テーブルまたはビューの名前と、テーブルまたはビューの列の名前を取得できます。
制限
パーティションキー列に秘密度レベルラベルを構成することはできません。
使用上の注意
ラベルベースのアクセス制御を使用する場合は、次の点に注意してください。
従来の一部の MAC システムでは、ラベルベースのアクセス制御を実行するときに、複雑なセキュリティポリシーを使用できます。 これにより、プロジェクト内で権限のないユーザーによってデータが配布されるのを防ぎます。 たとえば、No-WriteDown ポリシーは、ユーザーが秘密度レベルがユーザーアクセスレベル以下のデータを書き込むことを禁止します。 デフォルトでは、MaxCompute は No-WriteDown ポリシーをサポートしていません。 これにより、データ秘密度レベルの管理コストが削減されます。 プロジェクトに同様の要件がある場合は、
Set ObjectCreatorHasGrantPermission=false;文を実行して、プロジェクトのセキュリティ構成を変更できます。プロジェクト間のデータ転送を防ぐために、
set ProjectProtection=true;文を実行して、プロジェクトデータ保護を有効にできます。 これにより、ユーザーは自分のプロジェクトのデータにのみアクセスできます。 これにより、ユーザーがプロジェクト間でデータを転送するのを防ぎます。 プロジェクトデータ保護の詳細については、「プロジェクトデータ保護」をご参照ください。オブジェクトを削除すると、MaxCompute はオブジェクトに関連付けられているすべてのラベルを自動的に取り消します。
ユーザーが削除された後も、ユーザーに付与された権限は保持されます。 ユーザーがプロジェクトに再度追加されると、ユーザーの履歴アクセス権限が再び有効になります。 削除されたユーザーの残留権限情報をクリアする方法の詳細については、「削除されたユーザーの残留権限情報を完全にクリアする」をご参照ください。
テーブルまたは列のデータに秘密度レベルラベルを構成する
プロジェクトオーナーまたは Admin ロールが割り当てられているユーザーは、テーブルまたはテーブル内の列のデータに秘密度レベルラベルを構成します。
構文
set Label <number> to table <table_name>[(<column_list>)];使用上の注意
テーブルに秘密度レベルラベルを構成し、テーブル内の列に秘密度レベルラベルを構成しない場合、テーブル内のすべての列の秘密度レベルはテーブルの秘密度レベルと同じになります。 たとえば、テーブルの秘密度レベルが 2 で、テーブル内のどの列にも秘密度レベルが構成されていない場合、テーブル内のすべての列の秘密度レベルは 2 になります。
テーブル内の列に構成したラベルは、列の秘密度レベルが高いか低いかに関係なく、テーブルに構成したラベルを上書きします。 テーブルに構成したラベルは、テーブル内の列に構成したラベルを上書きしません。 たとえば、テーブルに最初に構成した秘密度レベルが 2 で、テーブル内の列 col1 に構成した秘密度レベルが 3 の場合、col1 以外のすべての列の秘密度レベルは 2 になります。
テーブルまたは列に構成した秘密度レベルラベルを変更する場合は、文を再度実行して秘密度レベルラベルを構成できます。
パラメータ
パラメータ
必須
説明
number
はい
秘密度レベル。 有効値: 0~9。 値が大きいほど、セキュリティレベルが高いことを示します。
table_name
はい
テーブルまたはビューの名前。
show tables;文を MaxCompute クライアント で実行して、テーブルまたはビューの名前を取得できます。column_list
いいえ
テーブル内の列の名前。 複数の列名を指定できます。 列名はコンマ(,)で区切ります。
ユーザーまたはロールにアクセスレベルラベルを構成する
プロジェクトオーナーまたは Admin ロールが割り当てられているユーザーは、プロジェクト内の他のユーザーまたはロールにアクセスレベルラベルを構成します。
構文
set Label <number> to {USER|ROLE} <name>;使用上の注意
ユーザーにアクセスレベルラベルを構成すると、ユーザーは秘密度レベルがユーザーアクセスレベル以下のデータにのみアクセスできます。 たとえば、ユーザーのアクセスレベルが 3 の場合、ユーザーは秘密度レベルが 0~3 のテーブルまたは列にアクセスできます。
ユーザーまたはロールに構成されているアクセスレベルラベルを変更する場合は、文を再度実行して新しいアクセスレベルラベルを構成する必要があります。
重要ラベルベースの明示的な権限付与 を介してユーザーに付与された列の秘密度レベルの権限は、ユーザーのアクセス権限レベルタグ情報よりも優先されます。 たとえば、ユーザーの秘密度レベルが 0 に指定されているが、秘密度レベル 3 の列データへのアクセス権が付与されている場合、ユーザーは権限が付与された秘密度レベル 3 の列データにアクセスできます。
パラメータ
パラメータ
必須
説明
number
はい
ユーザーまたはロールがアクセスできるデータの最高の秘密度レベル。 有効値の範囲は 0~9 で、秘密度レベルラベルに対応します。
name
はい
ユーザーまたはロールの名前。
list users;またはlist roles;ステートメントを MaxCompute クライアント で実行して、ユーザーアカウントまたはロールの名前を取得できます。
例
次の例では、test_project_a プロジェクトに、shop_name、customer_id、および total_price 列を含む sale_detail という名前のテーブルが格納されています。 Alibaba Cloud アカウント Bob@aliyun.com は、test_project_a プロジェクトのオーナーです。 Allen は、Alibaba Cloud アカウント Bob@aliyun.com に属し、test_project_a プロジェクトに追加された RAM ユーザーです。
例 1: sale_detail テーブルと sale_detail テーブル内の列に秘密度レベルラベルを構成します。 サンプル文:
-- Alibaba Cloud アカウント Bob@aliyun.com を使用して、プロジェクト test_project_a にアクセスします。 use test_project_a; -- sale_detail テーブルの秘密度ラベルを 1 に設定します。この場合、sale_detail テーブル内のすべての列の秘密度レベルは 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); -- sale_detail テーブルの秘密度ラベルを 3 に変更します。この場合、shop_name 列と customer_id 列の秘密度ラベルは引き続き 2 になります。 sale_detail テーブル内の他の列の秘密度ラベルは 3 に変更されます。 set Label 3 to table sale_detail; -- sale_detail テーブル内の shop_name 列と customer_id 列のラベルを 4 に変更します。この場合、他の列のラベルは引き続き 3 になります。 set Label 4 to table sale_detail(shop_name, customer_id); -- テーブルのラベルを表示します。 describe sale_detail; -- 次の結果が返されます。 +------------------------------------------------------------------------------------+ | Owner: ALIYUN$****@test.aliyun.com | Project: **** | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2021-12-13 11:27:04 | | LastDDLTime: 2021-12-13 11:27:04 | | LastModifiedTime: 2021-12-13 11:27:26 | +------------------------------------------------------------------------------------+ | TableLabel: 3 | -- テーブルラベルは 3 です。 | MaxLabel: L4 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 784 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | shop_name | string | 4 | | -- 列ラベルは 4 です。 | customer_id | string | 4 | | -- 列ラベルは 4 です。 | total_price | double | 3 | | -- 列ラベルは 3 です。 +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | sale_date | string | | | region | string | | +------------------------------------------------------------------------------------+例 2: test_project_a プロジェクトの Alibaba Cloud アカウント Kate@aliyun.com と RAM$Bob@aliyun.com:Allen にアクセスレベルラベルを構成します。 サンプル文:
-- Alibaba Cloud アカウント Bob@aliyun.com を使用して、プロジェクト test_project_a にアクセスします。 use test_project_a; -- Alibaba Cloud アカウント Kate@aliyun.com のアクセスレベルラベルを 3 に設定します。これにより、Kate@aliyun.com は秘密度レベルが 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)
関連文
GRANT LABEL: プロジェクトオーナーまたは Admin ロールが割り当てられているユーザーは、アクセスレベルの低いユーザーまたはロールに、秘密度レベルの高いデータへのアクセスを許可します。
REVOKE: プロジェクトオーナーまたは Admin ロールが割り当てられているユーザーは、明示的に構成されたラベルをユーザーまたはロールから取り消します。
CLEAR EXPIRED GRANTS: 明示的な権限付与によって付与された期限切れの権限をクリアします。