使用“对外暴露”功能检测暴露的资源

Security Command Center External Exposure 是一项 Google Cloud 服务,可帮助您通过自动发现和风险验证来管理和缩小外部攻击面。

由于自动化扫描器可以在几分钟内锁定暴露在互联网上的资产,因此 External Exposure 可以主动发现意外暴露的资产和影子资源,防止攻击者发现并利用这些资产和资源。

该服务会从外部角度分析您的环境,尝试确认哪些内容确实可通过互联网访问,并确定哪些漏洞实际上可被利用。

External Exposure 会持续扫描整个 Google Cloud环境中的面向外部的 IP 地址、主机名、域名和网址。此功能使用网络扫描来确认哪些资源和应用可从公共互联网访问。

对于每次确认的曝光,External Exposure 都会执行以下操作:

  • 跟踪并显示外部负载平衡器、Google Cloud Armor 政策、防火墙规则、Private Service Connect、Cloud Interconnect 和后端服务(直至公开的资源)的 Google Cloud 网络路径。

    此资源可以是 Compute Engine 实例或 Google Kubernetes Engine (GKE) Pod,包括公开的服务或应用。

    这种与 Google 网络结构的深度集成有助于提供可据以采取行动的背景信息,以便您立即应用预防性缓解措施,例如锁定特定防火墙规则或配置 Google Cloud Armor。

  • 执行指纹识别,以尝试识别每个公开资产上运行的特定 Web 应用或服务器软件。

  • 如果可以识别公开的服务或软件,则会识别已知会影响它的任何漏洞。

  • 使用先进的被动和主动检测器,通过验证漏洞、错误配置以及默认或弱凭据的使用情况,测试实际可利用性。

准备工作

本部分介绍了如何准备环境以使用 External Exposure。

启用 Security Center Management API

如果您计划使用 Security Command Center API,则必须为配额项目启用 Security Center Management API,并且如果组织政策限制了 API 使用,请确保允许使用 Security Center Management API。Security Center Management API 用于控制 Security Command Center 服务(例如 External Exposure)的启用状态。

  1. 在终端中,为您的配额项目启用 Security Center Management API:

    gcloud services enable securitycentermanagement.googleapis.com \
        --project=QUOTA_PROJECT_ID
    

    QUOTA_PROJECT_ID 替换为您用于管理配额的项目的 ID。

  2. 如果您有组织政策限制 API 使用,请确保允许使用 Security Center Management API。如需了解详情,请参阅查看组织政策

  3. 如果您希望在发现结果中接收网络暴露路径分析洞见,请确保在组织级层或文件夹级层启用“External Exposure”。

所需的角色

如需获得配置外部公开范围和查看信息中心数据所需的权限,请让您的管理员为您授予组织、文件夹或项目的以下 IAM 角色:

  • 在 Security Command Center 中配置 External Exposure 设置并查看信息中心数据:Security Center Admin (roles/securitycenter.admin)
  • 向服务代理授予角色,例如 externalexposure.serviceAgent 角色: Security Admin (roles/iam.securityAdmin)
  • 创建和管理服务账号:Service Account Admin (roles/iam.serviceAccountAdmin)
  • 仅查看信息中心数据:Security Center Admin Viewer (roles/securitycenter.adminViewer)
  • 在控制台、CLI 或 API 中查看“外部暴露”信息中心和扫描指标:External Exposure Viewer (roles/externalexposure.viewer)

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

以下 Google Cloud CLI 命令可用于为用户分配上述角色:

使用 gcloud CLI 分配角色

  • 如需向用户授予 Security Center Admin 角色,请运行以下命令:

    gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
        --member=user:USER_EMAIL_ID \
        --role=roles/securitycenter.admin
    
  • 如需向用户授予 Security Center Admin Viewer 角色,请运行以下命令:

    gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
        --member=user:USER_EMAIL_ID \
        --role=roles/securitycenter.adminViewer
    
  • 如需向用户授予“外部暴露情况查看者”角色,以便其通过 CLI 或 API 访问指标,请运行以下命令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=user:USER_EMAIL_ID \
        --role=roles/externalexposure.viewer
    

    替换以下内容:

    • ORGANIZATION_ID:组织的数字 ID
    • PROJECT_ID:项目 ID
    • USER_EMAIL_ID:需要访问权限的用户的邮箱

