ネットワーク アクティビティ ログ

このドキュメントでは、Device Policy Controller(DPC)がネットワークをログに記録する方法について説明します。 できます。以下では、DPC にネットワーク ロギングを追加する方法について説明します。

概要

ネットワーク アクティビティを記録することで、企業はマルウェアの拡散を マルウェアを仕掛けます。DPC はネットワーク ロギング API を呼び出して TCP 接続と DNS ルックアップを 簡単に行えるようにします

通常、DPC はログをサーバーに配信して IT 管理者に提示します。 ログをさらに処理する場合は、サーバー上でも、ローカルでローカルに ダウンロードしますたとえば、DNS 拒否リストを設定して、IT 部門に 不審な動作について管理者に通知できます。

対象

ネットワーク ロギングは、デバイス所有者向けの Android 8 以降でサポートされています。条件 デバイスのネットワーク アクティビティに関するデータが収集されます。また、 Android 12 以降で、管理対象プロファイルのプロファイル オーナーが DELEGATION_NETWORK_LOGGING を使用して委任されたアプリを作成する。 プロファイルの所有者がネットワーク ログを有効にしている場合、 仕事用プロファイルのネットワーク アクティビティが含まれます。 できます。

詳しくは、関連付けられているユーザーをご覧ください。

イベントログ

ネットワーク ロギングが有効な場合、Android は 使用できます。ネットワーク ロギングでは、次の 2 種類のイベントが記録されます。

  • DNS ルックアップ
  • ネットワーク接続

DNS ルックアップ

ネットワーク ロギングは、システム ネットワークの一部である DNS ルックアップのイベントを記録します。 できます。ログは、ホスト名を IP アドレスに解決する各 DNS リクエストをキャプチャします。 あります。ネームサーバー検出など、その他のサポート DNS クエリはサポートされていません。 記録されます。

ネットワーク アクティビティ ロギング API は、各 DNS ルックアップを DnsEvent インスタンス。表 1 に、各フィールドの概要と、 DnsEvent に記録された値。

表 1. DNS イベント フィールド

データ 説明
ホスト名 host.example.com DNS クエリで送信されるホスト名。
Inet アドレス 203.0.113.9198.51.100.25 DNS クエリがホスト名に対して解決した IPv4 または IPv6 アドレスのリスト。ログサイズを管理しやすいようにするため、結果にすべての IP アドレスが含まれていない場合があります。次の行のアドレスカウントをご覧ください。
アドレス数 4 DNS クエリ解決で返された IP アドレスの数。これを使用して、ログに記録された IP アドレスが結果のサブセットであるかどうかを確認します。値 0(ゼロ)は、ホスト名が IP アドレスに解決されなかったことを意味します。
パッケージ名 com.android.chrome DNS クエリを実行したアプリのパッケージ名。
タイムスタンプ 1506297600000 DNS ルックアップが行われたときのタイムスタンプの記録。値は、DNS ルックアップから 1970 年 1 月 1 日午前 0 時(UTC)までのミリ秒間隔です。
ID 25 単調に増加する数値 ID。Android 9.0(API レベル 28)以降で使用できます。

DNS ルックアップは ネットワーク接続を追跡するが、ネットワーク ロギングは 一般的な DNS 記録ソリューションですアプリが実行する可能性のある DNS タスクの例 ログに記録されません。

  • DNS ネームサーバーと直接通信する。
  • Java DNS ライブラリを呼び出して DNS クエリを行う。
  • 固定 IP アドレスに接続して DNS クエリを回避します。

ネットワーク接続

ネットワーク ロギングでは、接続の試行ごとにイベントが記録されます。 ネットワーク リクエスト。ログは TCP ポート 80 と 接続数 - UDP 転送は記録されません。

ネットワーク アクティビティ ロギング API は、各接続を ConnectEvent インスタンス。表 2 で各フィールドの説明 と一般的な値を ConnectEvent に記録します。

表 2. イベント フィールドを接続

