标记资源的示例 SCP - AWS Organizations

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

标记资源的示例 SCP

需要在指定的已创建资源上使用标签

如果请求不包含指定的标签,以下 SCP 将阻止受影响账户中的 IAM 用户和角色创建特定资源类型。

重要

请务必使用您在环境中使用的服务测试基于拒绝的策略。以下示例是创建未标记的密钥或运行未标记的 Amazon EC2 实例的简单块,不包括任何例外。

以下示例策略与 AWS CloudFormation 不兼容,因为该服务会创建一密钥,然后将其标记为两个单独的步骤。此示例策略有效地阻止 AWS CloudFormation 将密钥作为堆栈的一部分创建,因为这样的操作会导致出现没有按要求被标记的密钥。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCreateSecretWithNoProjectTag", "Effect": "Deny", "Action": "secretsmanager:CreateSecret", "Resource": "*", "Condition": { "Null": { "aws:RequestTag/Project": "true" } } }, { "Sid": "DenyRunInstanceWithNoProjectTag", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:volume/*" ], "Condition": { "Null": { "aws:RequestTag/Project": "true" } } }, { "Sid": "DenyCreateSecretWithNoCostCenterTag", "Effect": "Deny", "Action": "secretsmanager:CreateSecret", "Resource": "*", "Condition": { "Null": { "aws:RequestTag/CostCenter": "true" } } }, { "Sid": "DenyRunInstanceWithNoCostCenterTag", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:volume/*" ], "Condition": { "Null": { "aws:RequestTag/CostCenter": "true" } } } ] }

有关 AWS Organizations SCP 和 IAM 权限策略中均支持的所有服务和操作的列表,请参阅《IAM 用户指南》中的AWS服务的操作、资源和条件键

阻止标记被修改,除非由授权委托人修改

以下 SCP 显示策略如何仅允许授权委托人修改附加到资源的标签。这是将基于属性的访问控制(ABAC)作为AWS云安全策略的一个重要部分。该策略允许调用者仅修改授权标签(在此示例中为 access-project)与附加到发出请求的用户或角色的相同授权标签完全匹配的资源上的标签。该策略还可以阻止授权用户更改用于授权的标签的。调用委托人必须具有授权标签才能进行任何更改。

此策略仅阻止未经授权的用户更改标签。未被此策略阻止的授权用户必须仍具有单独的 IAM 策略,该策略明确授予相关标记 API 的 Allow 权限。例如,如果您的用户具有使用 Allow */* 的管理员策略(允许所有服务和所有操作),则组合将导致允许管理员用户能更改那些授权标签值与附加到用户委托人的授权标签值匹配的标签。这是因为该策略中的显式 Deny 将覆盖管理员策略中的显式 Allow

重要

这不是一个完整的策略解决方案,不应按如下所示使用。此示例仅用于演示 ABAC 策略的一部分,需要针对生产环境进行定制和测试。

有关完整策略及其工作原理的详细分析,请参阅使用 AWS Organizations 中的服务控制策略保护用于授权的资源标签

请务必使用您在环境中使用的服务测试基于拒绝的策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyModifyTagsIfResAuthzTagAndPrinTagDontMatch", "Effect": "Deny", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "ec2:ResourceTag/access-project": "${aws:PrincipalTag/access-project}", "aws:PrincipalArn": "arn:aws:iam::123456789012:role/org-admins/iam-admin" }, "Null": { "ec2:ResourceTag/access-project": false } } }, { "Sid": "DenyModifyResAuthzTagIfPrinTagDontMatch", "Effect": "Deny", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestTag/access-project": "${aws:PrincipalTag/access-project}", "aws:PrincipalArn": "arn:aws:iam::123456789012:role/org-admins/iam-admin" }, "ForAnyValue:StringEquals": { "aws:TagKeys": [ "access-project" ] } } }, { "Sid": "DenyModifyTagsIfPrinTagNotExists", "Effect": "Deny", "Action": [ "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:PrincipalArn": "arn:aws:iam::123456789012:role/org-admins/iam-admin" }, "Null": { "aws:PrincipalTag/access-project": true } } } ] }