

# Control Tower (CT) のデプロイ
<a name="cfctdeployment"></a>

AWS Control Tower のカスタマイズ (CfCT) ガイドは、AWS Control Tower 環境を会社または顧客向けにカスタマイズおよび拡張することを希望する管理者、DevOps プロフェッショナル、独立系ソフトウェアベンダー、IT インフラストラクチャアーキテクト、システムインテグレーターを対象としています。このガイドでは、CfCT カスタマイズパッケージを使用して AWS Control Tower 環境をカスタマイズおよび拡張する際に役立つ情報を提供します。

 **デプロイ時間**: 約 30 分

## 前提条件
<a name="cfctprerequisites"></a>

このソリューションをデプロイする前に、**AWS Control Tower 管理者**を対象としていることを確認してください。

AWS Control Tower コンソールまたは API を使用してランディングゾーンをセットアップする準備ができたら、次の手順に従います。

AWS Control Tower の使用を開始するには、「[Getting Started with AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/getting-started-with-control-tower.html)」を参照してください。

ランディングゾーンをカスタマイズする方法については、「[Customizing Your Landing Zone](https://docs.aws.amazon.com/controltower/latest/userguide/customize-landing-zone.html)」を参照してください。

ランディングゾーンを起動してデプロイするには、「[Landing Zone Deployment Guide](https://docs.aws.amazon.com/controltower/latest/userguide/deployment.html)」を参照してください。

## デプロイの概要
<a name="cfctdeployment-overview"></a>

次の手順を使用して、このソリューションを AWS にデプロイします。

 [ステップ 1: S3 バケットをビルドしてデプロイする](#step-1-cfn) 

**注記**  
S3 バケットの設定 – ADMIN のみ。これは 1 回限りの設定ステップであり、エンドユーザーが繰り返すべきではありません。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 を更新する**  
AWS CodePipeline 設定を変更して、ASR コンポーネントのデプロイに必要な新しいビルド手順、アーティファクト、またはステージを含めます。

## ステップ 1: S3 バケットをビルドして、デプロイする
<a name="step-1-cfn"></a>

AWS ソリューションでは、2 つのバケットを使用します。HTTPS 経由でアクセスするテンプレートへのグローバルアクセス用のバケットと、リージョン内のアセット (Lambda コードなど) へのアクセス用のリージョンバケットです。

**1. S3 バケットを設定する**  
一意のバケット名 (asr-staging など) を指定します。ターミナルに 2 つの環境変数を設定します。1 つは -reference をサフィックスとし、もう 1 つはデプロイ先のリージョンをサフィックスとするベースバケット名にする必要があります。

```
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 など) を使用して 2 つのバケットを作成します (reference バケットは CloudFormation テンプレートを保持し、リージョン名バケットは Lambda コードバンドルなどの他のすべてのアセットを保持します)。バケットは暗号化し、パブリックアクセスを禁止する必要があります。

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

**注記**  
バケットを作成する際は、パブリックにアクセスできないことを確認してください。ランダムなバケット名を使用し、パブリックアクセスを無効にします。KMS 暗号化を使用します。また、アップロードする前にバケットの所有権を確認してください。

**3. S3 バケットポリシーの設定**  
$TEMPLATE\_BUCKET\_NAME S3 バケットポリシーを更新して、実行アカウント ID の PutObject アクセス許可を含めます。このアクセス許可を、バケットへの書き込みが許可されている実行アカウント内の 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
  + Python 3.11 以降 (pip 付き)
  + AWS CDK 2.171.1 以降
  + Node.js 20 以降 (npm 付き)
  + エクスポートするプラグインを含む 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 install を実行していることを確認します。

次に、クローンしたリポジトリのデプロイフォルダから、build-s3-dist.sh を実行し、バケットのルート名 (mybucket など) およびビルドするバージョン (v1.0.0 など) を渡します。GitHub からダウンロードしたバージョンに基づく semver バージョン (例: 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 コンポーネントのビルドマニフェスト**  
ASR アーティファクトを S3 バケットにデプロイした後、Control Tower の[パイプラインマニフェスト](https://docs.aws.amazon.com/controltower/latest/userguide/cfcn-byo-customizations.html)を更新して新しいバージョンを参照し、パイプライン実行をトリガーします。[Control Tower のデプロイ](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 を実行します。「[code pipeline overview](https://docs.aws.amazon.com/controltower/latest/userguide/cfct-codepipeline-overview.html)」を参照してください。