使用 Stellar Engine 创建着陆区

着陆区部署流程包含多个阶段。在每个阶段,您都必须向 terraform.tfvars 文件添加某些变量。完成一个阶段后,Terraform 会将 STAGE_NAME-tfvar.auto.tfvars.json 文件写入初始阶段创建的 Cloud Storage 存储桶。后续阶段使用 Google Cloud CLI 将文件和模拟特定阶段服务账号的提供方文件复制到新阶段文件夹中。

部署新环境大约需要一个小时,具体取决于租户数量。

前提条件

在部署 Stellar Engine 之前,请完成以下任务。

设置 Google Cloud

完成以下步骤以设置 Google Cloud:

  1. 选择一个 Google Cloud 组织。如果您创建了新组织,请至少登录一次 Google 管理控制台

  2. 配置多位管理员以实现职责分离。在测试环境中,一个用户可能拥有所有资源的管理员角色。不过,在生产环境中,您需要多个管理员。如需了解详情,请参阅设置组织资源

  3. 为所有特权账号启用两步验证

  4. 停用 Cloud Shell。 Cloud Shell 不支持 IL4 或 IL5 环境,必须由 Google Workspace 管理员停用。

  5. 如果您没有项目,请创建引导项目

    创建项目

  6. 在引导项目中完成以下任务:

    1. 启用结算功能。如需相关说明,请参阅验证项目的结算状态

    2. 启用 Cloud Monitoring API。

      启用 API 所需的角色

      如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色

      启用 API

  7. 验证您的用户账号是否为超级管理员

  8. 如果贵组织没有数据分类方案,请创建一个。

分配角色

将以下 Identity and Access Management 角色分配给部署 Stellar Engine 的用户账号。

  1. 确保您在组织中拥有以下角色: Access Transparency Admin、Assured Workloads Administrator、Billing Account Administrator、Logging Admin、Organization Administrator、Organization Policy Admin、Organization Role Administrator、Owner、Project Creator、Service Account Admin、Service Account Token Creator、Tag Admin

    检查角色

    1. 在 Google Cloud 控制台中,前往 IAM 页面。

      转到 IAM
    2. 选择组织。
    3. 主账号列中,找到标识您或您所属群组的所有行。如需了解您属于哪些群组,请与您的管理员联系。

    4. 对于指定或包含您的所有行,请检查角色列以查看角色列表是否包含所需的角色。

    授予角色

    1. 在 Google Cloud 控制台中,前往 IAM 页面。

      转到 IAM
    2. 选择组织。
    3. 点击 授予访问权限
    4. 新的主账号字段中,输入您的用户标识符。 这通常是 Google 账号的电子邮件地址。

    5. 点击选择角色,然后搜索相应角色。
    6. 如需授予其他角色,请点击 添加其他角色,然后添加其他各个角色。
    7. 点击 Save(保存)。

如果您要从新组织开始,可以运行位于 fast/stages-aw/0-bootstrap 文件夹中的以下脚本来应用角色:

./setIAM.sh EMAIL_ADDRESS ORGANIZATION_ID

替换以下内容:

  • EMAIL_ADDRESS:您的用户账号的电子邮件地址。
  • ORGANIZATION_ID:您的组织 ID。

此脚本会添加除“Billing Account Administrator”和“超级用户”以外的所有角色。

添加群组并配置服务

  1. 添加以下群组,如 2. 用户和群组

    • gcp-billing-admins@DOMAIN
    • gcp-developers@DOMAIN
    • gcp-devops@DOMAIN
    • gcp-hybrid-connectivity-admins@DOMAIN
    • gcp-logging-monitoring-admins@DOMAIN
    • gcp-logging-monitoring-viewers@DOMAIN
    • gcp-organization-admins@DOMAIN
    • gcp-vpc-network-admins@DOMAIN
    • gcp-security-admins@DOMAIN

    前往第 2 阶段

    DOMAIN 替换为您的 FQDN。

    如果系统提示,请跳过身份提供方步骤。

    Google 可能会更改默认群组名称。如果设置指南中没有某个群组,您可以手动创建该群组。

  2. 启用 Assured Workloads、BigQuery、Cloud Billing、Cloud Logging、Cloud KMS、IAM、Pub/Sub、Resource Manager、Service Account Credentials、Service Usage、Organization Policy Service API。

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色

    启用 API

  3. 您还可以使用 fast/stages-aw/0-bootstrap/enableServices.sh 脚本来启用这些服务。

  4. 启用 Access Transparency

  5. 如果您的配额少于 13 个项目,请前往 Google Cloud Platform/API 项目:申请提高结算配额,申请 13 个项目。如需了解详情,请参阅查看和管理配额