启用和配置服务

如需启用和配置 External Exposure,请完成以下部分中的任务。

您可以在组织、文件夹或项目级层启用和配置该服务。使用 API 时,如果您想在文件夹或组织级配置设置,而不是在项目级配置设置,请将所有请求网址和 JSON 数据参数中的 projects/PROJECT_ID 替换为 folders/FOLDER_IDorganizations/ORGANIZATION_ID

激活 External Exposure

为组织、文件夹或项目启用 External Exposure。

激活服务后,请务必按照授予服务代理权限中的说明向服务代理授予所需权限。

控制台

  1. 在 Google Cloud 控制台中,前往“External Exposure”的服务启用页面。

    前往“服务启用”

  2. 选择您的组织或项目。

  3. 服务启用标签页的外部暴露列中,选择您要修改的组织、文件夹或项目的启用状态,然后选择以下一项:

    • 启用:启用 External Exposure。
    • 停用:停用 External Exposure。
    • 继承:继承父资源的设置,除非在子资源中被覆盖。

gcloud

启用 Security Center Management API,并为目标范围激活 External Exposure。

  1. 在终端中,为配额项目启用 API:

    gcloud services enable securitycentermanagement.googleapis.com \
        --project=QUOTA_PROJECT_ID
    
  2. 在终端中,使用 Security Center Management API 启用 External Exposure:

    curl --request PATCH \
      "https://securitycentermanagement.googleapis.com/v1/projects/PROJECT_ID/locations/global/securityCenterServices/external_exposure?updateMask=intended_enablement_state" \
      --header "Authorization: Bearer $(gcloud auth print-access-token)" \
      --header "X-Goog-User-Project: QUOTA_PROJECT_ID" \
      --header "Accept: application/json" \
      --header "Content-Type: application/json" \
      --data '{
        "intendedEnablementState": "ENABLED",
        "name": "projects/PROJECT_ID/locations/global/securityCenterServices/external_exposure"
      }' \
      --compressed
    

    替换以下内容:

    • QUOTA_PROJECT_ID:用于管理配额的项目的 ID。
    • PROJECT_ID:您要启用 External Exposure 的项目的 ID。

授予服务代理权限

根据您启用服务的资源级别, Google Cloud会生成服务代理:

  • 组织或文件夹级:系统会创建组织级或文件夹级服务代理。
  • 项目级:系统会创建项目级服务代理。

如需在组织级层授予权限,请在终端中运行以下 gcloud 命令:

gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
    --member="serviceAccount:service-org-ORGANIZATION_ID@gcp-sa-ee-hpsa." \
    --role=roles/externalexposure.serviceAgent

ORGANIZATION_ID 替换为您的组织的数字 ID。

如需在文件夹级层授予权限,请在终端中运行以下 gcloud 命令:

gcloud resource-manager folders add-iam-policy-binding FOLDER_ID \
    --member="serviceAccount:service-folder-FOLDER_ID@gcp-sa-ee-hpsa." \
    --role=roles/externalexposure.serviceAgent

FOLDER_ID 替换为您的文件夹的数字 ID。

授予对服务边界的入站访问权限

如果您使用 VPC Service Controls,请向外部暴露服务代理授予对任何保护您要扫描的项目的服务边界的入站访问权限。如果您不授予入站访问权限,External Exposure 将无法对受服务边界保护的项目执行扫描或生成检测结果。

服务账号标识符采用以下电子邮件地址格式之一,具体取决于启用服务的资源级别:

  • 对于组织或文件夹:

    service-RESOURCE_KEYWORD-RESOURCE_ID@gcp-sa-ee-hpsa.
    
  • 对于项目:

    service-project-PROJECT_NUMBER@gcp-sa-ee.
    

替换以下内容:

  • RESOURCE_KEYWORD:关键字 orgfolder
  • RESOURCE_ID:组织 ID 或文件夹 ID
  • PROJECT_NUMBER:项目编号

