ネットワーク依存関係を分析する

このページでは、Migration Center でネットワーク依存関係レポートを生成して分析する方法について説明します。

概要

ネットワーク依存関係レポートには、サーバーとデータベースへの接続に関する日次集計データが表示されます。ネットワーク依存関係レポートでは、インフラストラクチャ内のアセットへのすべての接続と、1 日あたりの接続数を確認できます。

ネットワーク依存関係のデータを収集するには、ディスカバリー クライアントを数日間実行し、Migration Center とのデータ同期を有効にします。ディスカバリー クライアントは、スキャンされたアセットからすべてのネットワーク接続を識別します。接続のターゲット アセットは、ディスカバリー クライアントで検出されたアセット、手動でインポートされたアセット、不明なアセットなど、Migration Center インベントリ内の任意のアセットにできます。

ネットワーク依存関係レポートは、次のようなシナリオで役立ちます。

  • サーバーやデータベースへの接続に関するデータを収集して、同じアプリケーションに属するアセットを特定する
  • MySQL 標準ポートを使用するすべてのサーバーなど、アセットのグループ内で関心のあるネットワーク接続を特定する
  • インベントリで不足しているアセットを特定する

ネットワーク依存関係レポートは、Migration Center から CSV ファイルとしてダウンロードできます。その後、BigQuery や Migration Center が提供するサンプルクエリを使用して分析を行うか、他のサードパーティ ツールを使用します。

制限事項

  • インフラストラクチャの接続データを収集するには、ディスカバリー クライアントを使用します。
  • ネットワーク接続データは、OS スキャン方法でのみ収集されます。vSphere スキャンは、ネットワーク データの収集をサポートしていません。

始める前に

  • ネットワーク依存関係レポートを作成する前に、ディスカバリー クライアントで動作するパフォーマンス コレクションが必要です。

  • BigQuery でネットワーク依存関係レポートを分析する前に、次の操作を行います。

ネットワーク依存関係レポートを生成する

ネットワーク依存関係レポートを生成する手順は次のとおりです。

  1. Google Cloud コンソールで、[レポートの作成] ページに移動します。

    [レポートの作成] に移動

  2. [ネットワーク依存関係のエクスポート] をクリックします。

  3. グループのリストから、レポートを生成するグループを選択して、[エクスポート] をクリックします。

  4. 表示されたダイアログで、データをエクスポートする日数(最小 10 日、最大 90 日)を選択し、[エクスポート] をクリックします。

  5. ファイルが生成されたら、[ダウンロード] をクリックします。

BigQuery でネットワーク依存関係レポートを分析する

以降のセクションでは、BigQuery で一般的なシナリオを分析するためのサンプルクエリを示します。クエリを実行する前に、CSV ファイルを BigQuery にアップロードする必要があります。

BigQuery を使用する場合は、BigQuery の料金に基づいて課金されます。

接続数の多いアセットを特定する

次のクエリは、グループ内で接続数が最も多いアセットを特定する場合に役立ちます。

SELECT
 LocalVMName, SUM(ConnectionCount) as TotalCount
FROM
 PROJECT.DATASET.TABLE
GROUP BY ALL
ORDER BY TotalCount DESC

以下を置き換えます。

  • PROJECT: CSV ファイルをアップロードした Google Cloud プロジェクト。
  • DATASET: BigQuery データセット
  • TABLE: BigQuery テーブル

このクエリの出力例を次に示します。

LocalVMName TotalCount
VM-x5ua3o2w 9970
VM-glg5np3w 9763
VM-q3z4zfp8 9557
VM-2nnsrt37 9372
VM-1oah56hn 9350

グラフの深さで接続を特定する

次のクエリは、特定の個数の中間接続で特定のアセットに接続するすべてのアセットを特定する場合に役立ちます。次に例を示します。

  • グラフの深さが 1 の場合、メインアセットに直接接続されているすべてのアセットが見つかります。
  • グラフの深度が 2 の場合、他のアセットに直接接続しているすべてのアセット(メインアセットに直接接続されているアセット)が見つかります。
DECLARE
 local_vm_name STRING DEFAULT MAIN_ASSET;
DECLARE
 depth INT64 DEFAULT DEPTH;
