このトピックでは、ポリシーベースおよびパッケージベースのアクセス制御を含む、MaxCompute の一般的な権限付与シナリオについて説明します。各シナリオでは、ビジネスコンテキスト、推奨ソリューション、および MaxCompute クライアントと MaxCompute コンソールの両方での操作手順を解説します。
アクセス制御メカニズムの選択
開始する前に、次の表を使用して、ご利用のシナリオに適したメカニズムを特定してください。
| シナリオ | 推奨メカニズム |
|---|---|
| ロールに対してプロジェクトリソース上の特定のアクションを許可または拒否する | ポリシーベースのアクセス制御 |
| 権限に時間ベースまたは IP ベースの条件を適用する | ポリシーベースのアクセス制御 |
| 同一の Alibaba Cloud アカウント内のプロジェクト間で選択したテーブルを共有する | パッケージベースのアクセス制御 |
| 異なる Alibaba Cloud アカウントが所有するプロジェクト間で選択したテーブルを共有する | パッケージベースのアクセス制御 |
| ユーザーごとにテーブルアクセスを特定の行に制限する (行レベルの分離) | パッケージベースのアクセス制御 (ビュー経由) |
ポリシーベースのアクセス制御
ロールに特定のアクションの実行を許可
シナリオ: プロジェクトメンバーのグループが、テーブルの作成、リソースファイルのアップロード、関数の作成、タスクの実行、および名前が t_app_ で始まるテーブルのクエリを行う必要があります。
ソリューション: ロールを作成し、必要なアクションを付与するポリシーをアタッチして、そのロールをユーザーに割り当てます。
MaxCompute クライアントの使用
ロールを作成します。
create role <role_name>;policy_1.jsonという名前のポリシーファイルを作成し、MaxCompute クライアントのbinディレクトリに配置します。このファイルは、プロジェクトレベルの操作と、指定されたプレフィックスに一致するテーブル、関数、インスタンス、およびリソースへのフルアクセスを許可します。{ "Statement": [ { "Action": [ "odps:List", "odps:CreateTable", "odps:CreateInstance", "odps:CreateResource", "odps:CreateFunction" ], "Effect": "Allow", "Resource": ["acs:odps:*:projects/<project_name>"] }, { "Action": ["odps:*"], "Effect": "Allow", "Resource": [ "acs:odps:*:projects/<project_name>/tables/t_app_*", "acs:odps:*:projects/<project_name>/registration/functions/*", "acs:odps:*:projects/<project_name>/instances/*", "acs:odps:*:projects/<project_name>/resources/*" ] } ], "Version": "1" }<project_name>をご利用の MaxCompute プロジェクトの名前に置き換えます。ポリシーをロールにアタッチし、ロールをユーザーに割り当てます。
Alibaba Cloud アカウント:
ALIYUN$<account>RAM ユーザー:
RAM$<account>:<ram_username>
-- ポリシーをロールにアタッチします。 put policy policy_1.json on role <role_name>; -- ロールをユーザーに割り当てます。 grant <role_name> to <user_name>;<user_name>には、次のいずれかのフォーマットを使用します。
MaxCompute コンソールの使用
MaxCompute コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[ワークスペース] > [プロジェクト] を選択します。
対象プロジェクトを見つけ、[アクション] 列の [管理] をクリックします。
[ロール権限] タブで、[プロジェクトレベルのロールを作成] をクリックします。
[ロールの作成] ダイアログボックスで、[ロールタイプ] ドロップダウンリストから [リソース] を選択し、[ロール名] フィールドにロール名を入力し、[権限付与方法] で [ポリシー] を選択します。次のポリシードキュメントを入力します。
{ "Statement": [ { "Action": [ "odps:List", "odps:CreateTable", "odps:CreateInstance", "odps:CreateResource", "odps:CreateFunction" ], "Effect": "Allow", "Resource": ["acs:odps:*:projects/<project_name>"] }, { "Action": ["odps:*"], "Effect": "Allow", "Resource": [ "acs:odps:*:projects/<project_name>/tables/t_app_*", "acs:odps:*:projects/<project_name>/registration/functions/*", "acs:odps:*:projects/<project_name>/instances/*", "acs:odps:*:projects/<project_name>/resources/*" ] } ], "Version": "1" }[ロール権限] タブで、ロールを見つけ、[操作] 列の [メンバーの管理] をクリックして、Alibaba Cloud アカウントまたは RAM ユーザーをロールに追加します。
ロールによるテーブルの削除を拒否
シナリオ: 名前が tb_ で始まるテーブルは重要です。特定のアカウントには、これらのテーブルの削除を許可してはなりません。
ソリューション: 保護対象のテーブルに対する odps:Drop アクションをターゲットとする Deny ポリシーを持つロールを作成し、そのロールを関連ユーザーに割り当てます。
MaxCompute クライアントの使用
ロールを作成します。
create role <role_name>;policy_2.jsonという名前のポリシーファイルを作成し、MaxCompute クライアントのbinディレクトリに配置します。{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" } ] }<project_name>をご利用の MaxCompute プロジェクトの名前に置き換えます。ポリシーをロールにアタッチし、ロールをユーザーに割り当てます。
Alibaba Cloud アカウント:
ALIYUN$<account>RAM ユーザー:
RAM$<account>:<ram_username>
-- ポリシーをロールにアタッチします。 put policy policy_2.json on role <role_name>; -- ロールをユーザーに割り当てます。 grant <role_name> to <user_name>;<user_name>には、次のいずれかのフォーマットを使用します。
MaxCompute コンソールの使用
MaxCompute コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[ワークスペース] > [プロジェクト] を選択します。
対象のプロジェクトを見つけ、[操作] 列の [管理] をクリックします。
[ロール権限] タブで、[プロジェクトレベルのロールを作成] をクリックします。
[ロールの作成] ダイアログボックスで、[ロールタイプ] ドロップダウンリストから [リソース] を選択し、[ロール名] フィールドにロール名を入力し、[権限付与方法] で [ポリシー] を選択します。次のポリシードキュメントを入力します。
{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" } ] }[ロール権限] タブで、ロールを見つけ、[操作] 列の [メンバーの管理] をクリックして、Alibaba Cloud アカウントまたは RAM ユーザーをロールに追加します。
時間と IP の条件付きでの権限付与
シナリオ: アカウント a****@aliyunid.com は、プロジェクト test_project に対する CreateInstance、CreateTable、および List 権限を必要としますが、CIDR ブロック 10.32.180.0/23 からのアクセスに限定し、かつ 2018年11月11日 23:59:59 (協定世界時 (UTC)) までに限定する必要があります。また、このアカウントがプロジェクト内のテーブルを削除できないようにブロックする必要もあります。
ソリューション: (時間と IP の条件付きの) Allow 文と、Drop アクションに対する Deny 文を組み合わせたポリシーを持つロールを作成します。
MaxCompute クライアントの使用
policy_3という名前のロールを作成します。create role policy_3;policy_3.jsonという名前のポリシーファイルを作成し、MaxCompute クライアントのbinディレクトリに配置します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": ["odps:CreateTable", "odps:CreateInstance", "odps:List"], "Resource": "acs:odps:*:projects/<project_name>", "Condition": { "DateLessThan": { "acs:CurrentTime": "2018-11-11T23:59:59Z" }, "IpAddress": { "acs:SourceIp": "10.32.180.0/23" } } }, { "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/*" } ] }<project_name>をご利用の MaxCompute プロジェクトの名前に置き換えます。ポリシーをロールにアタッチし、ロールをユーザーに割り当てます。
-- ポリシーをロールにアタッチします。 put policy policy_3.json on role policy_3; -- ロールをユーザーに割り当てます。 grant policy_3 to ALIYUN$a****@aliyunid.com;
MaxCompute コンソールの使用
MaxCompute コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[ワークスペース] > [プロジェクト] を選択します。
対象のプロジェクトを見つけ、[操作] 列の [管理] をクリックします。
[ロール権限] タブで、[プロジェクトレベルのロールを作成] をクリックします。
[ロールの作成] ダイアログボックスで、[ロールタイプ] ドロップダウンリストから [リソース] を選択し、[ロール名] フィールドにロール名を入力し、[権限付与方法] で [ポリシー] を選択します。次のポリシードキュメントを入力します。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": ["odps:CreateTable", "odps:CreateInstance", "odps:List"], "Resource": "acs:odps:*:projects/<project_name>", "Condition": { "DateLessThan": { "acs:CurrentTime": "2018-11-11T23:59:59Z" }, "IpAddress": { "acs:SourceIp": "10.32.180.0/23" } } }, { "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/*" } ] }[ロール権限] タブで、ロールを見つけ、[操作] 列の [メンバーの管理] をクリックして、Alibaba Cloud アカウントまたは RAM ユーザーをロールに追加します。
パッケージベースのアクセス制御
同一アカウント内のプロジェクト間でのテーブル共有
シナリオ: ビジネスアナリストは、特定のプロダクションテーブルをクエリする必要がありますが、プロダクションタスクコードにアクセスしてはなりません。プロダクションデータは複数のプロジェクトにまたがっています。
ソリューション: 各プロダクションプロジェクトでパッケージを作成し、必要なテーブルをパッケージに追加し、専用の分析プロジェクトにパッケージをインストールして、アナリストにパッケージへの読み取りアクセス権を付与します。これにより、アナリストをすべてのプロダクションプロジェクトに追加する必要がなくなり、共有テーブルのみにアクセスが制限されます。
この例では、次のようになります。
プロダクションプロジェクト:
Project_a分析プロジェクト:
Project_analyzeパッケージ:
Package_test共有テーブル:
table_aアナリストアカウント:
A*****@aliyunid.com
プロダクションプロジェクトで、パッケージを作成し、共有するテーブルを追加します。
USE Project_a; CREATE PACKAGE Package_test; ADD table table_a TO PACKAGE Package_test;分析プロジェクトにパッケージのインストールを許可します。
ALLOW PROJECT Project_analyze TO INSTALL PACKAGE Package_test;分析プロジェクトで、パッケージをインストールします。
USE Project_analyze; INSTALL PACKAGE Project_a.Package_test;アナリストにパッケージへの読み取りアクセス権を付与します。
GRANT read on package Package_test TO USER ALIYUN$A*****@aliyunid.com;これで、アナリストは次の構文を使用して共有テーブルをクエリできます。
select * from Project_a.table_a;
異なる Alibaba Cloud アカウント間でのテーブル共有
シナリオ: 2つの部門が、内部のコスト配分のため、別々の Alibaba Cloud アカウントを使用して MaxCompute 環境を管理しています。彼らはデータを交換する必要がありますが、一方のアカウントの RAM ユーザーをもう一方のアカウントが所有するプロジェクトに追加することはできません。
ソリューション: プロバイダーアカウントのパッケージを使用して、特定のテーブルをコンシューマーアカウントと共有します。コンシューマーアカウントの RAM ユーザーは、プロバイダープロジェクトに直接追加されることなく、パッケージを通じてテーブルレベルのアクセス権を付与されます。
クロスアカウント認証後、アカウント間でデータを読み取ることができます。ただし、DataWorks コンソール経由で MaxCompute を使用する場合、異なる Alibaba Cloud アカウントの DataWorks ワークスペース間のスケジューリングの依存関係はサポートされていません。
この例では、次のようになります。
アカウント A は
Project_aを所有し、アカウント B はProject_bを所有しますパッケージ:
a_to_b_pkgb_user1(アカウント B の RAM ユーザー) はt1とt2への読み取りアクセスが必要ですb_user2(アカウント B の RAM ユーザー) はt3への読み取りアクセスが必要です
アカウント A を使用して、
Project_aにパッケージを作成し、テーブルを追加します。USE Project_a; CREATE PACKAGE a_to_b_pkg; ADD table t1 TO PACKAGE a_to_b_pkg; ADD table t2 TO PACKAGE a_to_b_pkg; ADD table t3 TO PACKAGE a_to_b_pkg;Project_bにパッケージのインストールを許可します。ALLOW Project_b TO INSTALL PACKAGE a_to_b_pkg;アカウント B を使用して、
Project_bにパッケージをインストールします。INSTALL PACKAGE Project_a.a_to_b_pkg;アカウント B の RAM ユーザーを
Project_bに追加し、パッケージ内の特定のテーブルへのアクセス権を付与します。add user ram$B:b_user1; add user ram$B:b_user2; -- b_user1 に t1 と t2 へのアクセス権を付与します。 GRANT Describe, Select ON TABLE t1 TO USER ram$B:b_user1 PRIVILEGEPROPERTIES ("refobject"="true", "refproject"="project_a", "package"="project_a.a_to_b_pkg"); GRANT Describe, Select ON TABLE t2 TO USER ram$B:b_user1 PRIVILEGEPROPERTIES ("refobject"="true", "refproject"="project_a", "package"="project_a.a_to_b_pkg"); -- b_user2 に t3 へのアクセス権を付与します。 GRANT Describe, Select ON TABLE t3 TO USER ram$B:b_user2 PRIVILEGEPROPERTIES ("refobject"="true", "refproject"="project_a", "package"="project_a.a_to_b_pkg");
行レベルのアクセス制御の実装
シナリオ: ProjectA の table_order テーブルには、すべてのマーチャントの注文が含まれています。各マーチャントは、自身の注文のみをクエリできなければなりません。
仕組み: MaxCompute は、ネイティブの行レベルのアクセス制御をサポートしていません。マーチャントごとの行の分離を実現するには、マーチャント ID (sellerid) で table_order をフィルターするビューをマーチャントごとに個別に作成します。各マーチャントには、パッケージを通じて自身のビューへのアクセス権を付与します。マーチャントはベーステーブルに直接アクセスするのではなくビューにアクセスするため、自身の sellerid に一致する行しか表示できません。
ProjectAで、各マーチャント用にフィルターされたビューを作成します。CREATE VIEW <viewname> AS SELECT * FROM table_order WHERE sellerid='<merchant_id>';<viewname>をビュー名に、<merchant_id>をマーチャントの ID に置き換えます。パッケージを作成し、それにビューを追加して、マーチャントのプロジェクトにそのインストールを許可します。
<packagename>: パッケージの名前<Projectname_seller>: マーチャントに属する MaxCompute プロジェクト
create package <packagename>; add table <viewname> to package <packagename>; allow project <Projectname_seller> to install package <packagename>;マーチャントのプロジェクトで、パッケージをインストールし、マーチャントに読み取りアクセス権を付与します。
USE <Projectname_seller>; install package <ProjectA>.<packagename>; grant read on package <ProjectA>.<packagename> to user <username>;その後、マーチャントは次のようにして自身のデータをクエリできます。
select * from <ProjectA>.<viewname>;<username>を、マーチャントがビューをクエリするために使用するアカウントに置き換えます。