Control Tower (CT) のデプロイ - AWS での自動化されたセキュリティ対応

Control Tower (CT) のデプロイ

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

デプロイ時間: 約 30 分

前提条件

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

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

AWS Control Tower の使用を開始するには、「Getting Started with AWS Control Tower」を参照してください。

ランディングゾーンをカスタマイズする方法については、「Customizing Your Landing Zone」を参照してください。

ランディングゾーンを起動してデプロイするには、「Landing Zone Deployment Guide」を参照してください。

デプロイの概要

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

ステップ 1: S3 バケットをビルドしてデプロイする

注記

S3 バケットの設定 – ADMIN のみ。これは 1 回限りの設定ステップであり、エンドユーザーが繰り返すべきではありません。S3 バケットは、ASR の実行に必要な AWS CloudFormation テンプレートと Lambda コードを含むデプロイパッケージを保存します。これらのリソースは、CfCt または StackSet を使用してデプロイします。

1. S3 バケットを設定する

デプロイパッケージの保存と提供に使用する S3 バケットを設定します。

2. 環境をセットアップする

ビルドとデプロイのプロセスに必要な環境変数、認証情報、ツールを準備します。

3. S3 バケットポリシーを設定する

アクセスとアクセス許可を制御するための適切なバケットポリシーを定義して適用します。

4. ビルドを準備する

デプロイするアプリケーションやアセットをコンパイル、パッケージ化、または準備します。

5. パッケージを S3 にデプロイする

準備したビルドアーティファクトを、指定先の S3 バケットにアップロードします。

ステップ 2: AWS Control Tower へのスタックのデプロイ

1. ASR コンポーネントのビルドマニフェストを作成する

すべての ASR コンポーネント、そのバージョン、依存関係、ビルド手順を一覧表示するビルドマニフェストを定義します。

2. CodePipeline を更新する

AWS CodePipeline 設定を変更して、ASR コンポーネントのデプロイに必要な新しいビルド手順、アーティファクト、またはステージを含めます。

ステップ 1: S3 バケットをビルドして、デプロイする

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::<execute_account_id>:role/<iam_role_name>" } } } ] }

S3 バケットポリシーを変更してアクセス許可を含めます。このアクセス許可を、バケットへの書き込みが許可されている実行アカウント内の IAM ロールに割り当てます。この設定を、リージョンのアセットバケット (asr-staging-us-east-1、asr-staging-eu-west-1 など) ごとに繰り返します。これにより、管理アカウントでバケットを作成することなく、複数のリージョンにデプロイできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::<asset bucket name>-<region>/*", "arn:aws:s3:::<asset bucket name>-<region>" ], "Condition": { "StringEquals": { "aws:PrincipalOrgID": "<org id>" } } }, { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::<asset bucket name>-<region>/*", "arn:aws:s3:::<asset bucket name>-<region>" ], "Condition": { "ArnLike": { "aws:PrincipalArn": "arn:aws:iam::<execute_account_id>:role/<iam_role_name>" } } } ] }
4. ビルドの準備

まず、ソースフォルダで 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 へのスタックのデプロイ

1. ASR コンポーネントのビルドマニフェスト

ASR アーティファクトを S3 バケットにデプロイした後、Control Tower のパイプラインマニフェストを更新して新しいバージョンを参照し、パイプライン実行をトリガーします。Control Tower のデプロイに関する記事を参照してください。

重要

ASR ソリューションを正しくデプロイするには、CloudFormation テンプレートの概要とパラメータの説明に関する AWS の公式ドキュメント (リンク先: CloudFormation テンプレートパラメータの概要ガイド) を参照してください。

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: LoadSCAdminStack parameter_value: "yes" - parameter_key: LoadCIS120AdminStack parameter_value: "no" - parameter_key: TargetAccountIDsStrategy parameter_value: "INCLUDE" - 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: TargetAccountIDs parameter_value: "ALL" - 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」を参照してください。