配置本地环境

完成以下步骤以配置本地环境:

  1. 克隆 Stellar Engine GitHub 代码库
  2. 安装 Google Cloud SDK
  3. 将本地 Terraform 更新到 1.8.1 版或更高版本。
  4. 安装 jq 二进制文件
  5. 进行身份验证并将引导项目设置为有效项目:

    gcloud auth login
    gcloud config set project BOOTSTRAP_PROJECT_ID
    gcloud auth application-default login
    

修改模块

在大多数情况下,您可以直接使用代码库,无需进行任何更改。如果您需要修改模块,请复制整个模块并使用 <module-se> 命名惯例,以避免从 Cloud Foundation Fabric 代码库中提取定期更新时发生合并冲突。

运行阶段 0:引导

第 0 阶段使网络的现有部分与 Terraform 状态保持一致。阶段 0 会创建初始 IaC 引导服务账号和项目。阶段 0:旨在将用户最初拥有的任何项目过渡到新的核心项目,并迁移 Terraform 状态。

  1. 将目录更改为 fast/stages-aw/0-bootstrap

  2. 复制 terraform.tfvars.sample 文件:

    cp terraform.tfvars.sample terraform.tfvars
    
  3. providers.tf.tmp 文件复制到 0-bootstrap-providers.tf 文件:

    cp providers.tf.tmp 0-bootstrap-providers.tf
    
  4. 更新 fast/stages-aw/0-bootstrap/terraform.tfvars 中的信息:

    billing_account = {
    id = "BILLING_ACCOUNT_ID"
    }
    regions = {
    primary = "REGION"
    }
    organization = {
    domain = "DOMAIN"
    id = "ORGANIZATION_ID"
    customer_id = "CUSTOMER_ID"
    }
    outputs_location = "~/fast-config"
    prefix = "PREFIX"
    log_sinks = {
    audit-logs = {
    filter = "logName:\"/logs/cloudaudit.googleapis.com%2Factivity\" OR logName:\"/logs/cloudaudit.googleapis.com%2Fsystem_event\" OR protoPayload.metadata.@type=\"type.googleapis.com/google.cloud.audit.TransparencyLog\""
    type = "logging"
    }
    vpc-sc = {
    filter = "protoPayload.metadata.@type=\"type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata\""
    type = "logging"
    }
    workspace-audit-logs = {
    filter = "logName:\"/logs/cloudaudit.googleapis.com%2Fdata_access\" and protoPayload.serviceName:\"login.googleapis.com\""
    type = "logging"
    }
    empty-audit-logs = {
    filter = ""
    type = "logging"
    }
    }
    org_policies_config = {
      constraints = {
        "ALLOWED_POLICY_MEMBER_DOMAINS" = []
        }
      }
    fast_features = {
    envs = true
    }
    assured_workloads = {
    regime = "COMPLIANCE_REGIME"
    location = "LOCATION"
    }
    bootstrap_project = "BOOTSTRAP_PROJECT_ID"
    alert_email = "ALERT_EMAIL"
    

    替换以下内容:

    • BILLING_ACCOUNT_ID:用于部署环境的结算账号。如需查找结算账号信息,请参阅 Google Cloud 控制台。

      转到“结算”

    • REGION:用于部署资源的主要区域。对于 IL5 和 FedRAMP,默认值为 us-east4

      如需添加要将资源部署到的辅助区域,请添加 secondary=secondary

    • DOMAIN:完全限定域名 (FQDN)。如需查看 FQDN,请运行 gcloud organizations list

    • ORGANIZATION:Google Cloud 组织的组织 ID。如需查看组织 ID,请运行 gcloud organizations list

    • CUSTOMER_ID:Google Workspace 目录客户 ID。如需查看 ID,请运行 gcloud organizations list

    • PREFIX:要附加到已部署的项目和资源名称的前缀。项目名称必须在全球范围内保持唯一性,并且前缀不得超过 6 个字符。如果项目名称不是唯一的,则会发生 409 错误。

    • ALLOWED_POLICY_MEMBER_DOMAINS:如果需要,请使用其他客户 ID 进行更新。如需了解详情,请参阅通过网域受限的共享功能限制身份

    • COMPLIANCE_REGIME:相应环境的合规性制度,可以是 IL4IL5FEDRAMP_HIGHCOMPLIANCE_REGIME_UNSPECIFIED 之一。如果您不想使用 Assured Workloads,请将此值设置为 COMPLIANCE_REGIME_UNSPECIFIED

    • LOCATION:要将资源部署到的美国区域。不支持双区域(例如 NAM9)或大洲。

    • BOOTSTRAP_PROJECT_ID:您在设置 Google Cloud中创建的引导项目 ID。

    • ALERT_EMAIL:接收日志记录提醒通知的电子邮件地址。

  5. 运行 terraform init

  6. 运行 terraform apply

    terraform apply -var bootstrap_user=$(gcloud config list --format
     'value(core.account)')
    
  7. 出现提示时,请输入 yes

  8. 切换到新项目:

    gcloud config set project PREFIX-prod-iac-core-0
    
  9. 复制新的本地 Terraform 提供程序文件:

    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/providers/0-bootstrap-providers.tf ./
    
  10. 将状态从本地迁移到远程:

    terraform init --migrate-state
    
  11. 出现提示时,请输入 yes

  12. 运行 ./import.sh

  13. 再次运行 terraform apply。出现提示时,请输入 yes

