

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

# 为通过置备的资源配置最低权限权限 CloudFormation
<a name="permissions-cloudformation-provisioned-resources"></a>

AWS CloudFormation 允许您配置许多不同类型的 AWS 资源。预调配的资源需要自己的一组权限才能按预期运行，并配置谁有权访问这些资源。上一章回顾了配置访问和使用 CloudFormation 服务的权限的选项。本章介绍如何将最低权限原则应用于通过 CloudFormation置备的资源。

在本指南中，几乎不可能查看可通过 CloudFormation配置的每类 AWS 资源的安全建议和最佳实践。如果您对某项特定服务有疑问，我们建议您查看该服务的文档。大多数 AWS 服务 文档都包含安全部分以及有关使用该服务所需权限的信息。有关 AWS 服务 文档的完整列表，请参阅 [AWS 文档](https://docs.aws.amazon.com/index.html)。

以下是与服务无关的高级步骤，您可以采取这些步骤来创建符合最低权限原则的 CloudFormation模板：

1. 准备一份您计划使用配置的资源清单 CloudFormation。

1. 请参阅 [AWS 文档](https://docs.aws.amazon.com/index.html)了解相关服务，并查看有关安全性和访问管理的章节。这将帮助您了解特定于服务的要求和建议。

1. 使用您在前面的步骤中收集的信息来设计 CloudFormation 模板和关联策略，这些策略仅允许所需的权限而拒绝所有其他权限。

接下来，本指南将介绍如何使用真实用例在 CloudFormation 模板中应用最低权限原则的示例。

## 示例：用于存储管线构件的 Amazon S3 存储桶。
<a name="example-s3-bucket"></a>

此示例将创建一个用于存储 [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 项目构件的 [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)存储桶。[AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 使用这些存储的构件。您可以通过服务角色 CodePipeline 允许 CodeBuild 和访问此 S3 存储桶，并使用 Amazon S3 [存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)控制该访问权限。以下是本示例中使用的资源名称：
+ `Deployfiles_build`是 CodeBuild 项目的名称。
+ `Deployment-Pipeline`是中管道的名称 CodePipeline。

*定义 Amazon S3 存储桶*

首先，在 CloudFormation 模板中定义 S3 存储桶，该存储桶是一个 YAML 格式的文本文件。

```
amzn-s3-demo-bucket:
  Type: AWS::S3::Bucket
  Properties:
    PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
```

*定义 Amazon S3 存储桶策略*

接下来，在 CloudFormation 模板中创建仅允许`Deployfiles_build`项目和`Deployment-Pipeline`管道访问存储桶的存储桶策略。

```
MyBucketPolicy:
  Type: AWS::S3::BucketPolicy
  Properties: 
    Bucket: !Ref amzn-s3-demo-bucket
    PolicyDocument:
      Version: "2012-10-17"
      Statement:
      - Sid: "S3ArtifactRepoAccess"
        Effect: Allow
        Action: 
          - ‘s3:GetObject'
          - ‘s3:GetObjectVersion'
          - ‘s3:PutObject'
          - ‘s3:GetBucketVersioning'
        Resource: 
          - !Sub ‘arn:aws:s3:::${amzn-s3-demo-bucket}'
          - !Sub ‘arn:aws:s3:::${amzn-s3-demo-bucket}/*'
        Principal:
          Service:
            - codebuild.amazonaws.com
            - codepipeline.amazonaws.com
        Condition:
          StringLike:
            ‘aws:SourceArn':
              - !Sub ‘arn:aws:codebuild:${AWS::Region}:${AWS::AccountId}:project/Deployfiles_build'
              - !Sub ‘arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:Deployment-Pipeline'
              - !Sub ‘arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:Deployment-Pipeline/*'
```

请注意有关该存储桶策略的以下详细信息：
+ 该 `Resource` 元素列出了两种不同类型的资源，它们使用以下 Amazon 资源名称（ARN）格式：
  + S3 对象的 ARN 格式为 `arn:${{<Partition>}}:s3:::${{<BucketName>}}/${{<ObjectName>}}`。
  + S3 存储桶 ARN 的格式为 `arn:${{<Partition>}}:s3:::${{<BucketName>}}`。

  `s3:GetObject`、`s3:GetObjectVersion` 和 `s3:PutObject` 需要 S3 对象资源类型，且 `s3:GetBucketVersioning ` 需要 S3 存储桶资源类型。有关每个操作所需的资源类型的更多信息，请参阅 [Amazon S3 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)。
+ 该 `Principal` 元素列出了允许执行语句中定义的 Amazon S3 操作的实体。在这种情况下，只允许 CodeBuild 和 CodePipeline 执行这些操作。
+ 该`Condition`元素进一步限制了对 S3 存储桶的访问权限，因此只有`Deployfiles_build` CodeBuild 项目、`Deployment-Pipeline` CodePipeline 管道和管道操作才能访问该存储桶。

*创建服务角色*

尽管存储桶策略控制对存储桶的访问权限，但它不授予访问 CodeBuild 和 CodePipeline 访问存储桶的权限。要授予访问权限，您需要为每项服务创建一个服务角色，并在每个服务中添加以下语句。服务角色用于 CodeBuild 并 CodePipeline 允许服务访问 S3 存储桶及其对象。

```
Sid: "ViewAccessToS3ArtifactRepo"
Effect: Allow
Action: 
  - ‘s3:GetObject'
  - ‘s3:GetObjectVersion'
  - ‘s3:PutObject'
  - ‘s3:GetBucketVersioning'
Resource: 
  - !Sub ‘arn:aws:s3:::${BuildArtifactsBucket}'
  - !Sub ‘arn:aws:s3:::${BuildArtifactsBucket}/*'
```