網路活動記錄功能

本文件說明裝置政策控制器 (DPC) 如何記錄網路活動。繼續閱讀瞭解如何在 DPC 中新增網路記錄。

總覽

記錄網路活動可協助企業偵測及追蹤個人裝置上的惡意軟體散佈情形。您的 DPC 可以呼叫網路記錄 API,透過系統網路呼叫回報 TCP 連線和 DNS 查詢。

一般來說,DPC 會將記錄傳送至伺服器,以便向 IT 管理員進行簡報。建議您進一步在伺服器或裝置本機上處理記錄。舉例來說,您可以設定 DNS 拒絕清單,藉此偵測可疑行為並通知 IT 管理員。

產品供應資訊

Android 8 以上版本支援裝置擁有者的網路記錄功能。啟用後,應用程式就會收集裝置的網路活動資料。Android 12 以上版本也支援受管理設定檔的設定檔擁有者,以及具有 DELEGATION_NETWORK_LOGGING 的委派應用程式。如果設定檔擁有者啟用網路記錄功能,網路記錄只會包含工作資料夾的網路活動,不會從個人設定檔收集資料。

詳情請參閱「關聯使用者」一節。

事件記錄

啟用網路記錄功能後,Android 會使用系統網路程式庫從應用程式記錄每個事件。網路記錄功能會記錄兩種事件:

  • 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 IPv4 或 IPv6 位址清單是針對主機名稱解析的 DNS 查詢。為確保記錄大小便於管理,結果可能不會包含所有 IP 位址,請參閱下一列的位址數量。
地址數量 4 DNS 查詢解析傳回的 IP 位址數量。使用這項資訊即可確認記錄的 IP 位址是否為結果的一部分。如果值為 0 (零),表示主機名稱無法解析為 IP 位址。
套件名稱 com.android.chrome 執行 DNS 查詢的應用程式套件名稱。
時間戳記 1506297600000 DNS 查詢發生時的時間戳記記錄。這個值是 DNS 查詢作業之間的毫秒間隔 (世界標準時間) 至 1970 年 1 月 1 日午夜。
ID 25 單調遞增的數字 ID。適用於 Android 9.0 (API 級別 28) 以上版本。

雖然 DNS 查詢可協助 IT 管理員追蹤網路連線,但網路記錄功能並非一般用途的 DNS 錄製解決方案。以下是應用程式可能未記錄的一些 DNS 工作:

  • 直接與 DNS 名稱伺服器通訊。
  • 呼叫 Java DNS 程式庫進行 DNS 查詢。
  • 連線至固定 IP 位址來避免 DNS 查詢。

網路連線

網路記錄會針對系統網路要求中的每個嘗試連線記錄一個事件。記錄檔會擷取成功和失敗的 TCP 連線:系統不會記錄 UDP 傳輸活動。

網路活動記錄 API 會將每個連線顯示為 ConnectEvent 執行個體。表 2 說明瞭記錄到 ConnectEvent 中的欄位和一般值。

表 2. 連結事件欄位

資料 範例 說明
Inet 地址 2001:db8::2f:abc:0 裝置連線的 IP 位址。例如 IPv4 或 IPv6 位址。
轉攜 80 裝置要連線的 TCP 通訊埠編號。
套件名稱 com.android.chrome 已連結應用程式的套件名稱。
時間戳記 1506297600000 網路連線發生時的時間戳記記錄。這個值是連線之間的毫秒間隔 (世界標準時間) 至 1970 年 1 月 1 日午夜。
ID 26 單調遞增的數字 ID。適用於 Android 9.0 (API 級別 28) 以上版本。

當應用程式呼叫標準網路程式庫 (例如 Android 的內建 API 或熱門的第三方程式庫) 並連線至主機時,網路記錄功能會記錄事件。系統不會記錄直接發出系統呼叫的應用程式。請注意,UDP 網路不會記錄下來,因此某些媒體串流、訊息和遊戲應用程式可能不會出現在記錄檔中。

通知使用者

