

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

# 限制和要求堆栈策略
<a name="limiting-and-requiring-stack-policies"></a>

作为最低权限许可的最佳实践，请考虑要求 IAM 主体分配堆栈策略并限制 IAM 主体可以分配的堆栈策略。许多 IAM 主体不应有权为自己的堆栈创建和分配自定义堆栈策略。

创建堆栈策略后，我们建议您将这些策略上传到 S3 存储桶。然后，您可以使用 `cloudformation:StackPolicyUrl` 条件键并在 S3 存储桶中提供堆栈策略的 URL，来引用这些堆栈策略。

## 授予附加堆栈策略的权限
<a name="granting-permissions-to-attach-stack-policies"></a>

作为最低权限权限的最佳实践，可以考虑限制 IAM 委托人可以附加到堆栈的堆栈策略。 CloudFormation 在 IAM 主体的基于身份的策略中，您可以指定 IAM 主体有权分配哪些堆栈策略。这可防止 IAM 主体附加任何堆栈策略，从而降低配置错误的风险。

例如，一个组织可能拥有不同的团队，每个团队都有不同的要求。因此，每个团队都会为其团队特定的 CloudFormation 堆栈制定堆栈策略。在共享环境中，如果所有团队都将其堆栈策略存储在同一 S3 存储桶中，则团队成员可能会附加一个可用但不适用于其团队堆栈的 CloudFormation 堆栈策略。为避免这种情况，您可以定义一个策略声明，允许 IAM 主体仅附加特定的堆栈策略。

以下示例策略允许 IAM 主体附加存储在 S3 存储桶中特定于团队的文件夹中的堆栈策略。您可以在此存储桶中存储已批准的堆栈策略。

```
{
  "Version": "2012-10-17",		 	 	 		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudformation:SetStackPolicy"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "cloudformation:StackPolicyUrl": "{{<Bucket URL>}}/{{<Team folder>}}/*"
        }
      }
    }
  ]
}
```

此策略声明不要求 IAM 主体为每个堆栈分配堆栈策略。即使 IAM 主体有权使用特定的堆栈策略创建堆栈，他们也可以选择创建没有堆栈策略的堆栈。

## 需要堆栈策略
<a name="requiring-stack-policies"></a>

为确保所有 IAM 主体为其堆栈分配堆栈策略，您可以将服务控制策略（SCP）或权限边界定义为预防性护栏。

以下示例策略显示了如何配置要求 IAM 主体在创建堆栈时分配堆栈策略的 SCP。如果 IAM 主体未附加堆栈策略，则无法创建堆栈。此外，此策略可防止具有堆栈更新权限的 IAM 主体在更新期间删除堆栈策略。该策略使用 `cloudformation:StackPolicyUrl` 条件键限制 `cloudformation:UpdateStack` 操作。

```
          {
  "Version": "2012-10-17",		 	 	 		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "cloudformation:CreateStack",
        "cloudformation:UpdateStack"
      ],
      "Resource": "*",
      "Condition": {
        "Null": {
          "cloudformation:StackPolicyUrl": "true"
        }
      }
    }
  ]
}
```

通过将此策略声明包含在 SCP 而不是权限边界中，您可以将护栏应用于组织中的所有账户。这可以执行以下操作：

1. 减少将策略单独附加到 AWS 账户中的多个 IAM 主体的工作量。权限边界只能直接附加到 IAM 主体。

1. 减少为不同 AWS 账户创建和管理多个权限边界副本的工作量。这样可以降低在多个相同权限边界中出现配置错误的风险。

**注意**  
SCPs 权限边界是权限防护栏，用于定义账户或组织中 IAM 委托人的最大可用权限。这些策略不会向 IAM 主体授予任何权限。如果您想要标准化您的账户或组织中的所有 IAM 主体分配堆栈策略的要求，则需要同时使用权限护栏和基于身份的策略。