このトピックでは、テーブルやユーザー定義関数 (UDF) などのリソースへのアクセスを特定のユーザーに制限する方法について説明します。このメソッドは、特に UDF にデータ暗号化や復号が含まれる場合に、データセキュリティとコントロールのために頻繁に使用されます。
前提条件
MaxCompute クライアントをインストールします。詳細については、「MaxCompute クライアントのインストールと設定」をご参照ください。
背景情報
ユーザーアクセス権限を設定するための標準的なメソッドには、以下が含まれます。
-
パッケージを使用した詳細な権限コントロール
パッケージは、プロジェクト間でデータを共有し、リソースへのアクセスを権限付与するために使用されます。しかし、パッケージを使用してユーザーに開発者ロールを付与すると、そのユーザーに完全な権限が与えられ、セキュリティリスクが生じます。詳細については、「パッケージを使用したプロジェクト間でのリソースへのアクセス」をご参照ください。
-
以下の出力は、DataWorks 開発者ロールの権限を示しています。
odps@ xxx desc role role_project_dev; Authorization Type: Policy A projects/sz_mc: * A projects/sz_mc/instances/*: * A projects/sz_mc/jobs/*: * A projects/sz_mc/offlinemodels/*: * A projects/sz_mc/packages/*: * A projects/sz_mc/registration/functions/*: * A projects/sz_mc/resources/*: * A projects/sz_mc/tables/*: * A projects/sz_mc/volumes/*:開発者ロールは、デフォルトでワークスペース内のパッケージ、関数、リソース、テーブルに対する完全な権限を持ちます。このアプローチでは、権限が広すぎます。
-
以下の出力は、DataWorks で開発者ロールが割り当てられた後の RAM ユーザーに付与される権限を示しています。
odps@ xxx> show grants for RAM$yxxx.pt@aliyun-test.com:ramtest; [roles] role_project_dev Authorization Type: Policy [role/role_project_dev] A projects/sz_mc: * A projects/sz_mc/instances/*: * A projects/sz_mc/jobs/*: * A projects/sz_mc/offlinemodels/*: * A projects/sz_mc/packages/*: * A projects/sz_mc/registration/functions/*: * A projects/sz_mc/resources/*: * A projects/sz_mc/tables/*: * A projects/sz_mc/volumes/*: *
したがって、パッケージによる権限付与も、DataWorks のデフォルトロールも、特定のユーザーが特定の UDF にアクセスするという要件を満たすことはできません。例えば、RAM ユーザー
RAM$xxxxx.pt@aliyun-test.com:ramtestに開発者ロールを付与すると、その RAM ユーザーはデフォルトで現在のワークスペース内のすべてのオブジェクトに対するすべての権限を持つことになります。詳細については、「ユーザーへの権限付与」をご参照ください。 -
-
DataWorks でカスタムロールを作成して権限をコントロールする
DataWorks ワークスペース設定の MaxCompute 詳細設定 ページで、カスタムユーザーロールの権限を管理できます。ただし、このページでは、特定のテーブルまたはプロジェクトに対する権限のみを付与でき、個々のリソースや UDF に対する権限は付与できません。
説明DataWorks ワークスペースにおける MaxCompute のプロパティに関する詳細については、「MaxCompute 実行エンジンの権限設定」をご参照ください。
-
ロールポリシーとプロジェクトポリシーを組み合わせて、特定のユーザーに特定の UDF へのアクセスを許可する
ポリシーを使用すると、特定のリソースに対するユーザー権限を詳細にコントロールできます。
説明セキュリティのため、本番環境に適用する前に、テストプロジェクトでポリシーをテストしてください。
したがって、以下のパターンに従ってポリシーを使用し、特定のユーザーに特定の UDF へのアクセスを許可できます。
-
他のユーザーがワークスペース内の特定のリソースにアクセスするのを防ぎたい場合は、まず DataWorks でデータ開発者の権限を付与し、次に MaxCompute クライアントでロールポリシーを使用して明示的にアクセスを拒否します。
-
特定のユーザーに特定のリソースへのアクセスを許可する必要がある場合は、まず DataWorks でデータ開発者の権限を付与し、次に MaxCompute クライアントでプロジェクトポリシーを使用して明示的にアクセスを許可します。
操作手順
-
デフォルトで UDF へのアクセスを拒否するロールを作成します。
-
MaxCompute クライアントで、次のコマンドを実行して denyudfrole という名前のロールを作成します。
create role denyudfrole; -
以下の内容でポリシーファイルを作成します。
{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": ["odps:Read","odps:List"], "Resource": "acs:odps:*:projects/sz_mc/resources/getaddr.jar" }, { "Effect": "Deny", "Action": ["odps:Read","odps:List"], "Resource": "acs:odps:*:projects/sz_mc/registration/functions/getregion" } ] } -
ロールポリシーを設定します。
次のコマンドを実行して、ポリシーファイルからロールにポリシーを適用します。
put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole; -
次のコマンドを実行して、ロールポリシーを表示します。
get policy on role denyudfrole;次の結果が返されます。
odps@ get policy on role denyudfrole; { "Statement": [{ "Action": ["odps:Read", "odps:List"], "Effect": "Deny", "Resource": ["acs:odps:*:projects/sz_mc/resources/getaddr.jar"]}, { "Action": ["odps:Read", "odps:List"], "Effect": "Deny", "Resource": ["acs:odps:*:projects/sz_mc/registration/functions/getregion"]}], "Version": "1"} -
次のコマンドを実行して、RAM ユーザーを denyudfrole ロールに追加します。
grant denyudfrole to RAM$xxxx.pt@aliyun-test.com:ramtest;
-
-
UDF 拒否ロールが作成されたことを確認します。
-
クライアントにログインし、
whoami;を入力してロールを確認します。odps@ xxx>whoami; Name: RAM$xxx pt@aliyun-test.com:ramtest End_Point: http://service.odps.aliyun.com/api Tunnel_End_Point: http://dt.cn-shanghai.maxcompute.aliyun.com Project: xxx -
show grants;を実行して、現在のユーザーの権限を表示します。odps@xxx >show grants; [roles] role_project_dev, denyudfrole Authorization Type: Policy [role/denyudfrole] D projects/xxx/registration/functions/getregion: List | Read D projects/xxx/resources/getaddr.jar: List | Read [role/role_project_dev] A projects/xxx: * A projects/xxx/instances/*: * A projects/xxx/jobs/*: * A projects/xxx/offlinemodels/*: * A projects/xxx/packages/*: * A projects/xxx/registration/functions/*: * A projects/xxx/resources/*: * A projects/xxx/tables/*: * A projects/xxx/volumes/*: *クエリ結果は、RAM ユーザーが role_project_dev (DataWorks のデフォルト開発者ロール) と denyudfrole (作成したカスタムロール) の 2 つのロールを持っていることを示しています。
-
カスタム UDF とその依存パッケージの権限を確認します。
odps@ xxx>desc function getregion; FAILED: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilege 'odps:Read' on {acs:odps:*:projects/xxx/resources/xxx}. -->Tips: Pricipal:RAMS xxx.pl@aliyun-esl.com.ramlesl by policy ID:38747231-386f-4018-b792-1da11700dc7e. odps@ xxx>desc resource getaddr.jar; FAILED: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilege 'odps:Read' on {acs:odps:*:pro 1-5788-49b1-82b8-1f4a95c2f9c5. -->Tips: Pricipal:RAMS xxx.pt@aliyun-test.com [xxx] [DEBUG]: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilegこの結果は、RAM ユーザーが開発者ロールを持っているにもかかわらず、カスタム UDF getregion に対する読み取り権限がないことを示しています。このユーザーに明示的なアクセスを許可するには、プロジェクトポリシーを設定する必要があります。
-
-
プロジェクトポリシーを設定します。
-
ポリシーを作成します。
{ "Version": "1", "Statement": [{ "Effect":"Allow", "Principal":"RAM$yangyi.pt@aliyun-test.com:yangyitest", "Action":["odps:Read","odps:List","odps:Select"], "Resource":"acs:odps:*:projects/sz_mc/resources/getaddr.jar" }, { "Effect":"Allow", "Principal":"RAM$yangyi.pt@aliyun-test.com:yangyitest", "Action":["odps:Read","odps:List","odps:Select"], "Resource":"acs:odps:*:projects/sz_mc/registration/functions/getregion" }] } -
プロジェクトポリシーを適用します。
次のコマンドを実行して、指定されたファイルからプロジェクトポリシーを適用します。
put policy /Users/yangyi/Desktop/project_policy.json; -
次のコマンドを実行して、プロジェクトポリシーを表示します。
get policy;次の結果が返されます。
odps@ xxx>get policy; { "Statement": [{ "Action": ["odps:Read", "odps:List", "odps:Select"], "Effect": "Allow", "Principal": ["RAM$xxxl.pt@aliyun-test.com:yangyitest"], "Resource": ["acs:odps:*:projects/sz_mc/resources/getaddr.jar"]}, { "Action": ["odps:Read", "odps:List", "odps:Select"], "Effect": "Allow", "Principal": ["RAM$yangyi.pt@aliyun-test.com:yangyitest"], "Resource": ["acs:odps:*:projects/sz_mc/registrxxx"] "Version": "1"} -
whoami;とshow grants;を実行して確認します。odps@ xxx whoami; Name: RAM$xxx.pt@aliyun-test.com:yangyitest End_Point: http://service.odps.aliyun.com/api Tunnel_End_Point: http://dt.cn-shanghai.maxcompute.aliyun.com Project: sz_mc odps@ xxx show grants; [roles] role_project_dev Authorization Type: Policy [role/role_project_dev] A projects/sz_mc: * A projects/sz_mc/instances/*: * A projects/sz_mc/jobs/*: * A projects/sz_mc/offlinemodels/*: * A projects/sz_mc/packages/*: * A projects/sz_mc/registration/functions/*: * A projects/sz_mc/resources/*: * A projects/sz_mc/tables/*: * A projects/sz_mc/volumes/*: * [user/RAM$yangyi.pt@aliyun-test.com:yangyitest] -
SQL タスクを実行して、指定された RAM ユーザーのみが UDF とその依存パッケージにアクセスできることを確認します。
-
指定された RAM ユーザーは UDF にアクセスできます。
odps@ xxx:select getregion('172.xxx.xxx.1'); ID = 2019011409xxx Log view: http://logview.odps.aliyun.com/logview/?h=http://service.odps.aliyun.com/api&p=sz_xxx U00DA2MTU2Myx7IlN0YXR1xxx/hZCJdLCJFZmZlY3QiOiJBbGxvxxx biI6IjEifQ== Job Queueing. STAGES STATUS TOTAL COMPLETED RUNNING PENDING BACKU M1_job_0 .......... TERMINATED 1 1 0 0 STAGES: 01/01 [==============================>>] 100% ELAPSED TIME: 24.34 s Summary: resource cost: cpu 0.27 Core * Min, memory 0.53 GB * Min inputs: outputs: Job run time: 18.000 Job run mode: fuxi job Job run engine: execution engine M1: instance count: 1 run time: 18.000 instance time: min: 16.000 -
ユーザーは依存パッケージにアクセスできます。
odps# desc resource getaddr.jar; Name getaddr.jar Owner ALIYUNSxxx.pt@oliyun-test.com Type JAR Comment IDE RESOURCE UPDATE TO ODPS /home/admin/oxs-base-biz-phoenix/temp/4d3efccz0l9eiirin53o5n4/getaddr.jar CreatedTime 2018-05-24 19:51:16 LastModifiedTime 2018-05-24 19:51:16 LastUpdator Size 1353716 Md5sum 770497a9f605e09e198cb166cec7fa08
-
-