

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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 버킷 정의*

먼저 YAML 형식의 텍스트 파일인 CloudFormation 템플릿에서 S3 버킷을 정의합니다.

```
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 버킷 리소스 유형이 필요합니다. 각 작업에 필요한 리소스 유형에 대한 자세한 내용은 [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)를 참조하세요.
+ `Principal` 요소는 명령문에 정의된 Amazon S3 작업을 수행할 수 있는 엔터티를 나열합니다. 이 경우 CodeBuild 및 CodePipeline만 이러한 작업을 수행할 수 있습니다.
+ `Condition` 요소는 `Deployfiles_build` CodeBuild 프로젝트, `Deployment-Pipeline` CodePipeline 파이프라인 및 파이프라인 작업만 버킷에 액세스할 수 있도록 S3 버킷에 대한 액세스를 추가로 제한합니다.

*서비스 역할 생성*

버킷 정책은 버킷에 대한 액세스를 제어하지만 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}/*'
```