すべてのプロダクト
Search
ドキュメントセンター

DataWorks:ベストプラクティス:特定のユーザーに UDF へのアクセスを許可する

最終更新日:Jul 25, 2026

このトピックでは、テーブルやユーザー定義関数 (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 クライアントでプロジェクトポリシーを使用して明示的にアクセスを許可します。

操作手順

  1. デフォルトで UDF へのアクセスを拒否するロールを作成します。

    1. MaxCompute クライアントで、次のコマンドを実行して denyudfrole という名前のロールを作成します。

      create role denyudfrole;
    2. 以下の内容でポリシーファイルを作成します。

      {
        "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"
          }
        ]
      }
    3. ロールポリシーを設定します。

      次のコマンドを実行して、ポリシーファイルからロールにポリシーを適用します。

      put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole;
    4. 次のコマンドを実行して、ロールポリシーを表示します。

      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"}
    5. 次のコマンドを実行して、RAM ユーザーを denyudfrole ロールに追加します。

      grant denyudfrole to RAM$xxxx.pt@aliyun-test.com:ramtest;
  2. UDF 拒否ロールが作成されたことを確認します。

    1. クライアントにログインし、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
    2. 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 つのロールを持っていることを示しています。

    3. カスタム 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 に対する読み取り権限がないことを示しています。このユーザーに明示的なアクセスを許可するには、プロジェクトポリシーを設定する必要があります。

  3. プロジェクトポリシーを設定します。

    1. ポリシーを作成します。

      {
      "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"
      }] }
    2. プロジェクトポリシーを適用します。

      次のコマンドを実行して、指定されたファイルからプロジェクトポリシーを適用します。

      put policy /Users/yangyi/Desktop/project_policy.json;
    3. 次のコマンドを実行して、プロジェクトポリシーを表示します。

      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"}
    4. 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]
    5. 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