外部公開で公開されたリソースを検出する

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

自動スキャナは数分以内にインターネットに公開されたアセットをターゲットにできるため、External Exposure は、攻撃者が検出して悪用する前に、誤って公開されたアセットとシャドー リソースを事前に検出します。

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

外部公開は、 Google Cloud環境全体で外部に公開されている IP アドレス、ホスト名、ドメイン名、URL を継続的にスキャンします。この機能は、ネットワーク スキャンを使用して、公共のインターネットからアクセス可能なリソースとアプリケーションを確認します。

外部公開ごとに、External Exposure は次の処理を行います。

  • 外部ロードバランサ、Google Cloud Armor ポリシー、ファイアウォール ルール、Private Service Connect、Cloud Interconnect、バックエンド サービスから公開されたリソースまでの Google Cloud ネットワーク パスをトレースして表示します。

    このリソースは、公開されたサービスやアプリケーションを含む Compute Engine インスタンスまたは Google Kubernetes Engine(GKE)Pod にすることができます。

    Google ネットワーキング ファブリックとのこの深い統合により、実用的なコンテキストが提供されるため、特定のファイアウォール ルールのロックダウンや Google Cloud Armor の構成などの予防的な軽減策をすぐに適用できます。

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

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

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

始める前に

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

Security Center Management API を有効にする

Security Command Center API を使用する場合は、割り当てプロジェクトで Security Center Management API を有効にする必要があります。また、API の使用を制限する組織のポリシーが使用されている場合は、Security Center Management API が許可されていることを確認してください。Security Center Management API は、外部公開などの 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. 検出結果でネットワークの公開パスの分析情報を取得する場合は、組織またはフォルダ レベルで外部公開を有効にしてください。

必要なロール

外部公開を構成してダッシュボード データを表示するために必要な権限を取得するには、組織、フォルダ、またはプロジェクトに対する次の 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 の指標にアクセスするユーザーに外部公開閲覧者のロールを付与するには、次のコマンドを実行します。

    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: アクセスが必要なユーザーのメールアドレス

サービスを有効にして構成する

外部公開を有効にして構成するには、次のセクションのタスクを完了します。

このサービスは、組織、フォルダ、プロジェクトのいずれかのレベルで有効にして構成できます。API を使用して、プロジェクト レベルではなくフォルダ レベルまたは組織レベルで設定を構成する場合は、すべてのリクエスト URL と JSON データ パラメータで projects/PROJECT_IDfolders/FOLDER_ID または organizations/ORGANIZATION_ID に置き換えます。

External Exposure を有効にする

組織、フォルダ、またはプロジェクトの外部公開を有効にします。

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

コンソール

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

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

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

  3. [サービスの有効化] タブの [外部公開] 列で、変更する組織、フォルダ、またはプロジェクトの有効化ステータスを選択し、次のいずれかを選択します。

    • 有効にする: 外部公開を有効にします。
    • 無効にする: 外部公開を無効にします。
    • 継承: 子リソースでオーバーライドされていない限り、親リソースから設定を継承します。

gcloud

Security Center Management API を有効にして、ターゲット スコープの外部公開を有効にします。

  1. ターミナルで、割り当てプロジェクトの API を有効にします。

    gcloud services enable securitycentermanagement.googleapis.com \
        --project=QUOTA_PROJECT_ID
    
  2. ターミナルで、Security Center Management API を使用して外部公開を有効にします。

    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: 外部公開を有効にするプロジェクトの 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. Google Cloud コンソールで、[VPC Service Controls] ページに移動します。

    [VPC Service Controls] に移動

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

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

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

    1. [ID] で、[選択した ID とグループ] を選択します。
    2. 外部公開サービス アカウントのメールアドレスを入力します。
    3. [ソース] で [すべてのソース] を選択します。
  5. ルールの [To] ブロックを構成します。

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

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

パフォーマンスと制限事項に記載されている標準ポートに加えて、プロジェクトごとに最大 32 個のカスタムポートをスキャンするように構成します。

コンソール

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

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

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

  3. 変更する行の [外部公開] 列で、[設定] をクリックします。

  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. 変更する行の [外部公開] 列で、[設定] をクリックします。

  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

他のすべての外部公開モジュール(データベース、サーバーレス ワークロード、ロードバランサ ストレージ チェックなど)はデフォルトで有効になっており、モジュール構成ページには表示されません。

外部公開を有効にすると、継続的なバッチスキャンが自動的に実行され、公開されている外部 IP アドレスの特定、実行中のサービスのプローブ、アクティブな脆弱性の検証が行われます。

検出結果を調査する

外部公開を有効にすると、Google Cloud コンソールで検出結果を確認できます。Security Command Center で、[リスクの概要] ページに移動し、[外部公開] ダッシュボードを表示します。このダッシュボードは、スコープが組織、フォルダ、またはプロジェクトに設定されている場合に使用できます。このダッシュボードの詳細については、リスクの概要ダッシュボードを使用してリスクを評価するをご覧ください。

CLI を使用して有効な外部公開の検出結果を取得するには、次のコマンドを実行します。

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 クラスの検出結果には、次の詳細が含まれます。

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

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

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

外部公開の検出結果は、攻撃パス シミュレーションと統合されます。詳細については、攻撃の発生可能性スコアと攻撃パスの概要をご覧ください。確認済みの脆弱性が潜在的なラテラル ムーブメント パス(機密性の高い BigQuery データベースまたは Cloud Storage バケットにアクセスできる公開されたサービス アカウントなど)に接続されている場合、検出には攻撃の脆弱性スコアが割り当てられます。このスコアを使用して、高価値リソースに最も大きなリスクをもたらす脆弱性の修正に優先順位を付けることができます。

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

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

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

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

外部公開が外部向けリソースをアクティブにスキャンすると、Cloud Logging の Cloud Run リクエストログなど、サービスログで受信スキャン リクエストが確認されることがあります。

受信リクエストが不正な第三者ではなく External Exposure から送信されたことを確認するには、httpRequestuserAgent フィールドのログエントリを調べます。サービスからのすべてのアクティブなリクエストは、ユーザー エージェント TsunamiSecurityScanner で識別されます。

次の例は、外部公開が公開された 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。
  • 更新間隔: 外部公開のスキャン頻度については、Security Command Center に検出結果が表示されるタイミングをご覧ください。
  • スキャンされたポート: 外部公開は、サービスタイプまたはプロトコルで主にグループ化された、一般的なポートの事前定義されたベースラインで実行されているサービスを自動的にスキャンします。
    • 管理 / シェル: 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 の未承認レスポンスを返す場合)、情報ノイズを減らすために、検出結果の重大度が LOW に引き下げられます。
  • ネットワークの公開パスの分析情報: 外部公開がプロジェクト レベルで有効になっている場合、検出結果にネットワークの公開パスの分析情報は含まれません。ネットワーク露出パスの分析情報を取得するには、組織レベルまたはフォルダレベルでサービスを有効にします。