External Exposure サービスを使用して公開されたリソースを検出する

Security Command Center External Exposure は、自動検出とリスク検証を通じて外部の攻撃対象領域を管理および削減するのに役立つ Google Cloud サービスです。

自動スキャナはインターネットに公開されたアセットを数分でターゲットにできるため、External Exposure は、攻撃者が発見して悪用する前に、誤って公開されたリソースやシャドウ リソースをプロアクティブに検出します。

このサービスは、外部の視点から環境を分析することで、インターネットから実際に到達できるものを確認し、実際に悪用可能な公開を特定します。

External Exposure は、環境全体で外部に公開されている IP アドレス、ホスト名、ドメイン名、URL を継続的にスキャンします。 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 の構成など、予防的な軽減策をすぐに適用できます。

  • フィンガープリントを実行して、公開された各アセットで実行されている特定のウェブ アプリケーションまたはサーバー ソフトウェアを特定しようとします。

  • 公開されたサービスまたはソフトウェアを特定できる場合は、そのサービスまたはソフトウェアに影響することがわかっている脆弱性を特定します。

  • 高度なパッシブ検出器とアクティブ検出器を使用して、脆弱性、構成ミス、デフォルトまたは弱い認証情報の使用を検証することで、実際の悪用可能性をテストします。

始める前に

このセクションでは、External Exposure を使用するための環境を準備する方法について説明します。

Security Center Management API を有効にする

Security Command Center API を使用する場合は、割り当てプロジェクトに対して Security Center Management API を有効にする必要があります。また、API の使用を制限する組織のポリシーが使用されている場合は、Security Center Management API が許可されていることを確認してください。Security Center Management API は、External Exposure などの Security Command Center サービスの有効化状態を制御するために使用されます。

  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 ロールを付与するよう管理者に依頼します。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタム ロールや他の事前定義 ロールから取得することもできます。

次の Google Cloud CLI コマンドを使用して、上記のロールをユーザーに割り当てることができます。

gcloud CLI を使用してロールを割り当てる

  • ユーザーに Security Center 管理者のロールを付与するには、次のコマンドを実行します。

    gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
        --member=user:USER_EMAIL_ID \
        --role=roles/securitycenter.admin
    
  • ユーザーに Security Center 管理閲覧者のロールを付与するには、次のコマンドを実行します。

    gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
        --member=user:USER_EMAIL_ID \
        --role=roles/securitycenter.adminViewer
    
  • CLI または API 指標アクセス用の External Exposure 閲覧者ロールをユーザーに付与するには、次のコマンドを実行します。

    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 を使用する場合、プロジェクト レベルではなく フォルダレベルまたは組織レベルで設定を構成するには、すべてのリクエスト URL と JSON データ パラメータで projects/PROJECT_IDfolders/FOLDER_ID または organizations/ORGANIZATION_ID に置き換えます。

External Exposure を有効にする

組織、フォルダ、またはプロジェクトに対して External Exposure を有効にします。

サービスを有効にしたら、 サービス エージェントの権限を付与する サービス エージェントの権限を付与するで説明されているように、サービス エージェントに必要な権限を付与してください。

コンソール

  1. コンソールで、 External Exposure の [サービスの有効化] ページに移動します。 Google Cloud

    [サービスの有効化] に移動

  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 はサービス境界で保護されているプロジェクトのスキャンや検出結果の生成を行うことができません。

サービスが有効になっているリソースレベルに応じて、サービス アカウントの 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: キーワード org または folder
  • RESOURCE_ID: 組織 ID またはフォルダ ID
  • PROJECT_NUMBER: プロジェクト番号

組織レベルとプロジェクト レベルの両方にサービス アカウントがある場合は、両方に次の手順を適用します。

アクセス権を付与するには、ブロックしている各サービス境界に上り(内向き)ルールを追加します。

  1. コンソールで、[VPC Service Controls] ページに移動します。 Google Cloud

    [VPC Service Controls] に移動

  2. ブロックしているアクセス ポリシーとサービス境界を選択します。

  3. [編集]、[上り(内向き)ポリシー] の順にクリックします。

  4. [上り(内向き)ルールを追加] をクリックし、[送信元] ブロックを構成します。

    1. [ID] で、[選択されている ID とグループ] を選択します。
    2. External Exposure サービス アカウントのメールアドレスを入力します。
    3. [ソース] で [すべてのソース] を選択します。
  5. ルールの [宛先] ブロックを構成します。

    1. [**プロジェクト**] で、[**すべてのプロジェクト**] を選択します。
    2. [**オペレーションまたは IAM ロール**] で、[**すべてのオペレーション**] を選択します。
  6. [保存] をクリックします。

