

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為透過 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)使用這些存放成品。您可以允許 CodeBuild 和 CodePipeline 透過服務角色存取此 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 Resource Name (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}/*'
```