

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 リソースネーム (ARN) 形式を使用する 2 つの異なるタイプのリソースを一覧表示します。
  + 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}/*'
```