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

前提条件

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

常见方案

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

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

    • 下图为DataWorks开发者角色的权限。开发者角色

      由上图可见,开发者角色对工作空间中的Package、Functions、Resources和Table默认有全部权限,明显不符合权限配置的要求。

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

    由此可见,通过打包授权和DataWorks默认的角色都不能满足我们的需求。例如,授予子账号RAM$xxxxx.pt@aliyun-test.com:ramtest开发者角色,则默认该子账号拥有当前工作空间中所有Object的所有操作权限,详情请参见用户授权

  • 在DataWorks中新建角色来进行高级管控。

    您可以进入DataWorks控制台中的工作空间配置 > MaxCompute高级配置 > 自定义用户角色页面,进行高级管控。但是在MaxCompute高级配置中,只能针对某个表或项目进行授权,不能对资源和UDF进行授权。

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

    通过Policy可以精细化地管理到具体用户针对具体资源的具体权限粒度,下文将为您介绍如何通过Policy方案实现指定UDF被指定用户访问。

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

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

  1. 创建默认拒绝访问UDF的角色。
    1. 在客户端输入create role denyudfrole;,创建一个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。

      在客户端输入put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole;命令,设置Role Policy文件的存放路径等配置。

      通过get policy on role denyudfrole;命令,查看Role Policy。查看role
    4. 在客户端输入grant denyudfrole to RAM$xxxx.pt@aliyun-test.com:ramtest;,添加子账号至role denyudfrole。
  2. 验证拒绝访问UDF的角色是否创建成功。

    以子账号RAM$xxxx.pt@aliyun-test.com:ramtest登录MaxCompute客户端。

    1. 登录客户端输入whoami;确认角色。确认角色
    2. 通过show grants;查看当前登录用户权限。查看权限

      通过查询发现该RAM子账号有两个角色,一个是role_project_dev(即DataWorks默认的开发者角色),另一个是刚自定义创建的denyudfrole。

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

    通过上述验证发现,该子账号在拥有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. 设置和查询Policy。

      通过put policy /Users/yangyi/Desktop/project_policy.json;命令设置Policy文件的存放路径。

      通过get policy;命令查看Policy。查看Policy
    3. 通过whoami;show grants;进行验证。验证
    4. 运行SQL任务,查看是否仅指定的RAM子账号能够查看指定的UDF和依赖的包。查看结果

总结

关于DataWorks和MaxCompute如何实现指定用户访问指定UDF,总结如下:
  • 如果您不想让其他用户访问工作空间内具体的资源,在DataWorks中添加数据开发者权限后,再根据Role Policy的操作,在MaxCompute客户端将其配置为拒绝访问权限。
  • 如果您要指定用户访问指定资源,通过Role Policy在DataWorks中配置数据开发者权限后,再根据Project Policy的操作,在MaxCompute客户端将其配置为允许访问权限。