データ 説明
Inet アドレス 2001:db8::2f:abc:0 デバイスが接続している IP アドレス。これは IPv4 アドレスでも IPv6 アドレスでもかまいません。
ポート 80 デバイスが接続している TCP ポート番号。
パッケージ名 com.android.chrome 接続したアプリのパッケージ名。
タイムスタンプ 1506297600000 ネットワーク接続が発生したときのタイムスタンプの記録。値は、接続から 1970 年 1 月 1 日午前 0 時(UTC)までのミリ秒間隔です。
ID 26 単調に増加する数値 ID。Android 9.0(API レベル 28)以降で使用できます。

ネットワーク ロギングでは、アプリが標準のネットワーク ライブラリを呼び出したときにイベントが記録されます。 一般的なサードパーティ ライブラリなど)を使用して、 できます。通信するためにシステム呼び出しを直接発行するアプリはログに記録されません。 UDP ネットワーキングはログに記録されないため、一部のメディア ストリーミング、メッセージング、 ゲームアプリがログに表示されないことがあります。

ユーザーに通知する

システムは、ネットワーク アクティビティ ログが有効であることをデバイスのユーザーに通知します。ユーザー インターフェースに次の警告が表示されます。

  • [デバイス管理] ダイアログで、DPC がモニタリング中であることを説明するセクション トラフィックを転送しますユーザーが管理対象デバイスの情報をタップすると、ダイアログが表示される [クイック設定] で [ラベル] ラベルを開きます。
  • ユーザーがネットワークを初めて使用するときに表示されるシステム通知(閉じることができます)。 説明します。通知をタップすると、[デバイスのモニタリング] ダイアログと ネットワーク モニタリングのセクションで説明します。通知が消えます。 DPC がネットワークロギングを無効にしている場合

ネットワーク ロギングを DPC に追加する

IT 管理者がネットワーク ログを確認できるようにするには、DPC が次の手順を完了できる必要があります。 できます。

  • ネットワーク ロギングのオンとオフを切り替えます。
  • 新しいバッチの準備ができたら、記録されたログを取得します。
  • ログ内の有用なデータをサーバーに送信します。

要件

ネットワーク ロギングは、Android 8.0(API レベル 26)以降の と、Android 12(API レベル 31)以降で 管理対象プロファイルです。ネットワーク アクティビティをログに記録する前に、DPC は 管理対象プロファイルのデバイス所有者またはプロファイル所有者です。1 つの VM でのネットワーク ログ 仕事用プロファイルが設定されたデバイス所有者に、ネットワーク アクティビティが含まれていない プロフィールのオーナーが有効にしている場合は、個人用プロファイルに表示されます。

ネットワーク ロギングを有効にする

ネットワーク アクティビティの記録を開始するには、DevicePolicyManager を呼び出します。 メソッド setNetworkLoggingEnabled()true を渡す enabled 引数として渡します。DPC は isNetworkLoggingEnabled(): ネットワークが ログに記録されます。

DPC でネットワーク ロギングを有効にしてから、 準備が整いましたIT チームへのデリバリーの期待値を設定してもよいでしょう。 確認できます。

ネットワーク アクティビティの記録を停止するには、setNetworkLoggingEnabled() を呼び出して false。IT 管理者がネットワーク ロギングを無効にすると、 レポートされていないログを収集します。

ログを取得する

DPC はログを一括で取得できる(ネットワーク ロギング API にはない) 過去の個々のエントリにランダムにアクセスできます。新しいログのバッチが利用可能になったら DPC の DeviceAdminReceiver サブクラスが onNetworkLogsAvailable() コールバック。コールバック には、DPC がログの取得に使用できるバッチトークンが含まれています。DPC は DevicePolicyManager メソッド retrieveNetworkLogs() から ネットワーク イベントのリストを取得します。

次の例では、Cloud Storage バケットで DeviceAdminReceiver サブクラス:

Kotlin

