

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 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 控制台设置着陆区时 APIs，或者按照以下步骤操作：

要开始使用 AWS Control Tower，请参阅：[AWS 控制塔入门](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 存储桶配置-仅适用于管理员。这是一次性设置步骤，最终用户不应重复此步骤。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 Solutions 使用两个存储桶：一个用于全球访问模板的存储桶（通过 HTTPS 进行访问）和用于访问区域内资产（例如 Lambda 代码）的区域存储桶。

**1. 配置 S3 存储桶**  
选择一个唯一的存储桶名称，例如 asr-staging。在您的终端上设置两个环境变量，一个应该是基本存储桶名称，后缀为-reference，另一个应以您的预期部署区域作为后缀：

```
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 存储桶策略设置**  
更新 $TEMPLATE\_BUCKET\_NAME S3 存储桶策略以包含 PutObject 执行账户 ID 的权限。将此权限分配给执行账户中有权写入存储桶的 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\+
  + 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）。我们建议根据下载的版本使用 semver 版本 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 组件生成清单**  
[将 ASR 工件部署到 S3 存储桶后，更新 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 解决方案，请参阅 AWS 官方文档，了解有关 CloudFormation 模板概述和参数描述的详细信息。以下信息链接：[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) 