如果您同时拥有组织级和项目级服务账号,请对这两个服务账号应用以下步骤。

如需授予访问权限,请向每个屏蔽服务边界添加一条入站规则:

  1. 在 Google Cloud 控制台中,前往 VPC Service Controls 页面:

    前往 VPC Service Controls

  2. 选择阻止访问的访问权限政策和服务边界。

  3. 依次点击修改入站流量政策

  4. 点击添加入站流量规则,然后配置来源块:

    1. 身份部分,选择选定的身份和群组
    2. 输入 External Exposure 服务账号的电子邮件地址。
    3. 来源部分,选择所有来源
  5. 配置规则的收件人块:

    1. 对于项目,选择所有项目
    2. 对于操作或 IAM 角色,请选择所有操作
  6. 点击保存

配置自定义端口

除了性能和限制中列出的标准端口之外,您还可以为每个项目配置最多 32 个自定义端口以供扫描:

控制台

  1. 在 Google Cloud 控制台中,前往服务启用页面:

    前往“服务启用”

  2. 选择您的组织或项目。

  3. 在要修改的行中的External Exposure列中,点击设置

  4. 自定义端口字段中,输入以英文逗号分隔的端口号。

  5. 点击保存

gcloud

如需配置用于扫描的自定义端口,请在 updateMask 中添加 service_config,并在 serviceConfig 对象下的 ports 数组封装容器中指定端口整数。以下示例配置了用于扫描的自定义端口 80818188

curl --request PATCH \
  "https://securitycentermanagement.googleapis.com/v1/projects/PROJECT_ID/locations/global/securityCenterServices/external_exposure?updateMask=service_config" \
  --header "Authorization: Bearer $(gcloud auth print-access-token)" \
  --header "X-Goog-User-Project: QUOTA_PROJECT_ID" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data '{
    "serviceConfig": {
      "ports": [8081, 8188]
    },
    "name": "projects/PROJECT_ID/locations/global/securityCenterServices/external_exposure"
  }' \
  --compressed

替换以下内容:

  • QUOTA_PROJECT_ID:用于管理配额的项目的 ID。
  • PROJECT_ID:您要在其中配置自定义端口的项目的 ID。

配置扫描模块

配置要开启或关闭的特定扫描模块:

控制台

  1. 在 Google Cloud 控制台中,前往服务启用页面:

    前往“服务启用”

  2. 选择您的组织或项目。

  3. 在要修改的行中的External Exposure列中,点击设置

  4. 扫描模块部分中,选中复选框可启用或停用每个模块(例如公开的接口、API、弱凭据或 RCE)。

  5. 点击保存

gcloud

如需启用或停用特定模块,请在 updateMask 中添加 modules,并在 modules 对象中指定每个模块的启用状态。以下示例启用了 EXTERNALLY_EXPOSED_RCE_VULNERABILITY 并停用了 EXTERNALLY_EXPOSED_WEAK_CREDENTIALS

curl --request PATCH \
  "https://securitycentermanagement.googleapis.com/v1/projects/PROJECT_ID/locations/global/securityCenterServices/external_exposure?updateMask=modules" \
  --header "Authorization: Bearer $(gcloud auth print-access-token)" \
  --header "X-Goog-User-Project: QUOTA_PROJECT_ID" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data '{
    "modules": {
      "EXTERNALLY_EXPOSED_RCE_VULNERABILITY": {
        "intendedEnablementState": "ENABLED"
      },
      "EXTERNALLY_EXPOSED_WEAK_CREDENTIALS": {
        "intendedEnablementState": "DISABLED"
      }
    },
    "name": "projects/PROJECT_ID/locations/global/securityCenterServices/external_exposure"
  }' \
  --compressed

替换以下内容:

  • QUOTA_PROJECT_ID:用于管理配额的项目的 ID。
  • PROJECT_ID:您要配置模块的项目的 ID。

