实现指定用户访问特定UDF最佳实践

更新时间:
复制为 MD 格式

本文为您介绍如何实现将资源(表、UDF等)设置为仅能被指定的用户访问。此方法涉及数据的加密解密算法,属于数据安全管控范畴。

前提条件

您需要提前安装MaxCompute客户端,以实现指定UDF被指定用户访问的操作。详情请参见安装并配置MaxCompute客户端

背景信息

设置用户访问权限的常见方法有如下几种:

  • Package方案,通过打包授权进行权限精细化管控。

    Package用于解决跨项目空间的数据共享及资源授权问题。通过Package授予用户开发者角色后,用户拥有所有权限,风险不可控。详情请参见基于Package跨项目访问资源

    • 以下为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/*:

      由以上信息可见,开发者角色对工作空间中的Package、Functions、ResourcesTable默认有全部权限,不符合权限配置的要求。

    • 以下为通过DataWorks添加子账号并赋予开发者角色的权限。

      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$xxxxx.pt@aliyun-test.com:ramtest开发者角色,则默认该子账号拥有当前工作空间中全部对象的所有操作权限,详情请参见用户授权

  • DataWorks中新建角色进行权限管控。

    DataWorks工作配置页面的MaxCompute高级配置页面,可以对自定义用户角色进行权限管控。在该页面只能针对某个表或项目进行授权,不能对资源和UDF进行授权。

    说明

    更多有关DataWorks工作空间的MaxCompute属性介绍,请参见配置MaxCompute引擎权限

  • Role Policy结合Project Policy实现指定用户访问指定UDF。

    通过Policy可以精细化地管理具体用户对特定资源的具体权限粒度。

    说明

    为了安全起见,建议初学者使用测试项目来验证Policy。

因此您可以通过Policy方案实现特定UDF被指定用户访问:

  • 如果您不想让其他用户访问工作空间内具体的资源,在DataWorks中添加数据开发者权限后,再根据Role Policy的操作,在MaxCompute客户端将其配置为拒绝访问权限。

  • 如果您需要指定用户访问指定资源,在DataWorks中添加数据开发者权限后,再根据Project Policy的操作,在MaxCompute客户端将其配置为允许访问权限。

操作步骤

  1. 创建默认拒绝访问UDF的角色。

    1. 在客户端输入如下命令创建角色denyudfrole。

      create role denyudfrole;
    2. 创建Policy授权文件。

      {
        "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. 设置Role Policy。

      在客户端执行如下命令,设置Role Policy文件的存放路径。

      put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole;
    4. 在客户端执行如下命令查看Role Policy。

      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. 在客户端执行如下命令添加子账号至role 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。

    3. 验证自建UDF以及依赖的包的权限。

      odps@ xxx:desc function getregion;
      FAILED: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilege 'odps:Read' on {acs:odps:*:
      ID:38747231-386f-4018-b792-1da11700dc7e}.    --->Tips: Pricipal:RAM$xxx.pl@aliyun-esl.com.ramlesl by policy
      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:RAM$xxx.pt@aliyun-test.com [xxx]

      通过上述验证发现,该子账号在拥有DataWorks开发者角色的前提下,没有自建UDF(getregion)的读权限。您还需要结合Project Policy来实现该UDF只能被指定的用户访问。

  3. 配置Project Policy。

    1. 编写Policy。

      {
      "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$xxxx.pt@aliyun-test.com:yangyitest",
      "Action":["odps:Read","odps:List","odps:Select"],
      "Resource":"acs:odps:*:projects/sz_mc/registration/functions/getregion"
      }] }
    2. 设置Role Policy。

      在客户端执行如下命令,设置Role Policy文件的存放路径。

      put policy /Users/yangyi/Desktop/project_policy.json;
    3. 在客户端执行如下命令查看Role Policy。

      get policy;

      返回结果如下。

      odps@ xxx> get policy;
      {
          "Statement": [{
              "Action": ["odps:Read",
                  "odps:List",
                  "odps:Select"],
              "Effect": "Allow",
              "Principal": ["RAM$xxx.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');
        +------------+
        | _c0        |
        +------------+
        | [美国, 美国, , ] |
        +------------+
      • 查看依赖包。

        odps# desc resource getaddr.jar;
        Name                getaddr.jar
        Owner               ALIYUNSxxxxxxxx.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