通过标签实现精细化权限管理

标签可用于标识云资源,实现资源的分类管理;访问控制RAM可基于权限策略,管理用户身份,控制云资源的访问和操作权限。标签和RAM结合,将标签作为权限策略的匹配条件,可以实现云资源的精细化权限管理。您可以使用标签对集群资源做分类,并匹配对应的权限策略,实现集群资源的精细化权限管理,使不同的用户可以拥有不同的ACK集群的访问权限。

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

image

前提条件

已创建RAM用户,具体操作,请参见创建RAM用户

应用场景示例

本文操作步骤以下面场景为示例,说明如何使用标签鉴权。

操作步骤

本步骤将使用阿里云账号(主账号)新建一个自定义权限策略UseTagAccessRes(规定了RAM用户需要指定标签test:foo后方可访问和操作ACK集群),并将自定义权限策略UseTagAccessRes授权给RAM用户userTest。

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

    说明

    阿里云账号(主账号)对账号中的资源具有完全管理权限,您也可以在RAM中创建一个RAM用户,授予AdministratorAccess权限,充当账号管理员,该管理员可以对账号下所有云资源进行管控操作。更多信息,请参见创建账号管理员

  2. 创建自定义权限策略UseTagAccessRes。

    具体操作,请参见创建自定义权限策略。如下示例中,您可以在策略(Condition)中为云资源设置多个标签条件来限制操作权限。支持的标签鉴权条件如下:

    标签鉴权条件

    说明

    acs:RequestTag

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

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

    acs:ResourceTag

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

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

    以下为不同应用场景下对应的自定义权限策略内容。

    重要

    以下列举的自定义权限策略内容仅作为示例策略模板提供,请您根据实际需求遵循权限最小化原则配置权限策略。

    • 不允许创建未绑定标签test:foo的集群,仅允许在创建集群操作时,带上请求标签test:foo

      {
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "cs:CreateCluster",
                  "Resource": "*",
                  "Condition": {
                      "StringEquals": {
                          "acs:RequestTag/test": "foo"
                      }
                  }
              },
              {
                  "Action": [
                      "cs:DescribeAddons",
                      "cs:DescribeKubernetesVersionMetadata"
                  ],
                  "Effect": "Allow",
                  "Resource": "*"
              },
              {
                  "Action": [
                      "vpc:Describe*",
                      "vpc:List*",
                      "log:List*",
                      "log:Describe*",
                      "cs:Get*",
                      "cs:Describe*"
                  ],
                  "Effect": "Allow",
                  "Resource": "*"
              }
          ],
          "Version": "1"
      }
    • 不允许操作其他用户创建的集群(未绑定标签test:foo的资源)。

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
              "StringEquals": {
                "acs:ResourceTag/test": "foo"
              }
            }
          }
        ]
      }
    • 支持某些查询接口,同时可以查看您已绑定标签test:foo的集群。

      {
      	"Version": "1",
      	"Statement": [{
      			"Effect": "Allow",
      			"Action": [
      				"cs:DescribeClustersV1",
      				"cs:GetClusters"
      			],
      			"Resource": "*",
      			"Condition": {
      				"StringEquals": {
      					"acs:ResourceTag/test": "foo"
      				}
      			}
      		},
      		{
      			"Action": [
      				"cs:DescribeClusterAddonsVersion",
                      "cs:DescribeClusterUserKubeconfig",
                      "cs:DescribeClusterNodePools",
      				"cs:DescribeClusterNodes",
                      "cs:DescribeClusterLogs",
                      "cs:DescribeClusterNodePoolDetail",
      				"cs:DescribeEvents",
                      "cs:DescribeClusterDetail",
                      "cs:DescribeClusterAddonsUpgradeStatus",
                      "cs:DescribeClusterNamespaces",
                      "cs:DescribeAddons",
      				"log:List*",
      				"log:Describe*"
      			],
      			"Effect": "Allow",
      			"Resource": "*"
      		}
      	]
      }
    • 不允许修改标签,防止标签被修改。

      {
      	"Version": "1",
      	"Statement": [{
      		"Effect": "Deny",
      		"Action": [
      			"cs:UntagResources",
      			"cs:ListTagResources",
      			"cs:TagResources",
      			"cs:ModifyClusterTags"
      		],
      		"Resource": "*"
      	}]
      }
    • 不允许对未绑定标签test:foo的集群进行RBAC授权。

      {
      	"Statement": [{
      			"Effect": "Allow",
      			"Action": "cs:Get*",
      			"Resource": "*",
      			"Condition": {
      				"StringEquals": {
      					"acs:ResourceTag/test": "foo"
      				}
      			}
      		},
      		{
      			"Action": [
      				"ram:Get*",
      				"ram:List*",
      				"cs:DescribeAddons",
      				"cs:DescribeKubernetesVersionMetadata",
      				"cs:DescribeUserPermission",
      				"cs:GrantPermission"
      			],
      			"Effect": "Allow",
      			"Resource": "*"
      		},
      		{
      			"Action": [
      				"ram:AttachPolicyToUser",
      				"ram:AttachPolicyToRole"
      			],
      			"Effect": "Allow",
      			"Resource": [
      				"acs:ram:*:*:policy/xxxxxx",
      				"acs:*:*:*:user/*"
      			]
      		}
      	],
      	"Version": "1"
      }
  3. 将自定义权限策略授权给目标RAM用户或组。

    具体操作,请参见为RAM用户授权。本步骤将自定义权限策略UseTagAccessRes授权给RAM用户userTest。

    说明

    如果您将自定义权限策略UseTagAccessRes授权已存在的RAM用户,请注意RAM用户多个权限策略产生的权限问题。

执行结果

授权RAM用户只能访问和操作已绑定标签test:foo的资源后,该RAM用户访问及操作各资源的结果如下:

创建ACK集群

  • 创建ACK集群时,在创建流程中集群配置页签的高级选项配置标签test:foo,会创建成功。

  • 创建ACK集群时,不指定标签test:foo,会有以下错误提示。ack

查看ACK集群

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 查看集群列表中的集群。

    • 如果集群中都没有test:foo标签,则集群列表为空,无法查看任何集群。

    • 若对指定集群添加test:foo标签后,则在集群列表中可以看到该集群。

修改标签

不允许修改标签,若强制修改标签时会有以下错误提示。

tag

授权管理

  1. 登录容器服务管理控制台,在左侧导航栏选择授权管理

  2. 授权管理页面,单击RAM用户页签,在需要授权的RAM用户右侧单击管理权限,进入权限管理页面。

  3. 权限管理页面选择集群时,在下拉列表中仅显示具有test:foo标签的集群。