您只能为以下模块配置启用状态:

  • EXTERNALLY_EXPOSED_UI
  • EXTERNALLY_EXPOSED_API
  • EXTERNALLY_EXPOSED_WEAK_CREDENTIALS
  • EXTERNALLY_EXPOSED_RCE_VULNERABILITY
  • EXTERNALLY_EXPOSED_ARBITRARY_DATA_READ

所有其他 External Exposure 模块(包括数据库、无服务器工作负载和负载均衡器存储空间检查)默认处于启用状态,不会显示在模块配置页面上。

启用 External Exposure 后,系统会自动运行持续的批处理扫描,以识别暴露的外部 IP 地址、探测正在运行的服务并验证活跃的漏洞。

调查发现结果

启用 External Exposure 后,您可以在 Google Cloud 控制台中或使用 CLI 查看发现结果。

在“发现结果”页面上查看发现结果

  1. 在 Google Cloud 控制台中,前往 Security Command Center 的发现结果页面。

    前往“发现结果”

  2. 选择External Exposure视图。

External Exposure视图仅显示 finding_class 字段为 EXTERNAL_EXPOSURE 的发现结果。

在“External Exposure”信息中心内查看发现结果

如需访问“外部暴露”信息中心,请在 Google Cloud 控制台中依次前往风险概览 > 外部暴露页面:

前往“External Exposure”

当您的范围设置为组织、文件夹或项目时,此信息中心可用。

如需详细了解此信息中心,请参阅使用“风险概览”信息中心评估风险

使用 CLI 获取发现结果

如需使用 CLI 获取有效的 External Exposure 发现结果,请运行以下命令:

gcloud scc findings list projects/PROJECT_ID \
    --location=global \
    --filter="state=\"ACTIVE\" AND finding_class=\"EXTERNAL_EXPOSURE\""

PROJECT_ID 替换为您要查看检测结果的项目的 ID。

了解发现结果详情

属于 EXTERNAL_EXPOSURE 类的发现结果会指明风险类型以及资源暴露的方式。

如需查看针对这些发现结果生成的精细风险类别(例如 EXTERNALLY_EXPOSED_VM_INSTANCEEXTERNALLY_EXPOSED_SERVERLESS_WORKLOAD)的列表,请参阅外部暴露发现结果

所有 EXTERNAL_EXPOSURE 类发现结果都包含以下详细信息:

  • 公开的服务:在有效端口上识别出的特定 Web 应用、服务器软件或协议。
  • 网络路径洞见:网络路径跟踪从公共互联网通过负载平衡器、转发规则和后端服务到目标资产的连接。
  • 公开的端点:底层目标资源(例如,Compute Engine 实例或 Google Kubernetes Engine (GKE) Pod)。

如果可以确定公开的服务或软件版本,发现结果还会列出影响该服务或软件版本的任何 CVE 漏洞。

根据攻击风险得分确定发现结果的优先级

External Exposure 发现结果与攻击路径模拟相集成。如需了解详情,请参阅攻击风险得分和攻击路径概览。当确认的暴露与潜在的横向移动路径(例如,可访问敏感 BigQuery 数据库或 Cloud Storage 存储桶的暴露的服务账号)相关联时,相应发现结果会获得攻击暴露评分。您可以使用此得分来确定修复优先级,优先修复对高价值资源构成最大风险的暴露。

监控扫描指标

为帮助您确认 External Exposure 在整个环境中正常运行,控制台会显示持续的批量扫描指标:

  • 上次扫描时间:最近一次完成扫描周期的时间戳,用于确认发现结果反映的是资源的当前视图。
  • 下一次扫描:后续扫描周期的预定开始时间。
  • 成功分析的项目:在最新扫描周期内成功分析的项目总数。
  • 排除的项目:由于组织政策或 VPC Service Controls 限制,扫描器无法访问资源,因此跳过的项目总数。如果跳过某个项目,Security Command Center 会生成一个或多个 SCC_ERROR 类别的发现结果。
  • 公开的资源:被标识为可公开访问的唯一资源目标的总数。
  • 暴露的公共端口:在暴露的资源中检测到的不同有效外部端口的总数。

确定日志中的扫描器流量

当 External Exposure 主动扫描面向外部的资源时,您可能会在服务日志(例如 Cloud Logging 中的 Cloud Run 请求日志)中看到传入的扫描请求。