カスタムポートを構成する

ベースライン ポートに加えて、スキャンするプロジェクトごとに最大 32 個のカスタムポートを構成します。

コンソール

  1. コンソールで、[サービスの有効化] ページに移動します。 Google Cloud

    [サービスの有効化] に移動

  2. 組織またはプロジェクトを選択します。

  3. 変更する行の [External Exposure] 列で、[設定] をクリックします。

  4. [カスタムポート] フィールドに、カンマ区切りのポート番号を入力します。

  5. [保存] をクリックします。

gcloud

スキャンするカスタムポートを構成するには、updateMaskservice_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

特定のモジュールを有効または無効にするには、updateMaskmodules を含め、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 クラスの検出結果には、次の詳細が含まれます。

  • 公開されたサービス: アクティブなポートで特定された特定のウェブ アプリケーション、サーバー ソフトウェア、または プロトコル。
  • ネットワーク パスの分析情報: パブリック インターネットからロードバランサ、転送ルール、バックエンド サービスを経由してターゲット アセットまでのネットワーク パスのトレース接続。
  • 公開されたエンドポイント: 基盤となるターゲット リソース(たとえば、 Compute Engine インスタンスや Google Kubernetes Engine(GKE)Pod など)。

公開されたサービスまたはソフトウェアのバージョンを特定できる場合、検出結果には、そのサービスまたはソフトウェアに影響する CVE 脆弱性も一覧表示されます。

攻撃の発生可能性スコアで検出結果の優先順位を付ける

External Exposure の検出結果は、攻撃パス シミュレーションと統合され、環境への確認済みの 現実世界の侵入ポイントを提供します。確認済みの公開がラテラル ムーブメントのパス(機密性の高い BigQuery データベースまたは Cloud Storage バケットに到達できる公開されたサービス アカウントなど)に接続されている場合、検出結果には攻撃の発生可能性スコアが割り当てられます。このスコアを使用して、高価値リソースに最も大きなリスクをもたらす公開の修正に優先順位を付けることができます。

スキャン指標をモニタリングする

External Exposure が環境全体で正常に動作していることを確認できるように、コンソールには継続的なバッチ スキャンの指標が表示されます。

  • 前回のスキャン: 最後に完了したスキャン サイクルのタイムスタンプ。 検出結果がリソースの現在のビューを反映していることを確認します。
  • 次のスキャン: 次のスキャン サイクルのスケジュールされた開始時刻。
  • 成功したプロジェクト: 最新のスキャン サイクルで正常に 分析されたプロジェクトの合計数。
  • 除外されたプロジェクト: 組織のポリシーまたは VPC Service Controls の制約により、スキャナがリソースにアクセスできないため スキップされたプロジェクトの合計数。プロジェクトがスキップされると、Security Command Center は SCC_ERROR クラスの検出結果を 1 つ以上生成します。
  • 公開されたリソース: 公開されているリソースとして特定された一意のターゲット リソースの合計数。
  • 公開されたパブリック ポート: 公開されたリソース全体で検出されたアクティブな外部ポートの合計数 。

ログ内のスキャナ トラフィックを特定する

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 は、サービスタイプまたはプロトコルで主にグループ化された、事前定義されたベースラインの一般的なポートで実行されているサービスを自動的にスキャンします。
    • 管理 / シェル: 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 個のカスタムポートを構成できます。詳細については、 カスタムポートを構成するをご覧ください。
  • ネットワーク パスの分析情報: 検出結果には、公開された リソースのネットワーク パスが 1 つ報告されます。
  • ロード バランシングされた VM: 複数の VM インスタンスがロード バランサに接続されている場合、検出結果は VM インスタンスの 1 つに対してのみ報告されます。
  • Cloud Run の検出結果の優先順位付け: Cloud Run デプロイメントにはデフォルトでパブリック URL が割り当てられるため、検出結果は IAM ポリシーと Identity-Aware Proxy(IAP)ポリシーに基づいて評価されます。ワークロードが IAM または IAP で保護されている場合(HTTP 403 Unauthorized レスポンスを返す)、情報ノイズを減らすために検出結果の重大度が LOW に引き下げられます。
  • ネットワーク公開パスの分析情報: External Exposure がプロジェクト レベルで有効になっている場合、検出結果にネットワーク公開 パスの分析情報は含まれません。ネットワーク公開パスの分析情報を受け取るには、組織またはフォルダレベルでサービスを有効にします。