授权实践

更新时间:
复制 MD 格式

为确保MaxCompute项目数据的安全性,项目所有者或者具备授权权限的用户需要合理管控项目内成员的权限。本文介绍MaxCompute的权限管理案例。

权限评估优先级概述

  • Deny 优先于 Allow

  • Project Owner 和 Super_Administrator 不受限制

  • ACL 授权和 Policy 授权独立评估,Condition 仅约束所在 Policy

Policy权限控制案例

通过Policy以角色方式允许某些用户执行操作

  • 场景说明:

    对部分项目成员进行权限控制,允许创建表、Resource文件上传、Function创建、任务执行并只允许读以t_app_开头的表。

  • 操作步骤:

    通过MaxCompute客户端实现

    1. 创建新角色:

      create role <role_name>;

      role_name为角色名称。

    2. 准备Policy脚本,并放置文件在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_nameMaxCompute项目名称

    3. 授权。

      --给新创建的角色授权
      put policy policy_1.json on role <role_name>;
      
      --把角色授权给目标用户
      grant <role_name> to <user_name>;  

      user_name为授权目标用户的账号,阿里云账号格式为ALIYUN$阿里云账号,RAM用户账号格式为RAM$归属阿里云账号:RAM用户名

    通过控制台实现

    1. 登录MaxCompute控制台,在左上角选择地域。

    2. 在左侧导航栏,选择管理配置 > 项目管理

    3. 项目管理页面,单击目标项目操作列的管理

    4. 项目配置页面,选择角色权限页签。

    5. 单击新增项目级别角色,创建支持MaxCompute相关权限的项目角色。

    6. 在弹出的新建角色对话框,创建资源操作类(Resource)角色,填写角色名称Policy授权策略。

      Policy内容如下:

      {
       "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"}
    7. 选择目标项目级别角色,单击操作列的成员管理。选择需授权的阿里云主账号或RAM用户,单击确定完成授权。若首次授权时未能搜索到对应账号,可下方手动添加成员区域添加。

