使用 External Exposure 服务检测暴露的资源

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

由于自动扫描器可以在几分钟内定位到互联网上公开的资产,因此 External Exposure 会在攻击者发现和利用意外暴露的资产和影子资源之前主动发现这些资产。

通过从外部角度分析您的环境,该服务会尝试确认哪些内容可以从互联网上真正访问,并识别哪些暴露的资产实际上可以被利用。

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

对于每个已确认的暴露资产,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。

所需的角色

如需获得配置 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 信息中心和扫描指标: 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
    
  • 如需向用户授予 External Exposure Viewer 角色以获取 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。
    • 停用:停用 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.iam.gserviceaccount.com" \
    --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.iam.gserviceaccount.com" \
    --role=roles/externalexposure.serviceAgent

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

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

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

根据启用服务的资源级别,服务账号标识符使用以下电子邮件地址格式之一:

  • 对于组织或文件夹:

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

    service-project-PROJECT_NUMBER@gcp-sa-ee.iam.gserviceaccount.com
    

替换以下内容:

  • 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 控制台中查看发现结果。在 Security Command Center 中,前往风险概览 页面并查看 External Exposure 信息中心。当您的范围设置为组织、文件夹或项目时,此信息中心可用。如需详细了解此 信息中心,请参阅快速评估风险 。

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

gcloud alpha 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 发现结果

所有 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 而不是未经授权的第三方,请检查 httpRequestuserAgent 字段的日志条目。来自该服务的所有活跃请求都会使用用户代理 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 部署默认都会收到一个公共网址, 因此系统会根据 IAM 和 Identity-Aware Proxy (IAP) 政策评估发现结果。如果工作负载受到 IAM 或 IAP 的保护(返回 HTTP 403 未经授权的响应),则发现结果严重程度会降级为 LOW,以减少信息噪音。
  • 网络暴露路径数据分析:当在项目级层激活 External Exposure 时,发现结果不包含网络暴露 路径数据分析。如需接收网络暴露路径数据分析,请在组织或文件夹级层激活该服务。