运行阶段 1:资源管理

第 1 阶段在组织级层创建用于后续阶段的不同文件夹、项目和服务账号。如需创建环境,您必须更新 fast/stages-aw/1-resman 中的 terraform.tfvars 文件,以添加 tenants 变量。每个租户(例如,特定的联邦机构或内部开发组)都有自己的专用隔离边界来运行其工作负载。每个租户都会继承在第 0 阶段和第 2 阶段创建的集中式安全控制措施、网络边界、政策护栏和审核日志接收器。

  1. 如果您使用的是外部结算账号,请参阅使用外部结算账号时配置结算信息

  2. 将目录更改为 fast/stages-aw/1-resman

  3. 复制 terraform.tfvars.sample 文件:

    cp terraform.tfvars.sample terraform.tfvars
    
  4. 更新 terraform.tfvars,具体代码如下所示:

    tenants = {
    ten-1 = {
      admin_principal = "group:gcp-devops@DOMAIN"
      descriptive_name = "TENANT_ONE_NAME"
      locations = {
        gcs = "REGION"
        kms = "REGION"
        }
      },
    ten-2 = {
      admin_principal = "group:gcp-devops@DOMAIN"
      descriptive_name = "TENANT_TWO_NAME"
      locations = {
        gcs = "REGION"
        kms = "REGION"
        }
      }
    }
    fast_features = {
    envs = true
    }
    envs_folders = {
    Prod = {
      admin = "gcp-organization-admins@DOMAIN"
    },
    Int = {
      admin = "gcp-organization-admins@DOMAIN"
    },
    Test = {
      admin = "gcp-organization-admins@DOMAIN"
    }
    }
    

    替换以下内容:

    • DOMAIN:主完全限定域名 (FQDN)。如需查看 FQDN,请运行 gcloud organizations list

    • TENANT_ONE_NAME:已部署的第一个租户项目的名称。最多使用 6 个字符。

    • REGION:要将资源部署到的主要区域。对于 IL5 和 FedRAMP,默认值为 us-east4

    • TENANT_TWO_NAME:已部署的第二个租户项目的名称。最多使用 6 个字符。

    根据需要添加任意数量的租户定义。

  5. 从 Cloud Storage 复制 tfvars 文件:

    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/providers/1-resman-providers.tf ./ &&
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-globals.auto.tfvars.json ./ &&
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-bootstrap.auto.tfvars.json ./
    
  6. 运行 terraform init

  7. 运行 terraform apply。出现提示时,请输入 yes

运行第 2 阶段:创建网络

