授权实践

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

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_name为您的MaxCompute项目名称

    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. 新建角色对话框,创建资源操作类(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"}
    6. 角色权限页签,单击新建角色操作列的成员管理,将目标阿里云账号或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_name为您的MaxCompute项目名称

    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. 新建角色对话框,创建资源操作类(Resource)角色,填写角色名称和Policy授权策略。

      Policy内容如下:

      { 
        "Version": "1", 
        "Statement": [{ 
          "Effect": "Deny", 
          "Action": "odps:Drop", 
          "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }]
      }
    6. 角色权限页签,单击新建角色操作列的成员管理,将目标阿里云账号或RAM用户添加至新建角色。

通过Policy以角色方式授权

  • 场景说明:

    授权用户a****@aliyunid.com只能在2018-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":"2018-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_name为您的MaxCompute项目名称

    3. 授权。

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

    通过控制台实现

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

    2. 在左侧导航栏单击工作区 > 项目管理

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

    4. 角色权限页签,单击新增项目级别角色

    5. 新建角色对话框,创建资源操作类(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":"2018-11-11T23:59:59Z"
              },
              "IpAddress": {
                  "acs:SourceIp":"10.32.180.0/23"
              }
          }
      },
      {
          "Effect":"Deny",
          "Action":"odps:Drop",
          "Resource":"acs:odps:*:projects/<project_name>/tables/*"
      }]
      }
    6. 角色权限页签,单击新建角色操作列的成员管理,将目标阿里云账号或RAM用户添加至新建角色。

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;
    1. 生产项目中向Package中添加需要分享的资源:

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

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

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

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

      select * from Project_a.table_a;

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

  • 场景说明:

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

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

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

  • 解决方案:

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

    重要

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

  • 操作步骤:

    1. 阿里云账号A进入Project_a,创建名称为a_to_b_pkg的Package,并把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;
    1. 允许阿里云账号B的Project_b项目安装a_to_b_pkg

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

    INSTALL PACKAGE Project_a.a_to_b_pkg;
    1. 将Package中的表分别授权给阿里云账号B的RAM用户。

    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为自定义设置的视图名称。

    1. 在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项目名称。

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

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

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