启用 VPC Service Controls 的最佳实践

本文档介绍了在 Google Cloud 组织中配置和实施 VPC Service Controls 保护的推荐流程。

未谨慎启用 VPC Service Controls 可能会导致现有应用出现问题,并可能导致服务中断。我们建议您谨慎规划启用,并留出充裕的时间来收集数据、进行测试和分析违规日志。确保由 VPC Service Controls 运营团队和您的应用团队中的利益相关方负责执行任务。

对于每个要添加到 VPC Service Controls 的工作负载或应用,您应该重复启用过程。

协调通信

通常,网络安全或云启用团队会领导 VPC Service Controls 启用工作。我们建议您安排专人创建并跟踪跨职能会议和文档代办项。您的团队将在以下方面展开协作:

  • Google Cloud API 访问模式
  • 识别服务边界违规行为
  • 允许访问边界

与传统的网络防火墙一样,其意图是识别和允许合法业务工作负载高效运行所需的流。

文档访问模式和使用场景

如需开始启用过程,请识别并清楚地记录所有有效的访问模式。访问模式是边界内外各元素之间的可重复类型。以下是一些常见的访问模式:

  • 数据访问模式:边界外的服务可存储或检索位于边界内的数据。
  • 资源访问模式
    • 用户可通过 Google Cloud 控制台访问边界中的项目。
    • 第三方工具或服务可管理和访问边界内的资源。
    • 边界内的服务或资源可访问 Google API。
  • 端点访问模式
    • 用户可以通过组织管理的设备访问边界内的资源。
    • 本地资源可与边界内的资源进行通信。

识别工作负载的访问模式后,请识别您的使用场景,并根据上述列表中的某种访问模式对其进行分类。以下是一些常见使用场景:

  • 云管理员负责管理属于边界的项目。
  • 位于边界外的 Terraform、Jenkins 和 Microsoft Azure DevOps 等自动化服务管理边界内的资源部署。
  • 边界外的 Ansible、Chef 或 Puppet 等配置管理服务负责管理对边界内的资源进行软件部署和配置。
  • 边界外的 Forseti 或 SIEM 等安全监控和强制执行服务会消耗数据,或者对边界内的资源强制执行安全政策。

对于每个使用场景,请记录以下内容:

  • 访问模式
  • 可触发使用场景的参与者
  • 触发使用场景的条件
  • 使用场景是否为有效的访问模式且是否允许
  • 任何与使用场景有关的假设

如需查看访问模式和使用场景跟踪器的示例,请参阅 VPC Service Controls 新手入门模板 - 使用场景 (PDF)

进行面谈

与您的工作负载团队进行面谈,讨论您从之前的通信模板收集到的访问模式和使用场景。以下是您在面谈过程中可能提出的问题示例:

  • 在启用 VPC Service Controls 时是否首先考虑您的使用场景?我们建议您仅在初始启用时考虑最重要的工作负载,并在保护业务关键型资源后对其他不太重要的工作负载进行初始配置。

  • 您能否全面执行所有使用场景?您可以通过此方法来触发所有可能的边界场景,这样您便可以全面分析并确认应用将在您强制执行边界后正常运行。

  • 执行使用场景需要多长时间?

  • 您是否计划对此可能会与 VPC Service Controls 启用发生冲突的工作负载进行任何重大更改?在启用 VPC Service Controls 之前,工作负载功能必须处于稳定状态。

准备试运行

试运行模式可在不中断应用的情况下,通过识别违规行为来降低测试 VPC Service Controls 实施的复杂度。将试运行配置为单独的边界,以记录所有违规行为,但不会执行任何阻止行为。您可以执行试运行边界内的工作负载,并生成要分析的违规日志。

如需准备试运行环境,请执行以下操作:

  1. 识别符合属于边界的条件的所有项目,并完成这些项目的使用场景和面谈过程。
  2. 创建试运行边界并添加所有项目。
  3. 在 VPC Service Controls 服务边界中的受限服务 > 要保护的服务下,添加所有受支持的服务。
  4. 创建一个可将所有日志发送到 BigQuery 的汇总日志记录接收器,或者为每个项目创建一个日志接收器以将试运行日志发送到通用 BigQuery 数据集。如需查询这些日志消息并识别 VPC Service Controls 的违规行为,您可以使用 SQL 查询。

    如需创建包含所有相关 VPC Service Controls 日志消息的日志接收器,请使用以下过滤条件:

    logName="projects/$PROJECT/logs/cloudaudit.googleapis.com%2Fpolicy"
    
  5. 为最大限度地提高安全性,请禁止访问不支持的服务。配置边界,使得边界内只有受限制的服务正常运行。为此,请将可访问的服务列表配置为 RESTRICTED-SERVICES

  6. 如果您已拥有允许使用的公共 IP、身份、可信设备、项目或 VPC 网络的列表,请将其添加到试运行边界内适用的入站规则或访问权限级别。允许已知的合法流程有助于减少违规日志的数量,使审核人员专注于可操作事件。

  7. 验证项目中没有任何 VPC 具有指向互联网或专用 VIP 的出站路径。

  8. 验证所有 VPC 是否具有指向 restricted.googleapis.com*.googleapis.com DNS

    在“可用区详情”中,DNS 名称 *.googleapis.com 在“数据”字段中具有 restricted.googleapis.com