第 2 阶段包含两种网络选项:一种适用于 FedRAMP High,另一种适用于 IL4 或 IL5

为 FedRAMP High 配置网络

  1. 如果您使用的是外部结算账号,请参阅使用外部结算账号时配置结算信息

  2. 将目录更改为 fast/stages-aw/2-networking-a-fedramp-high

  3. 从 Cloud Storage 存储分区复制提供程序和全局 tfvars 文件:

    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/providers/2-networking-providers.tf ./ && \
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-globals.auto.tfvars.json ./ && \
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-bootstrap.auto.tfvars.json ./ && \
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/1-resman.auto.tfvars.json ./
    
  4. 复制 terraform.tfvars.sample 文件:

    cp terraform.tfvars.sample terraform.tfvars
    
  5. terraform.tfvars 文件中,更新自定义子网、代理子网、防火墙规则、命名 CIDR 和 DNS 响应政策规则。

  6. 运行 terraform init

  7. 运行 terraform apply。出现提示时,请输入 yes

为 IL4 或 IL5 配置网络

此步骤会将一对 Palo Alto VM 系列下一代防火墙 (NGFW) 部署到网络账号中。NGFW 使用自带许可 (BYOL) 部署映像,并且要求您使用 Palo Alto 控制台上传虚拟机代码并注册它们。如需了解更多说明,请参阅 2-networking-b-il5-ngfw 阶段文件夹中的自述文件。

  1. 如果您使用的是外部结算账号,请参阅使用外部结算账号时配置结算信息

  2. 将目录更改为 fast/stages-aw/2-networking-b-il5-ngfw

  3. 从 Cloud Storage 存储分区复制提供程序和全局 tfvars 文件:

    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/providers/2-networking-providers.tf ./ && \
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-globals.auto.tfvars.json ./ && \
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-bootstrap.auto.tfvars.json ./ && \
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/1-resman.auto.tfvars.json ./
    
  4. 复制 terraform.tfvars.sample 文件:

    cp terraform.tfvars.sample terraform.tfvars
    
  5. terraform.tfvars 文件中,更新自定义子网(包括管理子网)、代理子网、防火墙规则、命名 CIDR 和 DNS 响应政策规则。

  6. 运行 terraform init

  7. 运行 terraform apply。出现提示时,请输入 yes

    如果您在控制台中收到有关服务账号或 Cloud Key Management Service 不存在的错误,请点击 PREFIX-net-vdss-host 存储账号中的设置。服务账号已生成。

运行第 3 阶段:安全和审核账号配置

第 3 阶段配置安全项目和审核项目。安全项目 (prod-sec-core-0) 包含 Cloud KMS,并且可以包含 Secret Manager。在 IL5 中,默认情况下为 Compute Engine、Google Kubernetes Engine (GKE)、Cloud Storage 和 Cloud SQL 启用 CMEK。系统会强制执行以下组织政策限制条件:

  • gcp.restrictNonCmekServices
    • denied_values: "compute.googleapis.com"
    • denied_values: "container.googleapis.com"
    • denied_values: "storage.googleapis.com"
    • denied_values: "sqladmin.googleapis.com"
  • gcp.restrictCmekCryptoKeyProjectsgcp.restrictCmekCryptoKeyProjects 包含可以使用 CMEK 的项目列表。

prod-sec-core-0 项目中,配置了以下项:

  • Cloud KMS 受限管理员会被授予受限管理员角色,以便他们可以向其他服务授予解密权限。
  • 系统会预配不同位置的 Cloud KMS 密钥环。密钥环位置必须与服务位置一致。例如,多区域密钥环不能用于单区域存储桶。

审核项目包含一个用于存储审核日志的日志记录存储桶。

安全管理员负责安全项目,审核员负责审核项目。

  1. 如果您使用的是外部结算账号,请参阅使用外部结算账号时配置结算信息

  2. 将目录更改为 fast/stages-aw/3-security

  3. 从 Cloud Storage 存储分区复制配置文件:

    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/providers/3-security-providers.tf ./ &&
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-globals.auto.tfvars.json ./ &&
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/0-bootstrap.auto.tfvars.json ./ &&
    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/1-resman.auto.tfvars.json ./
    
  4. 运行 terraform init

  5. 运行 terraform apply。出现提示时,请输入 yes

    如果您遇到服务账号方面的问题,请重新运行 terraform apply

  6. 运行 ./sa_lockdown.sh 以停用部署期间使用的服务账号。

