Policy权限控制

MaxCompute的Policy权限控制方案提供了更加复杂和灵活的权限设置,适合需要细粒度控制的大型企业和复杂场景。相比ACL权限控制增加黑名单方式,即可以实现允许或禁止角色对指定对象执行指定操作,将角色绑定至用户后,用户权限即可生效。本文介绍MaxCompute支持的Policy授权命令,并提供授权示例供参考。

背景信息

Policy权限控制支持白名单和黑名单授权机制,即允许(白名单)或禁止(黑名单)角色对指定对象执行指定操作。

该授权方式可以弥补ACL授权机制无法解决的授权问题。例如用户已经被赋予了开发角色,默认具备删除表的权限,但如果需要禁止用户执行删除表操作,可以通过Policy方式进行授权。

创建MaxCompute项目后,Policy权限控制功能开关默认为打开状态。项目所有者(Project Owner)可以在MaxCompute项目中执行set CheckPermissionUsingPolicy=true|false;命令,开启或关闭Policy权限控制功能。

Policy权限控制适用于如下场景。

场景

说明

授权人

授权操作入口

基于角色为用户授权

直接为单个角色,授予允许或禁止角色对指定对象执行单个或多个操作的权限,然后再将角色绑定至多个用户,用户即可具备角色的权限。

请参见权限一览表的支持的授权人列。

为被赋予内置角色的用户通过自定义角色进行精细化授权

当用户已经被赋予内置角色时,如果需要对用户的操作权限进行更精细化的管理,无法通过ACL权限控制方案解决此类授权问题。此时,您可以通过Policy权限控制方案,新增角色,允许或禁止角色操作项目中的对象,并将角色绑定至用户后,即可实现精细化管控用户权限。

前提条件

使用Policy权限控制方案前,请您确认已记录好如下信息:

  • 被授权角色的名称,且角色已添加至MaxCompute项目。

    您可以通过MaxCompute客户端执行list roles;命令获取角色信息。

    如果需要新增角色,请参见角色规划

  • 授权对象类型、对象名称及操作。

    更多对象类型及操作信息,请参见MaxCompute权限

使用限制

Policy权限控制只支持对已存在的角色进行授权。

注意事项

使用Policy权限控制功能的注意事项如下:

  • 当白名单和黑名单授权信息同时存在时,遵循黑名单优先原则。

  • Policy权限控制允许对不存在的对象授权,当删除对象时,与该对象关联的Policy授权信息不会被删除,授权人需要注意删除并重建同名对象所带来的安全风险。

  • 当一个用户被移除后,与该用户有关的授权仍然会被保留。一旦该用户以后被再次添加到该项目时,该用户的历史授权访问权限将被重新激活。如果需要彻底清除用户的权限信息,请参见彻底清除被删除用户遗留的权限信息

命令格式

Policy权限控制命令格式如下:

  • Policy授权

    grant <actions> on <object_type> <object_name> 
    to ROLE <role_name> 
    privilegeproperties("policy" = "true", "allow"="{true|false}"[, "conditions"= "<conditions>" ]);
  • 撤销Policy授权

    revoke <actions> on <object_type> <object_name> 
    from ROLE <role_name> 
    privilegeproperties ("policy" = "true", "allow"="{true|false}");

参数说明如下。

参数名称

是否必填

说明

actions

指定被授予的操作权限名称。单次授权可以指定多个操作。

当有多个操作时,多个操作名称之间使用英文逗号(,)分隔。操作取值请参见MaxCompute权限

object_type

指定被授予的对象类型,即客体。单次授权只能指定一个客体。

客体取值请参见MaxCompute权限

object_name

指定被授予的对象的名称。获取方式如下:

  • 项目名称:您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

  • 表名称:您可以通过MaxCompute客户端执行show tables;命令获取表或视图名称。

  • 资源名称:您可以通过MaxCompute客户端执行list resources;命令获取资源名称。

  • 函数名称:您可以通过MaxCompute客户端执行list functions;命令获取函数名称。

  • 实例名称:您可以通过MaxCompute客户端执行show instances;命令获取实例ID。

授权对象支持以通配符星号(*)来表达。例如,table taobao*表示所有以taobao开头的表。