通过Policy以角色方式禁止某用户执行操作

  • 场景说明:在业务需求上有些表非常重要,不允许某些账号删除同时要求杜绝误删,假设这些表名都是以tb_开头,通过Policy授权方式实现。

  • 操作步骤:

    通过MaxCompute客户端实现

    1. 创建新角色。

      create role <role_name>;

      role_name为角色名称。

    2. 准备Policy脚本,并放置文件在MaxCompute客户端文件所在的bin目录下,脚本文件名称为policy_2.json内容如下:

      { 
        "Version": "1", 
        "Statement": [{ 
          "Effect": "Deny", 
          "Action": "odps:Drop", 
          "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }]
      }

      project_nameMaxCompute项目名称

    3. 授权。

      --给新创建的角色授权
      put policy policy_2.json on role <role_name>;
      
      --把角色授权给目标用户
      grant <role_name> to <user_name>;  

      user_name为授权目标用户的账号,阿里云账号格式为ALIYUN$阿里云账号,RAM用户账号格式为RAM$归属阿里云账号:RAM用户名

    通过控制台实现

    1. 登录MaxCompute控制台,在左上角选择地域。

    2. 在左侧导航栏,选择管理配置 > 项目管理

    3. 项目管理页面,单击目标项目操作列的管理

    4. 项目配置页面,选择角色权限页签。

    5. 单击新增项目级别角色,创建支持MaxCompute相关权限的项目角色。

    6. 在弹出的新建角色对话框,创建资源操作类(Resource)角色,填写角色名称Policy授权策略。

      Policy内容如下:

      { 
        "Version": "1", 
        "Statement": [{ 
          "Effect": "Deny", 
          "Action": "odps:Drop", 
          "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }]
      }
    7. 选择目标项目级别角色,单击操作列的成员管理。选择需授权的阿里云主账号或RAM用户,单击确定完成授权。若首次授权时未能搜索到对应账号,可下方手动添加成员区域添加。

通过Policy以角色方式授权

重要
  • Policy 的 Condition 仅约束该 Policy 本身授予的权限,不影响通过 ACL(GRANT 命令)或角色继承获得的权限。

  • 如果用户同时拥有其他不带条件的权限来源(如 admin 角色、直接 ACL 授权),Condition 中的 IP 限制不会生效。

  • 示例一

    • 场景说明:

      授权用户a****@aliyunid.com只能在2026-11-11 23:59:59这个时间点之前、只能从10.32.180.0/23这个IP段提交请求、只允许在项目空间test_project中执行CreateInstanceCreateTableList操作且禁止删除test_project下的任何表。

    • 操作步骤:

      通过MaxCompute客户端实现

      1. 创建新角色:

        create role policy_3;
      2. 准备Policy脚本,并放置文件在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":"2026-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_nameMaxCompute项目名称

      3. 授权。

        --给新创建的角色授权
        put policy policy_3.json on role policy_3;
        
        --把角色授权给目标用户
        grant policy_3 to ALIYUN$a****@aliyunid.com;  

      通过控制台实现

      1. 登录MaxCompute控制台,在左上角选择地域。

      2. 在左侧导航栏,选择管理配置 > 项目管理

      3. 项目管理页面,单击目标项目操作列的管理

      4. 项目配置页面,选择角色权限页签。

      5. 单击新增项目级别角色,创建支持MaxCompute相关权限的项目角色。

      6. 在弹出的新建角色对话框,创建资源操作类(Resource)角色,填写角色名称Policy授权策略。

        Policy内容如下:

        {
        "Version": "1",
        "Statement":
         [{
            "Effect":"Allow",
            "Action":["odps:CreateTable","odps:CreateInstance","odps:List"],
            "Resource":"acs:odps:*:projects/<project_name>",
            "Condition":{
                "DateLessThan": {
                    "acs:CurrentTime":"2026-11-11T23:59:59Z"
                },
                "IpAddress": {
                    "acs:SourceIp":"10.32.180.0/23"
                }
            }
        },
        {
            "Effect":"Deny",
            "Action":"odps:Drop",
            "Resource":"acs:odps:*:projects/<project_name>/tables/*"
        }]
        }
      7. 项目配置页面,选择角色权限页签。

        选择目标项目级别角色,单击操作列的成员管理。选择需授权的阿里云主账号或RAM用户,单击确定完成授权。若首次授权时未能搜索到对应账号,可下方手动添加成员区域添加。

  • 示例二通过 Deny Policy 强制 IP 访问控制

    • 场景说明:限制某些用户只能从指定 IP 段访问,无论该用户通过何种方式获得了权限。

    • 核心思路:创建一个 Deny Policy,拒绝非指定 IP 段的所有请求。由于 Deny 优先于

      Allow,即使用户通过 ACL 或其他角色获得了权限,从非指定 IP 访问时仍会被拒绝。

    • Policy内容如下:

       {
          "Version": "1",
          "Statement": [{
            "Effect": "Deny",
            "Action": "odps:*",
            "Resource": "acs:odps:*:projects/<project_name>/*",
            "Condition": {
              "NotIpAddress": {
                "acs:SourceIp": "10.32.180.0/23"
              }
            } 
          }]
        } 

Package授权案例

基于Package跨项目访问资源

  • 场景说明:

    业务分析人员需要查看生产表,但是不允许查看生产任务代码,需要将多个生产项目的部分表开放给业务分析人员。

  • 解决方案:

    需要查生产表但是又不能查看生产任务,那么需要单独创建一个分析项目。可以通过在多个生产项目创建Package把需要开放的表添加到Package中,在分析项目中安装Package并授权给分析人员,如此可以减少成员管理成本,无需在所有生产项目中添加分析人员,同时保证这些分析人员只能在分析项目中查看部分生产表。

    本文以在生产项目(Project_a)中创建Package(Package_test),然后将生产表(table_a)加入到Package,在分析项目(Project_analyze)中安装Package并授权给分析人员(A*****@aliyunid.com)查询为例,讲解Package授权操作步骤。

  • 操作步骤:

    1. 在生产项目中创建Package:

      USE Project_a;
      CREATE PACKAGE Package_test;
    2. 生产项目中向Package中添加需要分享的资源:

      ADD TABLE table_a TO PACKAGE Package_test;
    3. 生产项目许可分析项目空间使用Package 。

      ALLOW PROJECT Project_analyze TO INSTALL PACKAGE Package_test;
    4. 分析项目安装Package:

      USE Project_analyze;
      INSTALL PACKAGE Project_a.Package_test;
    5. Package授权给分析人员:

      GRANT read ON package Package_test TO USER ALIYUN$A*****@aliyunid.com;
    6. 分析人员查询表中数据:

      SELECT * FROM Project_a.table_a;

基于Package跨阿里云账号访问资源

  • 场景说明

    同一家企业,由于内部成本以及其他业务需要,不同部门各自使用阿里云账号开通使用MaxCompute,但是部门之间业务有数据交互需求,同时出于数据安全考虑期望达到权限最小化,即每个使用方的成员只能有权限读取提供方具体某些表的数据,因此需要实现不同阿里云账号之间的数据权限细粒度管理。

    说明
    • 不同阿里云账号间不能添加各自的RAM用户到其他阿里云账号下的MaxCompute项目空间中,即阿里云账号A不能把阿里云账号BRAM用户添加到A作为OwnerProject中。

    • 如果仅仅是Table、Resource、Function的读权限授予,可以考虑Package方式实现跨项目跨阿里云账号资源共享。

  • 解决方案

    假设有阿里云账号A的项目空间(Project_a)、阿里云账号B的项目空间(Project_b),Project_a中表t1t2需要给阿里云账号BRAM用户b_user1授读权限,Project_a中表t3BRAM用户b_user2授读权限。

    重要

    阿里云账号之间数据通过授权可以交互,但是若通过DataWorks使用MaxCompute,跨阿里云账号的DataWorks项目空间任务是不可互通的,即任务之间不可配置调度依赖。

  • 操作步骤

    1. 阿里云账号A进入Project_a,创建名称为a_to_b_pkgPackage,并把Project_a中的表t1t2t3都加入到a_to_b_pkg中。

      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;
    2. 允许阿里云账号BProject_b项目安装a_to_b_pkg

      ALLOW PROJECT Project_b TO INSTALL PACKAGE a_to_b_pkg;
    3. 阿里云账号B进入Project_b项目安装a_to_b_pkg

      INSTALL PACKAGE Project_a.a_to_b_pkg;
    4. Package中的表分别授权给阿里云账号BRAM用户。

      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");--将package里的t1表授权给b_user1
      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");--将package里的t2表授权给b_user1
      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");--将package里的t3表授权给b_user2

基于Package实现行级别权限控制

  • 场景说明:

    ProjectA中的table_order表是所有商家的订单交易信息表,该表需要开放给商家查看,但是每个商家只能查看对应自己店铺的订单交易信息。

  • 解决方案:

    table_order表中有商家id,可以根据商家id过滤,给各个商家只读自己的数据,因此需要行级别的权限控制。MaxCompute本身不支持行级别的权限控制,但是可以在table_order表下游单独给每个商家创建独立的视图(View),将View通过Package赋权给对应的商家,这种方式可以满足行级别权限控制。

  • 操作步骤:

    1. ProjectA中为各个商家创建对应视图:

      CREATE VIEW <viewname> as select * from table_order WHERE sellerid='xxxx';

      viewname为自定义设置的视图名称。

    2. ProjectA中创建Package,通过Package资源共享方式将View授权给商家:

      create package <packagename>;
      add table <viewname> to package <packagename>;
      allow project <Projectname_seller> to install package <packagename>;

      packagename为自定义设置的Package名称;Projectname_seller为商家的MaxCompute项目名称。

    3. 商家项目内安装Package并使用View。

      USE <Projectname_seller>;
      install package <ProjectA>.<packagename>;
      grant read on package <ProjectA>.<packagename> to user <username>;
      select * from <ProjectA>.<viewname>;

      username为商家项目中具体需要查询View的账号。