使用外部结算账号时配置结算

如果您使用的是外部结算账号,则必须向以下服务账号添加结算账号管理员角色:

  • PREFIX-prod-resman-0@PREFIX-prod-iac-core-0.iam.gserviceaccount.com:此账号是在阶段 0 中创建的。

  • PREFIX-prod-resman-net-0@PREFIX-prod-iac-core-0.iam.gserviceaccount.com:此服务账号是在阶段 1 中创建的。

  • PREFIX-security-0@PREFIX-prod-iac-core-0.iam.gserviceaccount.com:此服务账号是在第 2 阶段创建的。

如需向这些服务账号添加相应角色,请完成访问 Cloud Billing 账号的“权限”面板在“权限”面板中更新角色和主账号

修改租户项目

为现有 Stellar Engine 部署添加或移除租户项目时,请执行以下步骤。

  1. 进行身份验证并设置活跃项目:

    gcloud auth login
    gcloud config set project PREFIX-prod-iac-core-0
    gcloud auth application-default login
    
  2. 为各个阶段启用服务账号:

    1. 将目录更改为 fast/stages-aw/3-security

    2. 运行 ./sa_lockdown.sh --enable

  3. 应用第 1 阶段:

    1. 将目录更改为 fast/stages-aw/1-resman

    2. 根据您的新要求更新 terraform.tfvars 中的信息。

    3. 运行 terraform init

    4. 运行 terraform apply。出现提示时,请输入 yes

  4. 应用第 2 阶段:

    1. 将目录更改为以下某个网络文件夹:

    2. 从 Cloud Storage 存储桶复制 1-resman tfvars 文件:

    gcloud storage cp gs://PREFIX-prod-iac-core-outputs-0/tfvars/1-resman.auto.tfvars.json ./
    
    1. 运行 terraform init

    2. 运行 terraform apply。出现提示时,请输入 yes

  5. 停用各个阶段的服务账号:

    1. 将目录更改为 fast/stages-aw/3-security

    2. 运行 ./sa_lockdown.sh

问题排查

本部分介绍了一些常见错误和解决方法。

阶段 1 中的 BigQuery 不可用错误

如果您收到错误消息,指出 bigquery.googleapis.com 在 Assured Workloads 中不可用,请完成以下步骤:

  1. 在控制台中,前往 Assured Workloads 页面。

    Assured Workloads

  2. 选择 StellarEngine-COMPLIANCE_REGIME 文件夹和“网络”文件夹(如果适用)。

  3. 点击查看可用更新

  4. 前往允许的服务

  5. 点击允许服务以添加 BigQuery API。

  6. 如果系统提示您确认,请点击确认您的选择。

  7. 等待大约两分钟,然后重新运行 terraform apply

    terraform apply -var bootstrap_user=$(gcloud config list --format 'value(core.account)')
    
  8. 出现提示时,请输入 yes

您的引导项目无法再访问您的结算账号

如果您的启动项目无法再访问您的结算账号,请重新为启动项目启用结算功能。

启用结算功能

Cloud KMS 密钥错误

如果在构建流程中出现密钥错误,您可能需要手动启用密钥。如需查看相关说明,请参阅启用密钥版本

如果您收到这些错误,请等待大约一分钟,然后重新运行 terraform apply

在 Windows 计算机上,符号链接可能无法正常使用。您可能需要手动复制特定文件,尤其是在第 2 阶段复制 psc.tflog-metric-alerts.tf

结算或配额问题

如果您遇到结算或配额问题,请验证是否已设置配额项目。 您可以通过运行以下命令来设置该变量:

gcloud auth application-default set-quota-project PREFIX-prod-iac-core-0

您也可以选择使用其他项目。

后续步骤

  • 如需了解其他安全配置,请参阅 Gemini 安全标准

  • 集成 Google Security Operations 等 SIEM 解决方案来监控资源。将 SIEM 分段放置在单独的 Google Cloud 项目中,并放置在与收集数据的 VPC 不同的 VPC 中。