通过标签实现RAM用户鉴权

本文介绍如何基于标签控制RAM用户权限,实现不同的用户可以拥有不同云资源的访问和操作权限。

背景信息

标签可用于标识云资源,实现分类管理资源;访问控制RAM可基于权限策略,控制云资源的访问和操作权限。结合标签和RAM,将标签作为权限策略的匹配条件,可以实现云资源精细化权限管理。

基于标签控制RAM用户权限(即标签鉴权)的逻辑如下:

标签鉴权逻辑

说明

支持绑定标签的ECI资源包括ECI实例、镜像缓存和虚拟节点;仅支持在创建或者更新ECI资源时为其绑定标签。更多信息,请参见使用标签管理ECI实例

配置示例

示例场景说明

本文以下述场景作为示例,说明如何实现标签鉴权。

假设您需要控制某一RAM用户只能操作特定(假设绑定了env:test标签)的ECI资源,如下图:标签鉴权

具体需求包括:

  • 需求1:不允许创建不带标签的ECI资源,仅当创建时为ECI资源绑定env:test标签才可以创建成功。

  • 需求2:只允许操作自身创建(即绑定env:test标签)的ECI资源,不允许操作其他ECI资源。

  • 需求3:查询ECI资源时,只允许查看自身创建(即绑定env:test标签)的ECI资源。

步骤一:配置自定义权限策略并授权

  1. 使用阿里云账号登录RAM控制台

  2. 在左侧导航栏选择权限管理>权限策略

  3. 权限策略页面,单击创建权限策略

  4. 完成自定义策略配置。

    1. 单击导入策略页签。

    2. 在弹出的对话框的右侧筛选项中选择系统策略,然后搜索并选中AliyunECIFullAccess,单击导入

      AliyunECIFullAccess为系统默认的管理ECI资源的权限,包括操作ECI资源、查询相关资源(安全组、VPC等资源)、创建ECI服务关联角色等权限。

    3. 单击脚本编辑页签。

    4. 在编辑框中修改权限策略内容,然后单击继续编辑基本信息

      说明

      权限策略是一组访问权限的集合。结构包括版本号和授权语句列表,每条授权语句包括授权效果(Effect)、操作(Action)、资源(Resource)以及条件(Condition,可选项)。更多信息,请参见权限策略语法和结构权限策略基本元素

      在权限策略的Condition中,您可以增加需要匹配标签的条件来限制操作权限。支持的标签条件关键字如下:

      标签条件关键字

      说明

      acs:RequestTag

      限制在请求中必须传入特定的标签。

      如果API请求中没有标签参数,则不能使用acs:RequestTag,否则会导致鉴权失败。

      acs:ResourceTag

      限制指定的资源必须包含特定的标签。

      如果API请求中没有资源ID参数,则不能使用acs:ResourceTag,否则会导致鉴权失败。

      说明

      设计权限策略时,您可以根据各操作接口特性(API请求是否需要指定资源ID、是否支持传入标签),结合实际业务需求,来设置acs:RequestTagacs:ResourceTag。更多信息,请参见API接口鉴权说明

      根据示例场景中的需求,设计权限策略如下:

      需求

      权限策略

      不允许创建不带标签的ECI资源,仅当创建时为ECI资源绑定env:test标签才可以创建成功

      {
         "Effect": "Allow",
         "Action": "eci:Create*",
         "Resource": "*",
         "Condition": {
          "StringEquals": {
           "acs:RequestTag/env": "test"
          }
         }
        }

      只允许操作绑定了env:test标签的ECI资源,不允许操作其他资源

      {
         "Effect": "Allow",
         "Action": "eci:*",
         "Resource": "*",
         "Condition": {
          "StringEquals": {
           "acs:ResourceTag/env": "test"
          }
         }
        }

      查询ECI资源时,只允许查看绑定了env:test标签的ECI资源。

      {
         "Effect": "Allow",
         "Action": "eci:Describe*",
         "Resource": "*",
         "Condition": {
          "StringEquals": {
           "acs:RequestTag/env": "test"
          }
         }
        }

      结合AliyunECIFullAccess已有的权限策略,完整权限策略示例如下:

      {
       "Version": "1",
       "Statement": [{
         "Effect": "Allow",
         "Action": "eci:Create*",
         "Resource": "*",
         "Condition": {
          "StringEquals": {
           "acs:RequestTag/env": "test"
          }
         }
        },
        {
         "Effect": "Allow",
         "Action": "eci:*",
         "Resource": "*",
         "Condition": {
          "StringEquals": {
           "acs:ResourceTag/env": "test"
          }
         }
        },
        {
         "Effect": "Allow",
         "Action": "eci:Describe*",
         "Resource": "*",
         "Condition": {
          "StringEquals": {
           "acs:RequestTag/env": "test"
          }
         }
        },
        {
         "Action": [
          "ecs:DescribeSecurityGroups"
         ],
         "Resource": "*",
         "Effect": "Allow"
        },
        {
         "Action": [
          "vpc:DescribeVSwitches",
          "vpc:DescribeVpcs",
          "vpc:DescribeEipAddresses"
         ],
         "Resource": "*",
         "Effect": "Allow"
        },
        {
         "Action": "ram:CreateServiceLinkedRole",
         "Resource": "*",
         "Effect": "Allow",
         "Condition": {
          "StringEquals": {
           "ram:ServiceName": [
            "eci.aliyuncs.com",
            "vnode.eci.aliyuncs.com"
           ]
          }
         }
        }
       ]
      }
      说明

      如果您通过OpenAPI操作ECI资源,则使用AliyunECIFullAccess的权限即可;如果您通过ECI控制台操作ECI资源,则除了AliyunECIFullAccess的权限外,还需添加额外权限。更多信息,请参见为RAM用户授权

    5. 输入权限策略名称,单击确定

  5. 将自定义权限策略授予RAM用户。

    1. 在左侧导航栏选择身份管理>用户

    2. 创建RAM用户。

      请根据自身管理需求创建相应的RAM用户。具体操作,请参见创建RAM用户。如果已有RAM用户,可跳过该步骤。

    3. 为RAM用户授权。

      为RAM用户授予新创建的自定义权限策略,具体操作,请参见为RAM用户授权

