问题
基于访问控制 (RAM) 策略来授予子账号(RAM User)在指定的标签(TAG)下 管理 ECS 中 资源(支持标签的资源)的权限, 该策略必须限制在标签(TAG)级别权限,以便 RAM 子账号可以管理包含特定标签的 ECS 资源。
场景描述
使用指定标签(TAG)为子账号(RAM User)限定访问ECS资源的边界,这里指支持标签的ECS资源:实例/磁盘/网卡/安全组/快照/镜像/密钥对。
简述
如果保障ECS资源(支持标签的资源)可以强制有标签。高阶实践:强制TAG——必须带标签创建ECS 资源在前面的文章说明了,本文就如何事后自动化运维机制来保障强制TAG。
- 创建RAM策略:创建一个 RAM 策略,以授予对任何带该特定标签(TAG)的访问权限(主要针对ECS)。
- 授权用户:将该 RAM 策略附加到您希望访问具备该标签(TAG)的用户或组。
- 自动打标:为存量资源自动化打特定的标签。
解决方法
本文已ECS实例为例说明如何为存量未打标签资源自动打标签。如果磁盘/网卡/安全组/快照/镜像/密钥对等其他资源更换资源列表查询接口为对应资源的查询接口,比如磁盘为DescribeDisks。
注:ECS查询资源列表接口有1000的限制,如果标签下资源超过1000,则推荐修改为ListTagResources来过滤资源。
创建RAM策略
在 访问控制台 或者 或者使用 RAM API CreatePolicy 创建策略
策略如下:
- 授权 AliyunOOSFullAccess 权限
{
"Version": "1",
"Statement": [
{
"Action": "oos:*",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "ram:PassRole",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:Service": "oos.aliyuncs.com"
}
}
}
]
}
- 为OOS服务创建服务OOSServiceRole角色参考文档 。
注:文本的策略没有为配置角色的权限,需要的话自行配置。 - 在RAM访问控制-权限管理-权限策略管理-新建策略
{
"Version": "1",
"Statement": [
{
"Action": [
"ecs:DescribeInstances",
"ecs:TagResources"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
- 为OOSServiceRole授权该策略
- 如果您使用的是子账号或者sts角色,也需要为您使用的账号或者角色授权该策略以及操作OOS权限AliyunOOSFullAccess。
授权方式
将RAM 策略附加到您希望控制访问的用户或组。您可以使用 RAM 管理控制台、阿里云 CLI、阿里云 API AttachPolicyToUser AttachPolicyToGroup来添加 RAM 策略。
自动打标
创建模版
OOS运维编排控制台,点击我的模版-点击创建模版-选择空白模板-选择YAML
FormatVersion: OOS-2019-06-01
Description: Tag Resources Without The Specified Tags
Parameters:
tags:
Type: Json
Description:
en: The tags to select ECS instances.
zh-cn: 实例的标签。
AssociationProperty: Tags
regionId:
Type: String
Description:
en: The region to select ECS instances.
zh-cn: 实例的地域。
OOSAssumeRole:
Description:
en: The RAM role to be assumed by OOS.
zh-cn: OOS扮演的RAM角色。
Type: String
Default: OOSServiceRole
RamRole: OOSServiceRole
Tasks:
- Name: getInstancesByTags
Action: 'ACS::ExecuteAPI'
Description: ''
Properties:
Service: ECS
API: DescribeInstances
Parameters:
Tags: '{{ tags }}'
RegionId: '{{ regionId }}'
Outputs:
InstanceIds:
Type: List
ValueSelector: 'Instances.Instance[].InstanceId'
- Name: getAllInstances
Action: 'ACS::ExecuteAPI'
Description: ''
Properties:
Service: ECS
API: DescribeInstances
Parameters:
RegionId: '{{regionId}}'
Outputs:
InstanceIds:
Type: List
ValueSelector: 'Instances.Instance[].InstanceId'
- Name: TagResources_ECS_Instances
Action: 'ACS::ExecuteAPI'
Description:
zh-cn: 对没有改标签ECS实例进行打签
en: 'tag ecs instances, which are without the specified tags.'
Properties:
Service: ECS
API: TagResources
Parameters:
Tags: '{{ tags }}'
RegionId: '{{regionId}}'
ResourceType: Instance
ResourceIds:
- '{{ACS::TaskLoopItem}}'
Loop:
MaxErrors: 100%
Concurrency: 20
Items:
'Fn::Difference':
- '{{ getAllInstances.InstanceIds }}'
- '{{ getInstancesByTags.InstanceIds }}'
Outputs:
InstanceIds:
Type: List
Value:
'Fn::Difference':
- '{{ getAllInstances.InstanceIds }}'
- '{{ getInstancesByTags.InstanceIds }}'
创建执行
点击创建执行
点击下一步:设置参数。填写入参,指定特定标签(TAG)
点击下一步:确定,确认参数没有问题
开始执行,并输出需要新增或者修改实例列表。
其他资源说明
- 如果您需要关注的是磁盘这里DescribeInstances换成DescribeDisks,相关的权限策略也是修改为DescribeDisks
- 如果您需要关注的是安全组这里DescribeInstances换成DescribeSecurityGroups,相关的权限策略也是修改为DescribeSecurityGroups
- 如果您需要关注的是自定义镜像这里DescribeInstances换成DescribeImages,相关的权限策略也是修改为DescribeImages
- 如果您需要关注的是快照这里DescribeInstances换成DescribeSnapshots,相关的权限策略也是修改为DescribeSnapshots
- 如果您需要关注的是网卡这里DescribeInstances换成DescribeNetworkInterfaces,相关的权限策略也是修改为DescribeNetworkInterfaces
- 如果您需要关注的是密钥对这里DescribeInstances换成DescribeKeyPairs,相关的权限策略也是修改为DescribeKeyPairs
- 如果您需要关注的是启动模版这里DescribeInstances换成DescribeLaunchTemplates,相关的权限策略也是修改为DescribeLaunchTemplates
- 如果您需要关注的是专有宿主机这里DescribeInstances换成DescribeDedicatedHosts,相关的权限策略也是修改为DescribeDedicatedHosts
其他产品保障标签能力
目前OOS支持的云产品列表参考文档
以及云产品支持TAG列表
相关文档
基于OOS批量修改资源标签(TAG)值(Value)
强制TAG——必须带标签创建ECS 资源
ECS支持跨地域跨资源类型的标签(TAG)操作
如何检查您的资源是否具有您指定的标签?
基于标签批量管理资源
支持标签产品及其文档
标签的最佳实践
通过OOS基于标签批量启动ECS实例实践
如何使用标签控制对ECS 资源的访问?
使用标签检索资源
创建资源标签分组设置
ECS全局标签实践
ECS控制台云资源分组管理---全局标签
标记您的MongoDB数据库实例
标记您的 CDN 资源——域名(domain)
标记您的 OSS 资源
标记您的 RDS 资源
标记您的 SLB 资源
标记您的 ECS 资源
标记您的redis数据库实例
标记您的弹性容器实例(ECI)资源
标记(TAG)您的漏洞扫描(CSS)资源