使用 External Exposure 服務偵測外洩資源

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。

  • 執行指紋辨識,嘗試找出每個公開資產上執行的特定網頁應用程式或伺服器軟體。

  • 如果可以識別公開的服務或軟體,就會找出已知會影響該服務或軟體的任何安全漏洞。

  • 使用進階被動和主動偵測工具,測試實際的攻擊可能性,方法是驗證安全漏洞、錯誤設定,以及使用預設或弱密碼。

事前準備

本節說明如何準備環境,以使用 External Exposure。

啟用 Security Center Management API

如要使用 Security Command Center API,請務必為配額專案啟用 Security Center Management API,並確認允許使用 Security Center Management API (如果使用會限制 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 設定,並查看資訊主頁資料: 安全中心管理員 (roles/securitycenter.admin)
  • 將角色授予服務代理,例如 externalexposure.serviceAgent 角色: 安全管理員 (roles/iam.securityAdmin)
  • 建立及管理服務帳戶: 服務帳戶管理員 (roles/iam.serviceAccountAdmin)
  • 僅查看資訊主頁資料: 安全中心管理員檢視者 (roles/securitycenter.adminViewer)
  • 在控制台、CLI 或 API 中查看 External Exposure 資訊主頁和掃描指標: External Exposure 檢視者 (roles/externalexposure.viewer)

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

您可以使用下列 Google Cloud CLI 指令,將上述角色指派給使用者:

使用 gcloud CLI 指派角色

  • 如要將安全中心管理員角色授予使用者,請執行下列指令:

    gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
        --member=user:USER_EMAIL_ID \
        --role=roles/securitycenter.admin
    
  • 如要將安全中心管理員檢視者角色授予使用者,請執行下列指令:

    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 控制台的「Service Enablement」(啟用服務) External Exposure頁面。

    前往「Service Enablement」(服務啟用)

  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.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。

授予 service perimeter 的連入存取權

如果您使用 VPC Service Controls,請授予 External Exposure 服務代理程式對任何服務範圍的連入存取權,以保護您要掃描的專案。如未授予輸入存取權,External Exposure 就無法掃描受服務範圍保護的專案,也無法產生相關發現。

視啟用服務的資源層級而定,服務帳戶 ID 會採用下列其中一種電子郵件地址格式:

  • 機構或資料夾:

    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. 按一下「Add ingress rule」(新增輸入規則),然後設定「From」(來源) 區塊:

    1. 在「身分」部分,選取「特定身分和群組」
    2. 輸入外部曝光服務帳戶的電子郵件地址。
    3. 在「來源」部分,選取「所有來源」
  5. 設定規則的「收件者」區塊:

    1. 在「Project」(專案) 部分,選取「All projects」(所有專案)
    2. 在「作業或 IAM 角色」中,選取「所有作業」
  6. 按一下 [儲存]

設定自訂通訊埠

每個專案最多可設定 32 個自訂通訊埠,除了基準通訊埠外,這些通訊埠也會接受掃描:

控制台

  1. 前往 Google Cloud 控制台的「Service Enablement」頁面:

    前往「Service Enablement」(服務啟用)

  2. 選取您的機構或專案。

  3. 在要修改的列中,點選「外部曝光」欄的「設定」

  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 控制台的「Service Enablement」頁面:

    前往「Service Enablement」(服務啟用)

  2. 選取您的機構或專案。

  3. 在要修改的列中,點選「外部曝光」欄的「設定」

  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 模組 (包括資料庫、無伺服器工作負載和負載平衡器儲存空間檢查) 預設為啟用,不會顯示在模組設定頁面。

啟用「外部曝光」後,系統會自動持續執行批次掃描,找出曝光的外部 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 類別的發現項目都包含下列詳細資料:

  • 公開服務:在有效通訊埠上識別出的特定網頁應用程式、伺服器軟體或通訊協定。
  • 網路路徑洞察資料:追蹤從公用網際網路到目標資產的網路路徑連線,包括負載平衡器、轉送規則和後端服務。
  • 公開端點:基礎目標資源 (例如 Compute Engine 執行個體或 Google Kubernetes Engine (GKE) Pod)。

如果可以識別公開的服務或軟體版本,這項發現項目也會列出影響該服務或軟體版本的任何 CVE 安全漏洞。

根據受攻擊風險分數決定發現項目的優先順序

External Exposure 調查結果會與攻擊路徑模擬整合,協助您找出環境中已確認的實際進入點。如果確認的曝險與潛在的橫向移動路徑有關 (例如,可存取機密 BigQuery 資料庫或 Cloud Storage bucket 的曝險服務帳戶),這項發現就會獲得攻擊曝險分數。您可以根據這項分數,優先修正對高價值資源造成最大風險的曝險。

監控掃描指標

為協助您確認 External Exposure 在環境中運作正常,控制台會持續顯示批次掃描指標:

  • 上次掃描時間:最近一次完成掃描週期的時間戳記, 確認發現項目反映了資源的目前狀態。
  • 下次掃描:下一個掃描週期的排定開始時間。
  • 成功專案:在最近的掃描週期中,成功分析的專案總數。
  • 排除的專案:由於組織政策或 VPC Service Controls 限制掃描器存取資源,因此系統略過的專案總數。如果專案遭到略過,Security Command Center 會產生一或多個 SCC_ERROR 類別的發現項目。
  • 公開資源:識別為可公開存取的不重複資源目標總數。
  • 洩露的公開通訊埠:在洩露的資源中偵測到的不同有效外部通訊埠總數。

在記錄中找出掃描器流量

當 External Exposure 主動掃描對外資源時,您可能會在服務記錄中看到傳入的掃描要求,例如 Cloud Logging 中的 Cloud Run 要求記錄。

如要確認傳入的要求來自 External Exposure,而非未經授權的第三方,請檢查 httpRequest 下的 userAgent 欄位記錄項目。服務的所有有效要求都會使用使用者代理程式 TsunamiSecurityScanner 識別自身。

以下範例顯示 Cloud Logging 要求記錄項目,這是指 External Exposure 掃描暴露的 Cloud Run 服務時所產生:

{
  "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 會自動掃描在預先定義的常見連接埠基準上執行的服務,主要依服務類型或通訊協定分組:
    • 管理 / 殼層:22 (SSH)、23 (Telnet)、3389 (RDP)
    • 網頁 / 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 個自訂通訊埠進行掃描。詳情請參閱「設定自訂連接埠」。
  • 網路路徑洞察資料:調查結果會針對公開資源回報一條網路路徑。
  • 負載平衡 VM:如果多個 VM 執行個體連線至負載平衡器,系統只會針對其中一個 VM 執行個體回報結果。
  • Cloud Run 發現項目優先順序:由於每個 Cloud Run 部署作業預設都會收到公開網址,因此系統會根據 IAM 和 Identity-Aware Proxy (IAP) 政策評估發現項目。如果工作負載受到 IAM 或 IAP 保護 (傳回 HTTP 403 未經授權的回應),為減少資訊干擾,發現項目嚴重程度會降級為 LOW
  • 網路曝光路徑深入分析:如果專案層級已啟用 External Exposure,則調查結果不會包含網路曝光路徑深入分析。如要接收網路曝光路徑深入分析資訊,請在機構或資料夾層級啟用這項服務。