CREATE TEMP FUNCTION
 recursiveConnections(localVmName STRING,
   connectionsArray ARRAY<STRING>,
   depth INT64)
 RETURNS STRING
 LANGUAGE js AS r"""
 const connections = connectionsArray.map(connection => connection.split('|||'))
   .filter(connectionTuple => connectionTuple[1] !== 'Unscanned Device');
 const connectedAssets = new Set([localVmName]);
 for (let i = 0; i < depth; i++) {
   const currentSet = new Set(connectedAssets);
   for (const connection of connections) {
     /* Look for connections where the asset is the local asset */
     if (currentSet.has(connection[0])) {
       connectedAssets.add(connection[1]);
     }
     /* Look for connections where the asset is the remote asset */
     if (currentSet.has(connection[1])) {
       connectedAssets.add(connection[0]);
     }
   }
 }
 connectedAssets.delete(localVmName);
 return Array.from(connectedAssets).sort().join(', ');
""";
SELECT
 local_vm_name AS LocalVMName,
 recursiveConnections(local_vm_name,
   ARRAY_AGG(CONCAT(LocalVMName, '|||', RemoteVMName)),
   depth) AS Connections
FROM
 PROJECT.DATASET.TABLE

以下を置き換えます。

  • MAIN_ASSET: 接続を識別するアセットの名前。
  • DEPTH: グラフの深さ。

このクエリの出力例を次に示します。

LocalVMName 接続
VM-lv8s148f VM-2z8wp3ey、
VM-66rq2x2y、
VM-94uwyy8h、
VM-ccgmqqmb、
VM-ctqddf0u、
VM-og4n77lb、
...

IP 範囲とポート範囲で接続をフィルタする

次のクエリを使用すると、定義した範囲内の IP アドレスとポートを使用するアセットを特定できます。

CREATE TEMP FUNCTION
 ipBetween(value STRING,
   low STRING,
   high STRING) AS ( NET.IPV4_TO_INT64(NET.IP_FROM_STRING(value)) BETWEEN NET.IPV4_TO_INT64(NET.IP_FROM_STRING(low))
   AND NET.IPV4_TO_INT64(NET.IP_FROM_STRING(high)) );
SELECT
 *
FROM
 PROJECT.DATASET.TABLE
WHERE
 ((LocalPort BETWEEN PORT_START
     AND PORT_END)
   OR (RemotePort BETWEEN PORT_START
     AND PORT_END))
 AND (ipBetween(LocalIP,
     IP_START,
     IP_END)
   OR ipBetween(RemoteIP,
     IP_START,
     IP_END))

以下を置き換えます。

  • PORT_START: ポート範囲の最初のポート(0 など)。
  • PORT_END: ポート範囲の最終ポート(例: 1024)。
  • IP_START: 範囲内の最初の IP アドレス("10.26.0.0" など)。
  • IP_END: 範囲内の最後の IP アドレス("10.26.255.255" など)。

このクエリの出力例を次に示します。

LocalVMName LocalAssetID LocalGroups LocalIP LocalPort プロトコル LocalProcessName RemoteVMName RemoteAssetID RemoteGroups RemoteIP RemotePort ConnectionCount
2024-04-18 VM-0lf60off projects/982941055174/locations/us-central1/assets/0lf60off グループ 1 10.0.45.138 272 tcp bash VM-0spdofr9 projects/982941055174/locations/us-central1/assets/0spdofr9 144.35.88.1 272 499
2024-04-18 VM-goa5uxhi projects/982941055174/locations/us-central1/assets/goa5uxhi グループ 3 10.187.175.82 781 tcp bash VM-27i5d2uj projects/982941055174/locations/us-central1/assets/27i5d2uj 22.99.72.109 781 980
2024-04-19 VM-7vwy31hg projects/982941055174/locations/us-central1/assets/7vwy31hg グループ 1 10.58.166.132 21 tcp bash VM-2gq0fl37 projects/982941055174/locations/us-central1/assets/2gq0fl37 147.19.84.135 21 514

ネットワーク内の未スキャン アセットを特定する

次のクエリを使用すると、ネットワーク内の未スキャン アセットを特定できます。スキャンされていないアセットは、Migration Center のインベントリ内のアセットに関連付けられていないリモート IP アドレスへの接続です。これにより、評価のためにスキャンする必要があるアセットが不足している可能性があることを特定できます。

CREATE TEMP FUNCTION
 ipBetween(value STRING,
   low STRING,
   high STRING) AS ( NET.IPV4_TO_INT64(NET.IP_FROM_STRING(value)) BETWEEN NET.IPV4_TO_INT64(NET.IP_FROM_STRING(low))
   AND NET.IPV4_TO_INT64(NET.IP_FROM_STRING(high)) );
SELECT
 STRING_AGG(LocalIP, ', ') AS LocalIPs,
 RemoteIP
FROM
 PROJECT.DATASET.TABLE
WHERE
 RemoteVMName = 'Unscanned Device'
 AND ipBetween(LocalIP,
   IP_START,
   IP_END)
 AND ipBetween(RemoteIP,
   IP_START,
   IP_END)
GROUP BY
 RemoteIP

以下を置き換えます。

  • IP_START: 範囲内の最初の IP アドレス("10.26.0.0" など)。
  • IP_END: 範囲内の最後の IP アドレス("10.26.255.255" など)。