

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

# Control Tower(CT) 배포
<a name="cfctdeployment"></a>

Customizations for AWS Control Tower(CfCT) 가이드는 회사 및 고객을 위해 AWS Control Tower 환경을 사용자 지정하고 확장하려는 관리자, DevOps 전문가, 독립 소프트웨어 개발 판매 회사, IT 인프라 아키텍트 및 시스템 통합 사업자를 위한 것입니다. 이 가이드는 CfCT 사용자 지정 패키지를 사용하여 AWS Control Tower 환경을 사용자 지정하고 확장하는 방법에 대한 정보를 제공합니다.

 **배포 시간:** 약 30분

## 사전 조건
<a name="cfctprerequisites"></a>

이 솔루션을 배포하기 전에 **AWS Control Tower 관리자**를 위한 솔루션인지 확인합니다.

AWS Control Tower 콘솔 또는 APIs를 사용하여 랜딩 존을 설정할 준비가 되면 다음 단계를 따르세요.

AWS Control Tower를 시작하려면 AWS [Control Tower 시작하기를 참조하세요.](https://docs.aws.amazon.com/controltower/latest/userguide/getting-started-with-control-tower.html)

랜딩 존을 사용자 지정하는 방법을 알아보려면 다음을 참조하세요. [랜딩 존 사용자 지정](https://docs.aws.amazon.com/controltower/latest/userguide/customize-landing-zone.html) 

랜딩 존을 시작하고 배포하려면 [랜딩 존 배포 가이드를](https://docs.aws.amazon.com/controltower/latest/userguide/deployment.html) 참조하세요.

## 배포 개요
<a name="cfctdeployment-overview"></a>

다음 단계에 따라이 솔루션을 AWS에 배포합니다.

 [1단계: S3 버킷 빌드 및 배포](#step-1-cfn) 

**참고**  
S3 버킷 구성 - ADMIN 전용입니다. 이 단계는 일회성 설정 단계이므로 최종 사용자가 반복해서는 안 됩니다. S3 버킷은 ASR을 실행하는 데 필요한 AWS CloudFormation 템플릿 및 Lambda 코드를 포함하여 배포 패키지를 저장합니다. 이러한 리소스는 CfCt 또는 StackSet를 사용하여 배포됩니다.

**1. S3 버킷 구성**  
배포 패키지를 저장하고 제공하는 데 사용할 S3 버킷을 설정합니다.

**2. 환경 설정**  
빌드 및 배포 프로세스에 필요한 환경 변수, 자격 증명 및 도구를 준비합니다.

**3. S3 버킷 정책 구성**  
적절한 버킷 정책을 정의하고 적용하여 액세스 및 권한을 제어합니다.

**4. 빌드 준비**  
배포를 위해 애플리케이션 또는 자산을 컴파일, 패키징 또는 준비합니다.

**5. S3에 패키지 배포**  
준비된 빌드 아티팩트를 지정된 S3 버킷에 업로드합니다.

 [2단계: AWS Control Tower에 배포 스택](#step-2-cfn) 

**1. ASR 구성 요소에 대한 빌드 매니페스트 생성**  
모든 ASR 구성 요소, 해당 버전, 종속성 및 빌드 지침을 나열하는 빌드 매니페스트를 정의합니다.

**2. CodePipeline 업데이트**  
ASR 구성 요소를 배포하는 데 필요한 새 빌드 단계, 아티팩트 또는 단계를 포함하도록 AWS CodePipeline 구성을 수정합니다.

## 1단계: S3 버킷 빌드 및 배포
<a name="step-1-cfn"></a>

AWS Solutions는 HTTPS를 통해 액세스하는 템플릿에 대한 글로벌 액세스를 위한 버킷과 Lambda 코드와 같은 리전 내 자산에 액세스하기 위한 리전 버킷이라는 두 개의 버킷을 사용합니다.

**1. S3 버킷 구성**  
asr-staging과 같은 고유한 버킷 이름을 선택합니다. 터미널에 두 개의 환경 변수를 설정합니다. 하나는 참조가 접미사이고 다른 하나는 의도한 배포 리전이 접미사인 기본 버킷 이름이어야 합니다.

```
export BASE_BUCKET_NAME=asr-staging-$(date +%s)
export TEMPLATE_BUCKET_NAME=$BASE_BUCKET_NAME-reference
export REGION=us-east-1
export ASSET_BUCKET_NAME=$BASE_BUCKET_NAME-$REGION
```

**2. 환경 설정**  
AWS 계정에서 asr-staging-reference 및 asr-staging-us-east-1과 같은 이름으로 두 개의 버킷을 생성합니다. (참조 버킷에는 CloudFormation 템플릿이 저장되고 리전 버킷에는 Lambda 코드 번들과 같은 다른 모든 자산이 저장됩니다.) 버킷은 암호화되어야 하며 퍼블릭 액세스를 허용하지 않아야 합니다.

```
aws s3 mb s3://$TEMPLATE_BUCKET_NAME/
aws s3 mb s3://$ASSET_BUCKET_NAME/
```

**참고**  
버킷을 생성할 때 버킷에 공개적으로 액세스할 수 없는지 확인합니다. 무작위 버킷 이름을 사용합니다. 퍼블릭 액세스를 비활성화합니다. KMS 암호화를 사용합니다. 그리고 업로드하기 전에 버킷 소유권을 확인합니다.

**3. S3 버킷 정책 설정**  
실행 계정 ID에 대한 PutObject 권한을 포함하도록 $TEMPLATE\_BUCKET\_NAME S3 버킷 정책을 업데이트합니다. 버킷에 쓸 수 있는 권한이 있는 실행 계정 내의 IAM 역할에이 권한을 할당합니다. 이 설정을 사용하면 관리 계정에서 버킷을 생성하지 않아도 됩니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::template-bucket-name/*",
                "arn:aws:s3:::template-bucket-name"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "org-id"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::template-bucket-name/*",
                "arn:aws:s3:::template-bucket-name"
            ],
            "Condition": {
                "ArnLike": {
                    "aws:PrincipalArn": "arn:aws:iam::account-id:role/iam-role-name"
                }
            }
        }
    ]
}
```

권한을 포함하도록 자산 S3 버킷 정책을 변경합니다. 버킷에 쓸 수 있는 권한이 있는 실행 계정 내의 IAM 역할에이 권한을 할당합니다. 각 리전 자산 버킷(예: asr-staging-us-east-1, asr-staging-eu-west-1 등)에 대해이 설정을 반복하여 관리 계정에서 버킷을 생성할 필요 없이 여러 리전에 배포할 수 있습니다.

**4. 빌드 준비**
+ 사전 조건:
  + AWS CLI v2
  + pip가 있는 Python 3.11 이상
  + AWS CDK 2.171.1 이상
  + npm을 사용하는 Node.js 20 이상
  + 내보낼 플러그인이 있는 Poetry v2
+ Git 복제본 [https://github.com/aws-solutions/automated-security-response-on-aws.git](https://github.com/aws-solutions/automated-security-response-on-aws.git) 

먼저 소스 폴더에 npm 설치를 실행했는지 확인합니다.

복제된 리포지토리의 배포 폴더 옆에서 build-s3-dist.sh 실행하여 버킷의 루트 이름(예: mybucket)과 빌드 중인 버전(예: v1.0.0)을 전달합니다. GitHub에서 다운로드한 버전(예: GitHub: v1.0.0, 빌드: v1.0.0.mybuild)

```
chmod +x build-s3-dist.sh
export SOLUTION_NAME=automated-security-response-on-aws
export SOLUTION_VERSION=v1.0.0.mybuild
./build-s3-dist.sh -b $BASE_BUCKET_NAME -v $SOLUTION_VERSION
```

 **5. S3에 패키지 배포** 

```
cd deployment
aws s3 cp global-s3-assets/  s3://$TEMPLATE_BUCKET_NAME/$SOLUTION_NAME/$SOLUTION_VERSION/ --recursive --acl bucket-owner-full-control
aws s3 cp regional-s3-assets/  s3://$ASSET_BUCKET_NAME/$SOLUTION_NAME/$SOLUTION_VERSION/ --recursive --acl bucket-owner-full-control
```

## 2단계: AWS Control Tower에 배포 스택
<a name="step-2-cfn"></a>

**1. ASR 구성 요소에 대한 매니페스트 빌드**  
S3 버킷에 ASR 아티팩트를 배포한 후 Control Tower [파이프라인 매니페스트](https://docs.aws.amazon.com/controltower/latest/userguide/cfcn-byo-customizations.html)를 업데이트하여 새 버전을 참조한 다음 파이프라인 실행을 트리거합니다. [controltower 배포](https://docs.aws.amazon.com/controltower/latest/userguide/deployment.html)를 참조하세요.

**중요**  
ASR 솔루션을 올바르게 배포하려면 CloudFormation 템플릿 개요 및 파라미터 설명에 대한 자세한 내용은 공식 AWS 설명서를 참조하세요. 아래 정보 링크: [CloudFormation 템플릿](https://docs.aws.amazon.com/en_us/solutions/latest/automated-security-response-on-aws/aws-cloudformation-template.html) [파라미터 개요 가이드](https://docs.aws.amazon.com/solutions/latest/automated-security-response-on-aws/deployment.html) 

ASR 구성 요소의 매니페스트는 다음과 같습니다.

```
region: us-east-1 #<HOME_REGION_NAME>
version: 2021-03-15

# Control Tower Custom CloudFormation Resources
resources:
  - name: <ADMIN STACK NAME>
    resource_file: s3://<ADMIN TEMPLATE BUCKET path>
    parameters:
      - parameter_key: UseCloudWatchMetricsAlarms
        parameter_value: "yes"
      - parameter_key: TicketGenFunctionName
        parameter_value: ""
      - parameter_key: ShouldDeployWebUI
        parameter_value: "yes"
      - parameter_key: AdminUserEmail
        parameter_value: "<YOUR EMAIL ADDRESS>"
      - parameter_key: LoadSCAdminStack
        parameter_value: "yes"
      - parameter_key: LoadCIS120AdminStack
        parameter_value: "no"
      - parameter_key: LoadCIS300AdminStack
        parameter_value: "no"
      - parameter_key: UseCloudWatchMetrics
        parameter_value: "yes"
      - parameter_key: LoadNIST80053AdminStack
        parameter_value: "no"
      - parameter_key: LoadCIS140AdminStack
        parameter_value: "no"
      - parameter_key: ReuseOrchestratorLogGroup
        parameter_value: "yes"
      - parameter_key: LoadPCI321AdminStack
        parameter_value: "no"
      - parameter_key: RemediationFailureAlarmThreshold
        parameter_value: "5"
      - parameter_key: LoadAFSBPAdminStack
        parameter_value: "no"
      - parameter_key: EnableEnhancedCloudWatchMetrics
        parameter_value: "no"
    deploy_method: stack_set
    deployment_targets:
     accounts: # :type: list
        - <ACCOUNT_NAME> # and/or
        - <ACCOUNT_NUMBER>
    regions:
      - <REGION_NAME>

  - name:  <ROLE MEMBER STACK NAME>
    resource_file: s3://<ROLE MEMBER TEMPLATE BUCKET path>
    parameters:
      - parameter_key: SecHubAdminAccount
        parameter_value: <ADMIN_ACCOUNT_NAME>
      - parameter_key: Namespace
        parameter_value: <NAMESPACE>
    deploy_method: stack_set
    deployment_targets:
      organizational_units:
        - <ORG UNIT>

  - name:  <MEMBER STACK NAME>
    resource_file: s3://<MEMBER TEMPLATE BUCKET path>
    parameters:
      - parameter_key: SecHubAdminAccount
        parameter_value: <ADMIN_ACCOUNT_NAME>
      - parameter_key: LoadCIS120MemberStack
        parameter_value: "no"
      - parameter_key: LoadNIST80053MemberStack
        parameter_value: "no"
      - parameter_key: Namespace
        parameter_value: <NAMESPACE>
      - parameter_key: CreateS3BucketForRedshiftAuditLogging
        parameter_value: "no"
      - parameter_key: LoadAFSBPMemberStack
        parameter_value: "no"
      - parameter_key: LoadSCMemberStack
        parameter_value: "yes"
      - parameter_key: LoadPCI321MemberStack
        parameter_value: "no"
      - parameter_key: LoadCIS140MemberStack
        parameter_value: "no"
      - parameter_key: EnableCloudTrailForASRActionLog
        parameter_value: "no"
      - parameter_key: LogGroupName
        parameter_value: <LOG_GROUP_NAME>
      - parameter_key: LoadCIS300MemberStack
        parameter_value: "no"
    deploy_method: stack_set
    deployment_targets:
     accounts: # :type: list
        - <ACCOUNT_NAME> # and/or
        - <ACCOUNT_NUMBER>
    organizational_units:
      - <ORG UNIT>
    regions: # :type: list
      - <REGION_NAME>
```

**2. 코드 파이프라인 업데이트**  
custom-control-tower-configuration.zip에 매니페스트 파일을 추가하고 CodePipeline을 실행합니다. [코드 파이프라인 개요를](https://docs.aws.amazon.com/controltower/latest/userguide/cfct-codepipeline-overview.html) 참조하세요.