系統會通知裝置使用者,說明網路活動記錄已啟用。使用者會在介面中看到以下警告:

  • 「裝置管理」對話方塊中的一個部分,說明 DPC 正在監控網路流量。使用者只要在「快速設定」中輕觸受管理的裝置資訊標籤,就會看到對話方塊。
  • 當使用者第一次使用網路記錄時,系統會顯示可關閉的系統通知。輕觸通知即可顯示「Device monitoring」對話方塊,並在「網路監控」區段中提供進一步的說明。當 DPC 停用網路記錄時,通知就會消失。

將網路記錄新增至 DPC

為協助 IT 管理員查看網路記錄,DPC 必須要完成以下工作:

  • 開啟及關閉網路記錄功能。
  • 當新的批次準備就緒時,擷取所有記錄的記錄。
  • 將記錄中的實用資料傳送至伺服器。

相關規定

網路記錄功能適用於 Android 8.0 (API 級別 26) 以上版本裝置擁有者,以及 Android 12 (API 級別 31) 以上版本裝置,適用於受管理設定檔的個人資料擁有者。在記錄網路活動之前,DPC 應檢查裝置是否為裝置擁有者或受管理設定檔的個人資料擁有者。設有工作資料夾的裝置擁有者所啟用的網路記錄,不會納入個人設定檔的網路活動 (如果設定檔擁有者已啟用該功能)。

啟用網路記錄功能

如要開始記錄網路活動,請呼叫 DevicePolicyManager 方法 setNetworkLoggingEnabled(),並將 true 做為 enabled 引數傳遞。DPC 可以呼叫 isNetworkLoggingEnabled(),檢查網路活動是否已記錄。

DPC 啟用網路記錄後,可能需要一些時間才能備妥第一批記錄。建議您在使用者介面中為 IT 管理員設定交付預期。

如要停止記錄網路活動,請呼叫 setNetworkLoggingEnabled() 並傳遞 false。當 IT 管理員關閉網路記錄時,系統會刪除任何已收集和未回報的記錄。

擷取記錄

您的 DPC 可以批次擷取記錄,網路記錄 API 不會針對過去的個別項目提供隨機存取權。有新的記錄批次時,DPC 的 DeviceAdminReceiver 子類別會收到 onNetworkLogsAvailable() 回呼。回呼包括 DPC 可用於擷取記錄的批次權杖。DPC 會呼叫 DevicePolicyManager 方法 retrieveNetworkLogs(),取得網路事件清單。

以下範例顯示您可以擷取 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 應直接擷取記錄,因為系統會刪除記錄,為新的批次作業騰出空間。建議您保留本機記錄副本,直到確定 DPC 已全部處理完畢。

處理任何記錄檔

批次記錄通常包含 DnsEventConnectEvent 執行個體。如要進一步瞭解 DNS 查詢和網路連線的資料欄位,請參閱事件記錄。事件會依時間先後順序進行,且每個批次所包含的事件不超過 1200 個。

在呼叫擷取記錄之後,檢查回傳值不是 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());
  }
}

上述範例也說明如何取得 Android 9.0 (API 級別 28) 以上版本內含事件的數字 ID。因為每個事件的 ID 都是單調遞增的,因此您可以協助 IT 管理員找出記錄中的落差。每當 DPC 啟用記錄或裝置重新啟動時,系統都會重設 ID。

DPC 可將整個集合傳送至伺服器,或者您也可以篩選裝置上的事件。例如,您可以向 IT 管理員提供許可清單報表。

開發和測試

在開發和測試時,您可能會想要收到 onNetworkLogsAvailable() 回呼,而不必瀏覽數百個網頁。在 Android 9.0 (API 級別 28) 以上版本中,您可以提出一些網路要求範例,並強制系統傳送可用的記錄回呼。在終端機中執行以下 Android Debug Bridge (adb) 指令:

adb shell dpm force-network-logs

系統會限制您使用工具的頻率,並回報終端機輸出內容時發生的任何異常緩慢情形。如果沒有任何記錄可擷取,DPC 就不會收到回呼。