Security Command Center External Exposure は、自動検出とリスク検証を通じて外部攻撃対象領域を管理し、縮小するのに役立つ Google Cloud サービスです。
自動スキャナは数分以内にインターネットに公開されたアセットをターゲットにできるため、External Exposure は、攻撃者が検出して悪用する前に、偶発的な公開とシャドー リソースを事前に検出します。
このサービスは、外部の視点から環境を分析し、インターネットから実際にアクセス可能なものを確認し、実際に悪用可能な脆弱性を特定します。
外部公開は、 Google Cloud環境全体で外部に公開されている IP アドレス、ホスト名、ドメイン名、URL を継続的にスキャンします。この機能は、ネットワーク スキャンを使用して、公共のインターネットからアクセス可能なリソースとアプリケーションを確認します。
外部公開ごとに、外部公開は次の処理を行います。
外部ロードバランサ、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 サービスの有効状態を制御するために使用されます。
ターミナルで、割り当てプロジェクトの Security Center Management API を有効にします。
gcloud services enable securitycentermanagement.googleapis.com \ --project=QUOTA_PROJECT_IDQUOTA_PROJECT_ID は、割り当ての管理に使用するプロジェクトの ID に置き換えます。
API の使用を制限する組織のポリシーがある場合は、Security Center Management API が許可されていることを確認してください。詳細については、組織のポリシーを確認するをご覧ください。
検出結果でネットワークの公開パスの分析情報を取得する場合は、組織レベルまたはフォルダレベルで外部公開を有効にしてください。
必要なロール
外部公開を構成してダッシュボード データを表示するために必要な権限を取得するには、組織、フォルダ、またはプロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
Security Command Center で外部公開設定を構成し、ダッシュボード データを表示する: セキュリティ センター管理者 (
roles/securitycenter.admin) -
externalexposure.serviceAgentロールなどのロールをサービス エージェントに付与する: セキュリティ管理者 (roles/iam.securityAdmin) -
サービス アカウントを作成して管理する: サービス アカウント管理者 (
roles/iam.serviceAccountAdmin) -
ダッシュボードのデータのみを表示する: セキュリティ センター管理閲覧者 (
roles/securitycenter.adminViewer) -
コンソール、CLI、API で外部公開ダッシュボードとスキャン指標を表示する: 外部公開閲覧者 (
roles/externalexposure.viewer)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
次の 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.adminViewerCLI または 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_ID を folders/FOLDER_ID または organizations/ORGANIZATION_ID に置き換えます。
External Exposure を有効にする
組織、フォルダ、プロジェクトの外部公開を有効にします。
サービスを有効にした後、サービス エージェントの権限を付与するの説明に従って、サービス エージェントに必要な権限を付与してください。
コンソール
Google Cloud コンソールで、外部公開の [サービスの有効化] ページに移動します。
組織またはプロジェクトを選択します。
[サービスの有効化] タブの [外部公開] 列で、変更する組織、フォルダ、またはプロジェクトの有効化ステータスを選択し、次のいずれかを選択します。
- 有効にする: 外部公開を有効にします。
- 無効にする: 外部公開を無効にします。
- 継承: 子リソースでオーバーライドされていない限り、親リソースから設定を継承します。
gcloud
Security Center Management API を有効にして、ターゲット スコープの外部公開を有効にします。
ターミナルで、割り当てプロジェクトの API を有効にします。
gcloud services enable securitycentermanagement.googleapis.com \ --project=QUOTA_PROJECT_IDターミナルで、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." \
--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 は、サービス境界で保護されているプロジェクトのスキャンを実行したり、検出結果を生成したりできません。
サービスが有効になっているリソースレベルに応じて、サービス アカウントの ID には次のいずれかのメールアドレス形式が使用されます。
組織またはフォルダの場合:
service-RESOURCE_KEYWORD-RESOURCE_ID@gcp-sa-ee-hpsa.プロジェクトの場合:
service-project-PROJECT_NUMBER@gcp-sa-ee.
次のように置き換えます。
RESOURCE_KEYWORD: キーワードorgまたはfolderRESOURCE_ID: 組織 ID またはフォルダ IDPROJECT_NUMBER: プロジェクト番号
組織レベルとプロジェクト レベルの両方にサービス アカウントがある場合は、両方に次の手順を適用します。
アクセスを許可するには、ブロックする各サービス境界に上り(内向き)ルールを追加します。
Google Cloud コンソールで、[VPC Service Controls] ページに移動します。
ブロックするアクセス ポリシーとサービス境界を選択します。
[編集]、[内向きポリシー] の順にクリックします。
[上り(内向き)ルールを追加] をクリックして、[送信元] ブロックを構成します。
- [ID] で、[選択した ID とグループ] を選択します。
- External Exposure サービス アカウントのメールアドレスを入力します。
- [ソース] で [すべてのソース] を選択します。
ルールの [宛先] ブロックを構成します。
- [プロジェクト] で、[すべてのプロジェクト] を選択します。
- [オペレーションまたは IAM ロール] で、[すべてのオペレーション] を選択します。
[保存] をクリックします。
カスタムポートを構成する
パフォーマンスと制限事項に記載されている標準ポートに加えて、プロジェクトごとに最大 32 個のカスタムポートをスキャンするように構成します。
コンソール
Google Cloud コンソールで、[サービスの有効化] ページに移動します。
組織またはプロジェクトを選択します。
変更する行の [外部公開] 列で、[設定] をクリックします。
[カスタムポート] フィールドに、ポート番号をカンマで区切って入力します。
[保存] をクリックします。
gcloud
スキャン用にカスタムポートを構成するには、updateMask に service_config を含め、serviceConfig オブジェクトの ports 配列ラッパーでポートの整数を指定します。次の例では、スキャン用にカスタムポート 8081 と 8188 を構成します。
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。
スキャン モジュールを構成する
特定のスキャン モジュールをオンまたはオフに構成します。
コンソール
Google Cloud コンソールで、[サービスの有効化] ページに移動します。
組織またはプロジェクトを選択します。
変更する行の [外部公開] 列で、[設定] をクリックします。
[スキャン モジュール] セクションで、チェックボックスをオンにして各モジュール(公開されたインターフェース、API、脆弱な認証情報、RCE など)を有効または無効にします。
[保存] をクリックします。
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_UIEXTERNALLY_EXPOSED_APIEXTERNALLY_EXPOSED_WEAK_CREDENTIALSEXTERNALLY_EXPOSED_RCE_VULNERABILITYEXTERNALLY_EXPOSED_ARBITRARY_DATA_READ
他のすべての外部公開モジュール(データベース、サーバーレス ワークロード、ロードバランサ ストレージ チェックなど)はデフォルトで有効になっており、モジュール構成ページには表示されません。
外部公開を有効にすると、継続的なバッチスキャンが自動的に実行され、公開されている外部 IP アドレスの特定、実行中のサービスのプローブ、アクティブな脆弱性の検証が行われます。
検出結果を調査する
外部公開を有効にすると、 Google Cloud コンソールまたは CLI を使用して結果を表示できます。
[検出結果] ページで検出結果を表示する
-
Google Cloud コンソールで、Security Command Center の [検出結果] ページに移動します。
- [外部公開] ビューを選択します。
[外部公開] ビューには、finding_class フィールドが EXTERNAL_EXPOSURE の検出結果のみが表示されます。
外部公開ダッシュボードで検出結果を表示する
外部公開ダッシュボードにアクセスするには、 Google Cloud コンソールで [リスクの概要] > [外部公開] ページに移動します。
このダッシュボードは、スコープが組織、フォルダ、またはプロジェクトに設定されている場合に使用できます。
このダッシュボードの詳細については、リスクの概要ダッシュボードを使用してリスクを評価するをご覧ください。
CLI を使用して検出結果を取得する
CLI を使用して有効な外部公開の検出結果を取得するには、次のコマンドを実行します。
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_INSTANCE や EXTERNALLY_EXPOSED_SERVERLESS_WORKLOAD など)の一覧については、外部公開の検出結果をご覧ください。
EXTERNAL_EXPOSURE クラスのすべての検出結果には、次の詳細が含まれます。
- 公開サービス: アクティブなポートで特定された特定のウェブ アプリケーション、サーバー ソフトウェア、またはプロトコル。
- ネットワーク パスの分析情報: 公共のインターネットからロードバランサ、転送ルール、バックエンド サービスを経由してターゲット アセットまでのネットワーク パスの接続をトレースします。
- 公開エンドポイント: 基盤となるターゲット リソース(Compute Engine インスタンスや Google Kubernetes Engine(GKE)Pod など)。
公開されているサービスまたはソフトウェア バージョンを特定できる場合、検出結果には、それに影響する CVE 脆弱性もリストされます。
攻撃の発生可能性スコアを使用して検出結果の優先順位を付ける
外部公開の検出結果は、攻撃パス シミュレーションと統合されます。詳細については、攻撃の発生可能性スコアと攻撃パスの概要をご覧ください。確認済みの脆弱性が潜在的なラテラル ムーブメント パス(機密性の高い BigQuery データベースまたは Cloud Storage バケットにアクセスできる公開されたサービス アカウントなど)に接続されている場合、検出には攻撃の脆弱性スコアが割り当てられます。このスコアを使用して、高価値リソースに最も大きなリスクをもたらす脆弱性の修正に優先順位を付けることができます。
スキャン指標をモニタリングする
環境全体で External Exposure が正常に動作していることを確認できるように、コンソールには継続的なバッチスキャン指標が表示されます。
- 最終スキャン: 最後に完了したスキャン サイクルのタイムスタンプ。検出結果がリソースの現在のビューを反映していることを確認します。
- 次のスキャン: 次のスキャン サイクルのスケジュールされた開始時刻。
- 成功したプロジェクト: 最新のスキャン サイクルで正常に分析されたプロジェクトの合計数。
- 除外されたプロジェクト: 組織のポリシーまたは VPC Service Controls の制約により、スキャナがリソースにアクセスできないためスキップされたプロジェクトの合計数。プロジェクトがスキップされると、Security Command Center は 1 つ以上の
SCC_ERRORクラスの検出結果を生成します。 - 公開リソース: 一般公開されていると識別された一意のリソース ターゲットの合計数。
- 公開されているパブリック ポート: 公開されているリソース全体で検出された個別のアクティブな外部ポートの合計数。
ログ内のスキャナ トラフィックを特定する
外部公開が外部向けリソースをアクティブにスキャンすると、Cloud Logging の Cloud Run リクエストログなど、サービスログで受信スキャン リクエストが確認されることがあります。
受信リクエストが不正な第三者ではなく External Exposure から送信されたことを確認するには、httpRequest の userAgent フィールドのログエントリを調べます。サービスからのすべてのアクティブなリクエストは、ユーザー エージェント 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"
}
スキャナ リクエストの HTTP ステータス コードについて
外部公開がエンドポイントをプローブすると、リクエストログに HTTP 403 Forbidden または HTTP 401 Unauthorized レスポンスのスパイクが発生することがあります。アクセス制御でエンドポイントを保護しようとすると、この動作が想定されます。
- 認証を必要とするエンドポイント: Identity and Access Management または Identity-Aware Proxy を介して認証を必要とするようにワークロード(Cloud Run や Cloud Run functions など)を構成すると、エンドポイントは、HTTP
403 Forbiddenまたは HTTP401 Unauthorizedレスポンスで、外部公開からの未認証プローブを拒否します。HTTP403レスポンスが返された場合、アクセス制御ポリシーによって不正アクセスが防止されています。 - セキュリティ ポリシーで保護されたエンドポイント: ロードバランサまたはバックエンド サービスで Google Cloud Armor セキュリティ ポリシーまたはウェブ アプリケーション ファイアウォールを使用している場合、拒否ルールに一致するプローブ リクエストは
HTTP 403 Forbiddenレスポンスを返します。
スキャナログのトラブルシューティングの詳細については、TsunamiSecurityScanner からの 403 Forbidden リクエストログの急増をご覧ください。
Cloud Logging でスキャナ トラフィックをクエリする
スキャナ トラフィックを検査またはフィルタリングするには、ログ エクスプローラで次のサンプルクエリを使用します。
スキャナからのすべてのリクエストを検索します。
httpRequest.userAgent="TsunamiSecurityScanner"スキャナから 403 Forbidden レスポンスを見つけます。
httpRequest.userAgent="TsunamiSecurityScanner" AND httpRequest.status=403スキャナ トラフィックを一般的なエラー モニタリングまたはアラート ポリシーから除外します。
NOT httpRequest.userAgent="TsunamiSecurityScanner"
パフォーマンスと制限事項
- サポートされているリソース: 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 インスタンスがロードバランサに接続されている場合、検出結果は 1 つの VM インスタンスに対してのみ報告されます。
- Cloud Run の検出結果の優先度設定: すべての Cloud Run デプロイにはデフォルトでパブリック URL が割り当てられるため、検出結果は IAM ポリシーと Identity-Aware Proxy(IAP)ポリシーに対して評価されます。ワークロードが IAM または IAP によって保護されている場合(HTTP
403 unauthorizedレスポンスを返す場合)、情報ノイズを減らすために、検出結果の重大度がLOWに引き下げられます。 - ネットワークの公開パスの分析情報: 外部公開がプロジェクト レベルで有効になっている場合、検出結果にネットワークの公開パスの分析情報は含まれません。ネットワーク公開パスの分析情報を取得するには、組織レベルまたはフォルダレベルでサービスを有効にします。