说明

授权给ROLE支持使用通配符星号(*);授权给USER不支持使用通配符。

role_name

指定被授权的角色名称。单次授权只能指定一个角色。

您可以通过MaxCompute客户端执行list roles;命令获取角色名称。

privilegeproperties

policy

固定取值为true。表示使用Policy权限控制方案。

allow

白名单授权必填

指定白名单授权机制。取值范围如下:

  • true:表示允许对指定对象执行指定操作。

  • false:表示不允许对指定对象执行指定操作,即黑名单。

conditions

从请求消息来源及访问方式等维度进行权限控制。详细参数取值请参见Conditions

Policy权限控制示例

假设Bob@aliyun.com是test_project_a的项目所有者,Allen、Tom是隶属于bob@aliyun.com的RAM用户。Allen已被赋予test_project_a项目的Admin角色。以MaxCompute客户端操作为例,授权示例如下:

  • 示例一:基于角色为用户授权(黑名单)

    禁止Tom删除以tb_开头的表。

    • 通过ACL命令实现Policy授权示例如下:

      --Bob进入项目test_project_a。
      use test_project_a; 
      --创建角色Worker。
      create role Worker; 
      --将用户Tom添加为项目成员。
      add user RAM$Bob@aliyun.com:Tom;
      --将角色Worker绑定至用户Tom。
      grant Worker TO RAM$Bob@aliyun.com:Tom; 
      --禁止角色Worker删除项目test_project_a中以tb_开头的表。
      grant Drop on table tb_* to ROLE Worker privilegeproperties("policy" = "true", "allow"="false");
      --查看用户Tom的授权结果。
      show grants for RAM$Bob@aliyun.com:Tom; 
      --授权结果如下。D表示禁止,禁止删除以tb_开头的表。
      Authorization Type: Policy
      [role/worker]
      D      projects/test_project_a/tables/tb_*: Drop
    • 通过控制台实现Policy授权示例如下:

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

      2. 在左侧导航栏单击项目管理

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

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

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

        Policy内容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Drop"
                    ],
                    "Effect":"Deny",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/tb_*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色权限页签,单击新建角色操作列的成员管理,将RAM$Bob@aliyun.com:Tom添加至新建角色。

  • 示例二:撤销Policy授权(黑名单)

    基于示例一,撤销对用户Tom的授权。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --收回用户Tom绑定的角色Worker。
    revoke Worker from RAM$Bob@aliyun.com:Tom;
    --查看用户Tom的授权结果。权限列表无Drop权限信息。
    show grants for RAM$Bob@aliyun.com:Tom; 
  • 示例三:基于角色为用户授权(白名单)

    允许Tom修改以tb_开头的表的数据。

    • 通过ACL命令实现Policy授权示例如下:

      --Bob进入项目test_project_a。
      use test_project_a; 
      --创建角色Worker。
      create role Worker; 
      --将用户Tom添加为项目成员。
      add user RAM$Bob@aliyun.com:Tom;
      --将角色Worker绑定至用户Tom。
      grant Worker TO RAM$Bob@aliyun.com:Tom; 
      --允许角色Worker修改项目test_project_a中以tb_开头的表的数据。
      grant Update on table tb_* to ROLE Worker privilegeproperties("policy" = "true", "allow"="true");
      --查看用户Tom的授权结果。
      show grants for RAM$Bob@aliyun.com:Tom; 
      --授权结果如下。A表示允许,可以更新以tb_开头的表的数据。
      Authorization Type: Policy
      [role/worker]
      A       projects/test_project_a/tables/tb_*: Update
    • 通过控制台实现Policy授权示例如下:

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

      2. 在左侧导航栏单击项目管理

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

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

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

        Policy内容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Update"
                    ],
                    "Effect":"Allow",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/tb_*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色权限页签,单击新建角色操作列的成员管理,将RAM$Bob@aliyun.com:Tom添加至新建角色。

  • 示例四:撤销Policy授权(白名单)

    基于示例三,撤销对用户Tom的授权。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --收回用户Tom绑定的角色Worker。
    revoke Worker from RAM$Bob@aliyun.com:Tom;
    --查看用户Tom的授权结果。权限列表无Update权限信息。
    show grants for RAM$Bob@aliyun.com:Tom; 
  • 示例五:为具备内置角色的用户进行精细化授权

    禁止Allen删除项目test_project_a中的所有表。

    • 通过ACL命令实现Policy授权示例如下:

      --Bob进入项目test_project_a。
      use test_project_a; 
      --创建角色Worker。
      create role Worker; 
      --将角色Worker绑定至用户Allen。
      grant Worker TO RAM$Bob@aliyun.com:Allen; 
      --禁止角色Worker删除项目test_project_a中的所有表。
      grant Drop on table * to ROLE Worker privilegeproperties("policy" = "true", "allow"="false");
      --查看用户Allen的授权结果。
      show grants for RAM$Bob@aliyun.com:Allen; 
      --授权结果如下。禁止删除所有表。
      [roles]
      role_project_admin, worker
      
      Authorization Type: Policy
      [role/role_project_admin]
      A       projects/test_project_a: *
      A       projects/test_project_a/instances/*: *
      A       projects/test_project_a/jobs/*: *
      A       projects/test_project_a/offlinemodels/*: *
      A       projects/test_project_a/packages/*: *
      A       projects/test_project_a/registration/functions/*: *
      A       projects/test_project_a/resources/*: *
      A       projects/test_project_a/tables/*: *
      A       projects/test_project_a/volumes/*: *
      
      [role/worker]
      A       projects/test_project_a/tables/tb_*: Update
      D       projects/test_project_a/tables/*: Drop
      --AG中的A表示Allow,G表示With Grant Option,即允许对客体(Object)进行授权
      Authorization Type: ObjectCreator
      AG      projects/test_project_a/tables/local_test: All
      AG      projects/test_project_a/tables/mr_multiinout_out1: All
      AG      projects/test_project_a/tables/mr_multiinout_out2: All
      AG      projects/test_project_a/tables/ramtest: All
      AG      projects/test_project_a/tables/wc_in: All
      AG      projects/test_project_a/tables/wc_in1: All
      AG      projects/test_project_a/tables/wc_in2: All
      AG      projects/test_project_a/tables/wc_out: All
    • 通过控制台实现Policy授权示例如下:

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

      2. 在左侧导航栏单击项目管理

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

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

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

        Policy内容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Drop"
                    ],
                    "Effect":"Deny",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色权限页签,单击新建角色操作列的成员管理,将RAM$Bob@aliyun.com:Allen添加至新建角色。

  • 示例六:为具备内置角色的用户撤销授权

    基于示例五,撤销对用户Allen的授权。命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --收回用户Allen绑定的角色Worker。
    revoke Worker from RAM$Bob@aliyun.com:Allen;
    --查看用户Allen的授权结果。权限列表无Drop权限信息。
    show grants for RAM$Bob@aliyun.com:Allen; 
  • 示例七:基于角色为用户(Tom)授予查询所有表的权限(白名单)

    • 通过ACL命令实现Policy授权示例如下:

      --Bob进入项目test_project_a。
      use test_project_a;
      --创建角色Worker。
      create role Worker;
      --将用户Tom添加为项目成员。
      add user RAM$Bob@aliyun.com:Tom;
      --将角色Worker绑定至用户Tom。
      grant Worker TO RAM$Bob@aliyun.com:Tom;
      --允许角色Worker查询项目test_project_a中的所有表。
      grant Describe,select on table * to ROLE Worker privilegeproperties("policy" = "true", "allow"="true");
      --查看用户Tom的授权结果。
      show grants for RAM$Bob@aliyun.com:Tom;
      --授权结果如下。A表示允许,允许查询项目test_project_a中的所有表。
      Authorization Type: Policy
      [role/worker]
      A      projects/test_project_a/tables/*: Describe | Select
    • 通过控制台实现Policy授权示例如下:

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

      2. 在左侧导航栏单击项目管理

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

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

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

        Policy内容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Describe",
                        "odps:Select"
                    ],
                    "Effect":"Allow",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色权限页签,单击新建角色操作列的成员管理,将RAM$Bob@aliyun.com:Tom添加至新建角色。

后续指引

了解Policy授权机制后,您可以根据实际业务需要执行授权相关操作:

相关文档