如需验证传入的请求是否来自 External Exposure,而不是未经授权的第三方,请检查 httpRequest 下的 userAgent 字段对应的日志条目。来自服务的所有有效请求都使用用户代理 TsunamiSecurityScanner 来标识自己。

以下示例展示了当 External Exposure 扫描已暴露的 Cloud Run 服务时生成的 Cloud Logging 请求日志条目:

{
  "httpRequest": {
    "latency": "0.004745622s",
    "protocol": "HTTP/1.1",
    "remoteIp": "2600:1900:4180:5b2:0:1ae::",
    "requestMethod": "POST",
    "requestSize": "441",
    "requestUrl": "https://SERVICE_URL/mcp",
    "responseSize": "131",
    "serverIp": "2600:1900:4244:200::",
    "status": 405,
    "userAgent": "TsunamiSecurityScanner"
  },
  "insertId": "6a16af86000c7e0d0fdc1c58",
  "labels": {
    "goog-managed-by": "cloudfunctions",
    "goog-serve-source": "user-container"
  },
  "logName": "projects/PROJECT_ID/logs/run.googleapis.com%2Frequests",
  "receiveTimestamp": "2026-05-27T08:47:03.025492782Z",
  "resource": {
    "labels": {
      "configuration_name": "SERVICE_NAME",
      "location": "us-central1",
      "project_id": "PROJECT_ID",
      "revision_name": "REVISION_NAME",
      "service_name": "SERVICE_NAME"
    },
    "type": "cloud_run_revision"
  },
  "severity": "WARNING",
  "timestamp": "2026-05-27T08:47:02.811254Z"
}

性能和限制

  • 支持的资源:Compute Engine 实例、Google Kubernetes Engine (GKE) 服务和 Ingress 控制器、数据库(包括 Cloud SQL 和 AlloyDB for PostgreSQL)、Managed Service for Apache Spark 集群、Cloud Run、Cloud Storage 和 Gemini Enterprise Agent Platform Workbench。
  • 刷新间隔:如需了解 External Exposure 的扫描频率,请参阅何时会在 Security Command Center 中看到发现结果
  • 扫描的端口:External Exposure 会自动扫描在预定义的常见端口基准上运行的服务,这些端口主要按服务类型或协议分组:
    • 管理 / shell:22 (SSH)、23 (Telnet)、3389 (RDP)
    • Web / HTTP(S):80、443、8000、8080、8081、8443、8800、9000、9443
    • 数据库:1433、1521、3306、5432、9200、11211、27017、6379
    • Kubernetes 和服务网关:6443、10250、10255、15020、15021
    • 其他常见的开发者工具和服务:1099、1880、2323、2375、2376、2379、2746、3000、3100、4040、5000、5173、5678、6006、6274、7001、7002、7077、7860、8001、8042、8083、8088、8090、8111、8123、8153、8154、8188、8265、8500、8501、8787、8888、8890、8983、9001、9010、9090、9091、9092、9100、9870、9876、11434、15672、18080、54321 和 61616。
  • 自定义端口:除了标准端口之外,您还可以为每个项目配置最多 32 个自定义端口以进行扫描。如需了解详情,请参阅配置自定义端口
  • 网络路径分析洞见:发现报告会针对公开的资源报告一条网络路径。
  • 经过负载均衡的虚拟机:如果多个虚拟机实例连接到负载平衡器,则系统只会针对其中一个虚拟机实例报告检测结果。
  • Cloud Run 发现结果优先级划分:由于每个 Cloud Run Deployment 默认都会获得一个公共网址,因此系统会根据 IAM 和 Identity-Aware Proxy (IAP) 政策评估发现结果。如果工作负载受到 IAM 或 IAP 的保护(返回 HTTP 403 未经授权的响应),则发现的严重程度会降级为 LOW,以减少信息噪音。
  • 网络暴露路径分析洞见:当在项目级层激活“External Exposure”时,发现结果不包含网络暴露路径分析洞见。如需接收网络暴露路径数据洞见,请在组织或文件夹级层激活该服务。