MaxCompute プロジェクトのデータを保護するには、プロジェクトオーナーまたは権限を付与されたユーザーが、最小権限の原則に従ってメンバーのアクセスを管理する必要があります。このトピックでは、MaxCompute における権限管理の一般的なユースケースについて説明します。
ポリシーベースのアクセス制御のユースケース
ポリシーによるロール権限の付与
-
ユースケース:
プロジェクトメンバーのグループに、テーブルの作成、リソースのアップロード、関数の作成、タスクの実行の権限を付与します。プレフィックスが
t_app_で始まるテーブルに対しては、すべての権限が付与されます。 -
手順:
MaxCompute クライアントの使用
-
新しいロールを作成します。
create role <role_name>;<role_name> はロールの名前です。
-
MaxCompute クライアントの
binディレクトリにpolicy_1.jsonという名前のファイルを作成し、次の内容を貼り付けます。{ "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 プロジェクトの名前です。
-
ポリシーを適用し、ロールを付与します。
-- 新しいロールにポリシーをアタッチします。 put policy policy_1.json on role <role_name>; -- 対象のユーザーにロールを付与します。 grant <role_name> to <user_name>;<user_name> は対象のユーザーアカウントです。Alibaba Cloud アカウントの場合は
ALIYUN$<account_email>の形式を使用します。RAM ユーザーの場合はRAM$<parent_account_email>:<ram_user_name>の形式を使用します。
コンソールの使用
-
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_で始まるテーブルを削除できないようにします。 -
手順:
MaxCompute クライアントの使用
-
新しいロールを作成します。
create role <role_name>;<role_name> はロールの名前です。
-
MaxCompute クライアントの
binディレクトリにpolicy_2.jsonという名前のファイルを作成し、次の内容を貼り付けます。{ "Version": "1", "Statement": [{ "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }] }<project_name> はお使いの MaxCompute プロジェクトの名前です。
-
ポリシーを適用し、ロールを付与します。
-- 新しいロールにポリシーをアタッチします。 put policy policy_2.json on role <role_name>; -- 対象のユーザーにロールを付与します。 grant <role_name> to <user_name>;<user_name> は対象のユーザーアカウントです。Alibaba Cloud アカウントの場合は
ALIYUN$<account_email>の形式を使用します。RAM ユーザーの場合はRAM$<parent_account_email>:<ram_user_name>の形式を使用します。
コンソールの使用
-
MaxCompute コンソールにログインし、上部メニューでリージョンを選択します。
-
左側のナビゲーションペインで、ワークスペース > [プロジェクト] を選択します。
-
[プロジェクト] ページで、目的のプロジェクトを見つけ、[操作] 列の 管理 をクリックします。
-
ロール権限 タブで、プロジェクトレベルのロールの追加 をクリックします。
-
新しいロール ダイアログボックスで、リソースタイプロールを作成し、[ロール名] を入力し、ポリシーコンテンツを貼り付けます。
次のポリシーの内容を入力します。
{ "Version": "1", "Statement": [{ "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }] } -
ロール権限 タブで、作成したロールを見つけ、[アクション] 列の [メンバー管理] をクリックし、対象の Alibaba Cloud アカウントまたは RAM ユーザーをロールに追加します。
-
ポリシーによる条件付き権限の付与
-
ユースケース:
ユーザー (
a****@aliyunid.com) に、特定の条件を持つ一連の権限を付与します。このユーザーは、リクエストが2018 年 11 月 11 日 23:59:59より前に行われ、かつ送信元 IP アドレス範囲が10.32.180.0/23である場合にのみ、test_project プロジェクトでCreateInstance、CreateTable、およびListアクションを実行できます。また、このユーザーが、そのプロジェクト内のいかなるテーブルも削除できないようにする必要があります。 -
手順:
MaxCompute クライアントの使用
-
新しいロールを作成します。
create role policy_3; -
MaxCompute クライアントの
binディレクトリにpolicy_3.jsonという名前のファイルを作成し、次の内容を貼り付けます。{ "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 コンソールにログインし、上部メニューでリージョンを選択します。
-
左側のナビゲーションペインで、ワークスペース > [プロジェクト] を選択します。
-
[プロジェクト] ページで、目的のプロジェクトを見つけ、[操作] 列の 管理 をクリックします。
-
ロール権限 タブで、プロジェクトレベルのロールの追加 をクリックします。
-
新しいロール ダイアログボックスで、リソースタイプのロールを作成し、[ロール名] を入力して、ポリシーコンテンツを貼り付けます。
次のポリシーの内容を入力します。
{ "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) でPackage_testという名前のパッケージが作成されるワークフローを示します。本番テーブル(table_a) がこのパッケージに追加されます。その後、このパッケージは分析プロジェクト (Project_analyze) にインストールされ、ユーザー (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 アカウントを使用して MaxCompute リソースを管理することがあります。これらの部門がデータを共有する必要がある場合、安全できめ細かなアクセス制御のメカニズムが必要です。これにより、あるアカウントのユーザーが別のアカウントから特定のテーブルのみを読み取ることができるようになり、最小権限の原則が徹底されます。
説明-
ある Alibaba Cloud アカウントの RAM ユーザーを、別のアカウントが所有する MaxCompute プロジェクトに追加することはできません。たとえば、アカウント A は、自身が所有するプロジェクトにアカウント B の RAM ユーザーを追加することはできません。
-
テーブル、リソース、または関数に対する読み取り権限のみを付与する必要がある場合は、パッケージを使用して、異なる Alibaba Cloud アカウントに属するプロジェクト間でリソースを共有できます。
-
-
解決策
アカウント A とアカウント B という 2 つの Alibaba Cloud アカウントがあるとします。アカウント A は
Project_aという名前のプロジェクトを所有し、アカウント B はProject_bという名前のプロジェクトを所有しています。アカウント B の RAM ユーザーであるb_user1に、Project_a内のテーブルt1とt2に対する読み取り権限を付与する必要があります。また、アカウント B の別の RAM ユーザーであるb_user2に、Project_a内のテーブルt3に対する読み取り権限を付与する必要があります。重要権限付与を使用して異なる Alibaba Cloud アカウント間でデータを共有することはできますが、異なる Alibaba Cloud アカウントに属する DataWorks ワークスペース内のタスクは相互に通信できません。これは、これらのタスク間でスケジューリングの依存関係を設定できないことを意味します。
-
手順:
-
Project_aで、Alibaba Cloud アカウント A を使用してa_to_b_pkgという名前のパッケージを作成し、テーブルt1、t2、t3をパッケージに追加します。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; -
(アカウント B が所有する) プロジェクト Project_b が、
a_to_b_pkgパッケージをインストールすることを許可します。ALLOW PROJECT Project_b TO INSTALL PACKAGE a_to_b_pkg; -
プロジェクト Project_b で、Alibaba Cloud アカウント B を使用して
a_to_b_pkgパッケージをインストールします。INSTALL PACKAGE Project_a.a_to_b_pkg; -
アカウント B の RAM ユーザーに、パッケージ内のテーブルに対する権限を付与します。
add user ram$B:b_user1; add user ram$B:b_user2; 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");-- b_user1 にテーブル t1 の読み取り権限を付与 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_user1 にテーブル t2 の読み取り権限を付与 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");-- b_user2 にテーブル t3 の読み取り権限を付与
-
パッケージによる行レベルのアクセス制御
-
ユースケース:
プロジェクト
ProjectAのtable_orderという名前のテーブルには、すべてのマーチャントの注文情報が含まれています。このテーブルをマーチャントと共有する必要がありますが、各マーチャントは自身のストアに対応する注文のみを表示できるようにする必要があります。 -
解決策:
table_orderテーブルには、データをフィルタリングするために使用できるマーチャント ID 列が含まれています。MaxCompute は行レベルのアクセス制御を直接サポートしていませんが、table_orderテーブルに基づいてマーチャントごとに個別のビューを作成することで実装できます。その後、パッケージを使用して、各マーチャントに対応するビューへの権限を付与できます。この方法は、行レベルのアクセス制御を効果的に実現します。 -
手順:
-
ProjectA で、各マーチャント専用のビューを作成します。
CREATE VIEW <viewname> as select * from table_order WHERE sellerid='xxxx';<viewname> は作成するビューの名前です。
-
ProjectA で、パッケージを作成し、ビューをマーチャントと共有します。
create package <packagename>; add table <viewname> to package <packagename>; allow project <Projectname_seller> to install package <packagename>;<packagename> はパッケージの名前です。 <Projectname_seller> はマーチャントの MaxCompute プロジェクトの名前です。
-
マーチャントは自身のプロジェクトにパッケージをインストールし、ビューをクエリします。
USE <Projectname_seller>; install package <ProjectA>.<packagename>; grant read on package <ProjectA>.<packagename> to user <username>; select * from <ProjectA>.<viewname>;<username> はマーチャントのプロジェクト内でビューをクエリするユーザーです。
-