fun onNetworkLogsAvailable(
        context: Context, intent: Intent, batchToken: Long, networkLogsCount: Int) {

    val dpm = getManager(context)
    var logs: List<NetworkEvent>? = null

    // Fetch the batch of logs with the batch token from the callback's arguments.
    try {
        logs = dpm.retrieveNetworkLogs(getWho(context), batchToken)
    } catch (e: SecurityException) {
        // Perhaps an unaffiliated user - handle the exception ...
    }

    // Process any logs ...
}

Java

public void onNetworkLogsAvailable(
    Context context, Intent intent, long batchToken, int networkLogsCount) {

  DevicePolicyManager dpm = getManager(context);
  List<NetworkEvent> logs = null;

  // Fetch the next batch of logs using the callback's batch token argument.
  try {
    logs = dpm.retrieveNetworkLogs(getWho(context), batchToken);
  } catch (SecurityException e) {
    // Perhaps an unaffiliated user - handle the exception ...
  }

  // Process any logs ...
}

システムによってログが削除されるため、DPC はすぐにログを取得する必要があります。 新しいバッチ用のスペースを確保しますローカルにコピーしておいた方がよいでしょう。 ログを記録します。

ログを処理する

通常、ログのバッチには、DnsEventConnectEvent 個のインスタンス。Google Cloud Storage の DNS ルックアップとネットワーク接続については、イベントログをご覧ください。イベント 各バッチに含まれるイベントは 1,200 件までです。

ログを取得するための呼び出しの後、戻り値が null でないことを確認します。「 次のいずれかが発生すると、値が null になることがあります。

  • バッチトークンで表されるバッチは使用できなくなりました。お客様の DPC バッチを取得できないため、次のバッチを待つ必要があります。
  • IT 管理者がネットワーク ロギングを無効にしました。

次の簡単な例は、DPC が DNS ホスト名を抽出する方法を示しています。 解決しました。DPC には、より高度な処理とレポートが必要です。

Kotlin

// Here, logs might be null. We can't fix because either the token doesn't match
// the current batch or network logging was deactivated.
// Confirm with isNetworkLoggingEnabled().

logs?.forEach {
    // For this example, report the DNS hosts and discard all other data.
    // Because we use the event ID, this example requires API level 28.
    if (it is DnsEvent) {
        reportDnsHostToServer(it.hostname, it.getTimestamp(), it.getId())
    }
}

Java

if (logs == null) {
  // Abandon processing because either the token doesn't match the current batch
  // or network logging was deactivated - confirm with isNetworkLoggingEnabled().
  return;
}

for (NetworkEvent event : logs) {
  // For this example, report the DNS hosts and discard all other data.
  // This example requires API level 28 because we use the event ID.
  if (event instanceof DnsEvent) {
    reportDnsHostToServer(
        ((DnsEvent) event).getHostname(), event.getTimestamp(), event.getId());
  }
}

前述の例は、次のフィールドの数値 ID を取得する方法も示しています。 Android 9.0(API レベル 28)以降に含まれるイベントをサポートしています。ID は、 イベントごとに単調に増加するので、IT 管理者がイベントでのギャップを できます。DPC がロギングを有効にするか、 デバイスが再起動されます。

DPC はコレクション全体をサーバーに送信することも、 デバイス上のイベントをフィルタできますたとえば、許可リストに登録されたサービスを 新しいレポートを作成できます

開発とテスト

開発とテストの最中に、 onNetworkLogsAvailable() コールバックを呼び出せます。 何百ものウェブページを閲覧できますAndroid 9.0(API レベル 28)以降では、次のことを行えます。 いくつかのサンプル ネットワーク リクエストを作成し、システムに 呼び出すことができます。ローカル ファイル内で次の Android Debug Bridge(adb)コマンドを ターミナル:

adb shell dpm force-network-logs

このツールの使用頻度はシステムによって制限され、 意図的に遅くなる場合があります目的のログが DPC はコールバックを受信しません