执行使用场景

在同意的时间点,让您的应用团队针对试运行边界中的项目执行其工作负载。确保您对可调用 Google API 的所有代码提供完全的覆盖范围。试运行完成后,您指定的审核团队可以执行违规日志分析。

分析违规行为

试运行违规日志中包含您确定应用违规行为是否需要任何操作(例如向边界许可名单添加身份或 IP 地址)所需的大多数信息。违规数据存储在 BigQuery 表 cloudaudit_googleapis_com_policy 中。分析违规行为的主要要素如下:

  • 被调用的受保护服务和 API 方法。
  • 边界内可能已阻止请求的项目。
  • 调用受保护 API 的身份的电子邮件。
  • 调用方的 IP 地址。
  • 违规的类型。

以下示例是一个将返回所有违规详情的 BigQuery 查询:

SELECT
receiveTimestamp, #time of violation
Resource.labels.service, #protected Google Cloud service being blocked
protopayload_auditlog.methodName, #method name being called
resource.labels.project_id as PROJECT, #protected project blocking the call
protopayload_auditlog.authenticationInfo.principalEmail, #caller identity
protopayload_auditlog.requestMetadata.callerIp, #caller IP
JSON_EXTRACT(protopayload_auditlog.metadataJson, '$.dryRun') as DRYRUN, #dry-run indicator
JSON_EXTRACT(protopayload_auditlog.metadataJson, '$.violationReason') as REASON, #reason for violation
protopayload_auditlog.metadataJson, #raw violation entry
FROM `BQ_DATASOURCE_NAME.cloudaudit_googleapis_com_policy_*`
where JSON_EXTRACT(protopayload_auditlog.metadataJson, '$.dryRun') = "true" #ensure these are dry-run logs

查询相关违规行为

以下政策可帮助您识别相关的违规行为:

  • 针对每个唯一应用执行其使用场景的时间窗口添加一个时间戳限定符:

    WHERE receiveTimestamp >'2020-07-23 19:53:48.241317 UTC'
    
  • 为工作负载身份或项目的命名惯例添加过滤条件:

    WHERE where resource.labels.project_id like '%APPLICATION_NAME%'
    

查看违规日志

在查看违规日志时,请确定是否符合以下所有条件:

  • 预期身份(电子邮件地址)调用受保护的 API 吗?
  • 允许调用者从边界外调用 API 吗?

根据上述条件,确定您是否需要允许身份、设备、IP 地址、CIDR 范围、项目或网络从外部访问边界。

某些条目的 IP 地址可能是 private。这表示调用来自 Google 网络(通过 Google 自己的服务或边界外的项目中的 VPC)。对于日志接收器写入者等 Google 服务,您需要将 Google 服务账号添加到许可名单。

无电子邮件的条目是由于缺少 IAM 权限而被拒绝的只读操作的 Cloud Audit Logs 隐去。在此类情况下,您可以使用 IP 地址和资源名称来了解访问尝试的来源。此类访问尝试可能是组织外部的用户的意外访问。例如,输错了命名类似的存储桶的用户。

如果您看到 SERVICE_NOT_ALLOWED_FROM_VPC 违规类型,则表示工作负载可能正在使用 VPC Service Controls 支持的但未添加到受保护的 API 列表中的服务。例如,如果 IAM 导致此类违规,则管理员应通过运行以下 Google Cloud CLI 命令将 IAM 添加到可访问服务列表中:

gcloud access-context-manager perimeters update perimeter_test \
 --add-vpc-allowed-services=RESTRICTED-SERVICES,IAM.googleapis.com \
 --policy=1234567890

您可以创建 Looker Studio 信息中心来查看违规问题。如需了解详情,请参阅使用 Looker Studio 监控 Google Cloud 组织中的 VPC Service Controls 违规行为。Looker Studio 以前称为数据洞察。

后续步骤