複数のユーザーでプロジェクトやテーブルなどの MaxCompute オブジェクトを操作する必要がある場合は、アクセスコントロールリスト (ACL) を使用して、特定の権限をユーザーやロールに付与できます。複数ユーザーの権限を効率的に管理するには、ロールに権限を付与し、そのロールをユーザーに割り当てます。本トピックでは、MaxCompute がサポートする ACL 権限付与コマンドについて説明し、例を示します。
背景情報
ACL ベースのアクセスコントロールでは、許可リスト方式の権限モデルを使用します。これにより、ユーザーまたはロールが特定のオブジェクトに対して特定のアクションを実行することを明示的に許可します。このため、権限付与がシンプルかつ正確になります。
MaxCompute プロジェクトを作成すると、ACL ベースのアクセスコントロールがデフォルトで有効になります。プロジェクト所有者は、プロジェクトで set CheckPermissionUsingACL=true|false; コマンドを実行して、この機能を有効または無効にできます。
ACL ベースのアクセスコントロールは、次のシナリオに適用されます。
|
シナリオ |
説明 |
権限付与者 |
エントリポイント |
|
ユーザーへの権限付与 |
特定のオブジェクトに対する 1 つ以上のアクションを単一のユーザーに直接付与します。 |
権限リストの「サポートされる権限付与者」列をご参照ください。 |
|
|
ロールによるユーザーへの権限付与 |
特定のオブジェクトに対する 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 権限付与は許可リストモデルを使用し、拒否リストモデルはサポートしていません。
注意事項
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 つの 複数のアクションはコンマ (,) で区切ります。有効なアクションのリストについては、「MaxCompute の権限」をご参照ください。 |
|
|
object_type |
はい |
権限を付与するオブジェクトのタイプ。1 つのステートメントで指定できるオブジェクトタイプは 1 つだけです。 有効なオブジェクトタイプのリストについては、「MaxCompute の権限」をご参照ください。 |
|
|
object_name |
はい |
オブジェクトの名前。名前は次の方法で見つけられます。
オブジェクト名には、アスタリスク (*) をワイルドカードとして使用できます。たとえば、 説明
ワイルドカード (*) は、ROLE に権限を付与する場合にのみ使用できます。USER に権限を付与する場合、ワイルドカードはサポートされていません。 |
|
|
column_list |
いいえ |
このパラメーターは、object_type が table で、列レベルのアクセス制御を実装する場合にのみ必須です。 1 つ以上の列を指定できます。 複数の列名はコンマ (,) で区切ります。 説明
このパラメーターは、指定された列に対する |
|
|
privilegeproperties |
conditions |
いいえ |
リクエスト元やアクセス方法などの属性に基づいて権限を制御します。形式は |
|
days |
いいえ |
権限が失効するまでの日数。このパラメーターを指定しない場合、権限は失効しません。このパラメーターを指定すると、MaxCompute は失効後に権限レコードを自動的に削除します。 |
|
|
subject_type |
はい |
被付与者のタイプ。有効な値:
|
|
|
subject_name |
はい |
被付与者のユーザーアカウントまたはロール名。1 回の付与につき、1 人のユーザーまたは 1 つのロールのみを指定できます。形式:
MaxCompute クライアントで |
|
条件
次の表に、conditions でサポートされている var_name と Operation の値を示します。
|
var_name |
タイプ |
Operation |
説明 |
|
|
|
|
リクエスト元クライアントの User-Agent。 |
|
|
|
リクエストの HTTP Referer。 |
|
|
|
IP アドレス |
|
リクエスト元クライアントの IP アドレス。 |
|
|
|
|
リクエストが HTTPS などのセキュアなチャネル経由で送信されたかどうかを示します。 |
|
|
|
|
Web サーバーがリクエストを受信した時刻。ISO 8601 形式、たとえば 2012-11-11T23:59:59Z です。 |
例
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 テーブルを作成し、ユーザー Allen にテーブルの Describe (メタデータの読み取り) と Select (データの読み取り) 権限を付与します。以下にサンプルコマンドを示します。
-- 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 テーブルを使用して、ユーザー Alice に sale_detail テーブルの shop_name 列と customer_id 列のすべての権限を付与します。以下にサンプルコマンドを示します。
-- 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 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; -- Worker ロールに、インスタンス、リソース、関数、テーブルを作成し、test_project_a プロジェクト内のすべてのオブジェクトタイプを一覧表示する権限を付与します。 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 に基づいて、ユーザー Alice、Tom、および Lily@aliyun.com から権限を取り消します。以下にサンプルコマンドを示します。
-- Bob が test_project_a プロジェクトに切り替えます。 use test_project_a; -- ユーザー Alice、Tom、および Lily@aliyun.com から Worker ロールを取り消します。 revoke Worker from RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; revoke Worker from RAM$5527xxxxxxxx5788:3874xxxxxxxxxx1850; revoke Worker from ALIYUN$5638xxxxxxxx6899; -- 取り消し後の Lily の権限を確認します。権限リストに Worker ロールは含まれなくなります。 show grants for ALIYUN$5638xxxxxxxx6899;
次のステップ
ACL 権限付与の仕組みを理解したら、ビジネスニーズに応じて権限を管理できます。