步骤二:验证权限策略是否生效

  1. 使用RAM用户登录OpenAPI平台

  2. 测试权限策略是否生效。

    以ECI实例为例进行测试:

    • 创建ECI实例

      • 设置了env:test标签,则可以创建。

      • 没有设置标签或者设置了其他标签,则无法创建,提示没有权限。

    • 删除ECI实例

      • 删除的实例绑定了env:test标签,则可以删除。

      • 删除的实例没有绑定env:test标签,则无法删除,提示没有权限。

    • 查询ECI实例

      • 指定实例(该实例绑定了env:test标签)但没有设置标签,则查询出指定实例的信息。

      • 指定实例(该实例没有绑定env:test标签),则查询结果为空。

      • 没有指定实例,仅设置env:test标签,则查询出带有env:test标签的所有实例信息。

      • 没有指定实例也没有设置标签,则查询结果为空。

API接口鉴权说明

为某一RAM用户授予含有标签鉴权的权限策略后,该RAM用户调用各API接口时的鉴权情况如下表所示:

接口

鉴权说明

CreateContainerGroup、CreateImageCache等创建接口

该类接口无需指定资源ID,则匹配acs:RequestTag

  • 没有传入标签,或者传入的标签不包含授权标签,则鉴权不通过。

  • 传入完全匹配的标签,或者传入的标签包含了授权标签,则鉴权通过。

DescribeContainerGroups、DescribeImageCaches等查询接口

该类接口按需指定资源ID或传入标签,则匹配acs:ResourceTagacs:RequestTag

  • 传入资源ID和标签,如果指定资源绑定的标签能够匹配acs:ResourceTag,或者传入的标签能够匹配acs:RequestTag,则鉴权通过,反之则鉴权不通过。

  • 传入资源ID,没有传入标签,如果指定资源绑定的标签能够匹配acs:ResourceTag,则鉴权通过,反之则鉴权不通过。

  • 没有传入资源ID,传入标签,如果传入的标签能够匹配acs:RequestTag,则鉴权通过,反之则鉴权不通过。

  • 没有传入资源ID,也没有传入标签,则鉴权不通过。

说明

查询接口在鉴权不通过时,返回结果为空,并不会报错。

UpdateContainerGroup、UpdateImageCache等更新接口

该类接口必须指定资源ID,则匹配acs:ResourceTag

  • 不传入标签,如果指定资源绑定的标签能够匹配,则鉴权通过,反之则鉴权不通过。

  • 传入标签(即更新标签),如果指定资源绑定的标签能够匹配,且同时具备所传入标签的权限,则鉴权通过,反之则鉴权不通过。

说明

更新标签时,RAM用户需要分别具有更新前后的标签权限。即授权时,需要授予用户两个自定义权限策略,分别包含更新前后的标签条件限制。

RestartContainerGroup、ExecContainerCommand等其他操作接口

该类接口必须指定资源ID,则匹配acs:ResourceTag

  • 如果指定资源绑定的标签不能匹配,则鉴权不通过。

  • 如果指定资源绑定的标签能够匹配,则鉴权通过。