MaxCompute は、アクセス制御リスト (ACL) をサポートしており、ユーザーまたはロールにオブジェクトに対する特定のアクションを実行する権限を付与します。複数のユーザーの権限を管理するには、ロールに権限を付与し、そのロールをユーザーに割り当てることができます。このメソッドは、シンプルで効率的なアクセス制御を提供します。このトピックでは、MaxCompute がサポートする ACL 権限付与コマンドについて説明し、権限付与の例を示します。
背景情報
ACL ベースのアクセス制御では、ホワイトリストを使用します。これは、ユーザーまたはロールがオブジェクトに対して特定のアクションを実行することを明示的に許可できることを意味します。このメソッドは簡単で、正確な権限付与が可能です。
MaxCompute プロジェクトを作成すると、ACL ベースのアクセス制御がデフォルトで有効になります。プロジェクトのオーナーは、set CheckPermissionUsingACL=true|false; コマンドを実行して、この機能を有効または無効にできます。
ACL ベースのアクセス制御は、次のシナリオに適しています。
シナリオ | 説明 | 権限付与者 | 権限付与エンドポイント |
ユーザーに権限を付与する | 指定されたオブジェクトに対して 1 つ以上の操作を実行する権限を単一のユーザーに直接付与します。 | 詳細については、「MaxCompute の権限」の「サポートされている権限付与者」列をご参照ください。 | |
ロールに基づいてユーザーに権限を付与する | 指定されたオブジェクトに対して 1 つ以上の操作を実行する権限をロールに付与します。次に、そのロールを複数のユーザーにアタッチします。これにより、ユーザーはロールの権限を持つことになります。 ロールの作成とユーザーへのロールのアタッチに関する詳細については、「ロール計画」および「ユーザーへのロールのアタッチ」をご参照ください。 説明 ロールは、ユーザーをより適切に管理するために使用されます。通常、同じオブジェクトに対する同じ権限を複数のロールに付与することはありません。 |
前提条件
ACL ベースのアクセス制御を使用する前に、次の情報があることを確認してください。
権限を付与するユーザーアカウントまたはロール。ユーザーまたはロールが 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 の権限」をご参照ください。
制限事項
ACL ベースのアクセス制御には、次の制限が適用されます。
既存のオブジェクト、および既存のユーザーまたはロールに対してのみ権限を付できます。これにより、オブジェクトを削除した後に同じ名前の別のオブジェクトを作成した場合に発生する可能性のあるセキュリティリスクを防ぐことができます。
ACL ベースのアクセス制御は、
[with grant option]句を使用した権限付与をサポートしていません。たとえば、ユーザー A がユーザー B に権限を付与した場合、ユーザー B はその同じ権限をユーザー C に付与することはできません。ACL 権限付与では、ホワイトリスト (Allow) を使用します。ブラックリスト (Deny) はサポートされていません。
注意事項
ACL ベースのアクセス制御を使用する場合は、次の点に注意してください。
オブジェクトを削除すると、MaxCompute はそのオブジェクトに関連付けられているすべての ACL 権限付与を自動的に取り消します。
ユーザーが削除された後も、そのユーザーに付与された権限は保持されます。ユーザーが再度プロジェクトに追加されると、そのユーザーの過去のアクセス権限が再度有効になります。削除されたユーザーの残存権限情報をクリアする方法の詳細については、「削除されたユーザーの残存権限情報を完全にクリアする」をご参照ください。
コマンドのフォーマット
ACL ベースのアクセス制御のコマンドフォーマットは次のとおりです。
ACL 権限の付与
grant <actions> on <object_type> <object_name> [(<column_list>)] to <subject_type> <subject_name> [privilegeproperties("conditions" = "<conditions>", "expires"="<days>")];ACL 権限の取り消し
revoke <actions> on <object_type> <object_name> [(<column_list>)] from <subject_type> <subject_name>;列レベルのアクセス制御
grant <actions> on table <table_name> (<column_list>) to <subject_type> <subject_name>; revoke <actions> on table <table_name> (<column_list>) from <subject_type> <subject_name>;
次の表にパラメーターを説明します。
パラメーター | 必須 | 説明 | |
actions | はい | 付与するアクション権限の名前。1 回の権限付与で 1 つ以上のアクションを指定できます。 複数のアクションを指定する場合は、コンマ (,) で区切ります。有効な値の詳細については、「MaxCompute の権限」をご参照ください。 | |
object_type | はい | 権限を付与するオブジェクトのタイプ。1 回の権限付与で指定できるオブジェクトタイプは 1 つだけです。 有効な値の詳細については、「MaxCompute の権限」をご参照ください。 | |
object_name | はい | 権限を付与するオブジェクトの名前。名前は次の方法で取得できます。
アスタリスク (*) を権限付与オブジェクトのワイルドカードとして使用できます。たとえば、 説明 アスタリスク (*) をワイルドカードとして使用できるのは、ROLE に権限を付与する場合のみです。USER に権限を付与する場合は、ワイルドカードを使用できません。 | |
column_list | いいえ | このパラメーターは、object_type が Table で、列レベルのアクセス制御を実行する必要がある場合にのみ必須です。1 つ以上の列名をコンマ (,) で区切って指定できます。 説明 このパラメーターは、テーブルの指定された列に対する Describe、Select、Alter、Update、Drop、ShowHistory、および ALL 権限を制御します。テーブルの列に感度レベルがある場合は、ラベルベースのアクセス制御を使用して、感度レベルのラベルに基づいて機密データへのアクセスを制御できます。 | |
privilegeproperties | conditions | いいえ | リクエストソースやアクセス方法などのディメンションに基づいて権限を制御します。フォーマットは |
days | いいえ | 権限の有効期限 (日数)。このパラメーターを指定しない場合、権限は永続的に有効になります。このパラメーターを指定すると、MaxCompute は有効期限が切れた後に権限情報を自動的にパージします。 | |
subject_type | はい | 権限を付与するサブジェクトのタイプ。有効な値:
| |
subject_name | はい | 権限を付与するユーザーアカウントまたはロール名。一度に指定できるユーザーまたはロールは 1 つだけです。フォーマットは次のとおりです。
MaxCompute クライアントで | |
条件
次の表に、conditions でサポートされている var_name と Operation の値を示します。
var_name | タイプ | 操作 | 説明 |
acs:UserAgent | STRING |
| リクエストを送信するクライアントの User-Agent。 |
acs:Referer | STRING | リクエストの HTTP Referer。 | |
acs:SourceIp | IP アドレス |
| リクエストを送信するクライアントの IP アドレス。 |
acs:SecureTransport | BOOLEAN |
| リクエストが HTTPS などのセキュアチャネル経由で送信されたかどうかを示します。 |
acs:CurrentTime | DATEANDTIME |
| Web サーバーがリクエストを受信した時刻。時刻は 2012-11-11T23:59:59Z などの ISO 8601 フォーマットです。 |
ACL アクセス制御の例
Bob@aliyun.com(アカウント ID: 5527xxxxxxxx5788) が test_project_a プロジェクトのオーナーであると仮定します。Allen(UID: 1652xxxxxxxxxx1538)、Alice(UID: 2763xxxxxxxxxx1649)、および Tom(UID: 3874xxxxxxxxxx1850) は Bob@aliyun.com に属する RAM ユーザーです。次の例では、MaxCompute クライアントを使用して権限を付与する方法を示します。
例 1: ユーザーへの権限付与
test_project_a プロジェクトに sale_detail という名前のテーブルを作成し、そのテーブルに対する Describe (メタデータの読み取り) および Select (テーブルデータの読み取り) 権限をユーザー Allen に付与します。サンプルコマンドは次のとおりです。
-- Bob が test_project_a プロジェクトに入ります。 use test_project_a; -- sale_detail という名前のパーティションテーブルを作成します。 create table if not exists sale_detail ( shop_name string, customer_id string, total_price double ) partitioned by (sale_date string, region string); -- ユーザー Allen をプロジェクトメンバーとして追加します。 add user RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538; -- Allen に権限を付与します。 grant Describe, Select on table sale_detail to USER RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538; -- Allen の権限付与結果を表示します。 show grants for RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538; -- 権限付与の結果は次のとおりです。 Authorization Type: ACL [user/RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538] A projects/test_project_a/tables/sale_detail: Describe | Select例 2: ユーザーへの権限付与
例 1 で作成した sale_detail テーブルに基づいて、shop_name 列と customer_id 列に対するすべての権限をユーザー Alice に付与します。サンプルコマンドは次のとおりです。
-- Bob が test_project_a プロジェクトに入ります。 use test_project_a; -- ユーザー Alice をプロジェクトメンバーとして追加します。 add user RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; -- Alice に列レベルの権限を付与します。 grant All on table sale_detail (shop_name, customer_id) to USER RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; -- Alice の権限付与結果を表示します。 show grants for RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; -- 権限付与の結果は次のとおりです。 Authorization Type: ACL [user/RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649] A projects/test_project_a/tables/sale_detail/customer_id: All A projects/test_project_a/tables/sale_detail/shop_name: All例 3: ユーザーからの権限の取り消し
例 1 と例 2 に基づいて、ユーザー Allen と Alice から権限を取り消します。サンプルコマンドは次のとおりです。
-- Bob が test_project_a プロジェクトに入ります。 use test_project_a; -- Allen から権限を取り消します。 revoke Describe, Select on table sale_detail (shop_name, customer_id) from USER RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538; -- Alice から権限を取り消します。 revoke All on table sale_detail (shop_name, customer_id) from USER RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; -- Allen からの権限取り消しの結果を表示します。権限リストには Describe または Select 権限は含まれていません。 show grants for RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538; -- Alice からの権限取り消しの結果を表示します。権限リストには All 権限は含まれていません。 show grants for RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649;例 4: ロールに基づいて複数のユーザーに同じ権限を付与する
Alice、Tom、および別の Alibaba Cloud アカウントである Lily@aliyun.com(アカウント ID: 5638xxxxxxxx6899) に、インスタンス、リソース、関数、テーブルを作成し、test_project_a プロジェクト内のすべてのオブジェクトタイプを表示する権限を付与します。サンプルコマンドは次のとおりです。
-- Bob が test_project_a プロジェクトに入ります。 use test_project_a; -- ユーザー Alice、Tom、および Lily@aliyun.com をプロジェクトメンバーとして追加します。 add user RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; add user RAM$5527xxxxxxxx5788:3874xxxxxxxxxx1850; add user ALIYUN$5638xxxxxxxx6899; -- Worker ロールを作成します。 create role Worker; -- Worker ロールをユーザーに割り当てます。 grant Worker TO RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; grant Worker TO RAM$5527xxxxxxxx5788:3874xxxxxxxxxx1850; grant Worker TO ALIYUN$5638xxxxxxxx6899; -- test_project_a プロジェクトに対する CreateInstance、CreateResource、CreateFunction、CreateTable、および List 権限を Worker ロールに付与します。 grant CreateInstance, CreateResource, CreateFunction, CreateTable, List on project test_project_a TO ROLE Worker; -- Lily の権限付与結果を表示します。 show grants for ALIYUN$5638xxxxxxxx6899; -- 権限付与の結果は次のとおりです。これは、ユーザー Lily が前述の権限を持っていることを示します。 [roles] worker Authorization Type: ACL [role/worker] A projects/test_project_a: CreateTable | CreateResource | CreateInstance | CreateFunction | List例 5: ロールに基づいて複数のユーザーに付与された同じ権限を取り消す
この例では、例 4 で RAM ユーザーの Alice と Tom、および Alibaba Cloud アカウントの Lily@aliyun.com に付与された権限が取り消されます。サンプルコマンドは次のとおりです。
-- Alibaba Cloud アカウント Bob@aliyun.com を使用して test_project_a プロジェクトに移動します。 use test_project_a; -- RAM ユーザーの Alice と Tom、および Alibaba Cloud アカウントの Lily@aliyun.com から Worker ロールを取り消します。 revoke Worker from RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; revoke Worker from RAM$5527xxxxxxxx5788:3874xxxxxxxxxx1850; revoke Worker from ALIYUN$5638xxxxxxxx6899; -- Alibaba Cloud アカウント Lily@aliyun.com の権限をクエリします。Alibaba Cloud アカウント Lily@aliyun.com は Worker ロールの権限を持っていません。 show grants for ALIYUN$5638xxxxxxxx6899;
次のステップ
ACL ベースの権限付与の仕組みを理解したら、必要に応じて次の操作を実行できます。