網路活動記錄功能

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

總覽

記錄網路活動,可協助企業偵測並追蹤 安裝在裝置上安裝惡意軟體您的裝置政策控制器可以呼叫網路記錄 API 來回報 TCP 系統網路呼叫產生的連線和 DNS 查詢。

DPC 通常會將記錄傳送至伺服器,以便向 IT 管理員進行簡報。 您可以在伺服器中進一步處理記錄,或是在本機上 裝置。例如,您可以設定 DNS 拒絕清單,用於偵測並通知 IT 部門 以便管理員查看可疑行為

適用地區

Android 8 以上版本的裝置皆支援網路記錄功能,如果 啟用後,系統就會收集裝置網路活動相關資料。這個 (適用於 Android 12 以上版本) 支援的受管理設定檔的設定檔擁有者。 與 DELEGATION_NETWORK_LOGGING 委派的應用程式。 如果設定檔擁有者啟用了網路記錄功能,則僅網路記錄 包含工作資料夾網路活動,且不會從 個人資料夾

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

事件記錄

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

  • DNS 查詢
  • 網路連線

DNS 查詢

網路記錄功能會記錄屬於系統網路的 DNS 查詢事件 要求。記錄檔會擷取將主機名稱解析為 IP 的每個 DNS 要求 讓我們看看 DNS 解析 進一步探索內部和外部位址不支援其他支援的 DNS 查詢 (例如名稱伺服器探索功能) 錄製。

網路活動記錄 API 會將每項 DNS 查詢顯示為 DnsEvent 執行個體。表 1 說明欄位和典型 輸入到 DnsEvent 中。

表 1. DNS 事件欄位

資料 範例 說明
主機名稱 host.example.com 透過 DNS 查詢傳送的主機名稱。
內部地址 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. 連結事件欄位

資料 範例 說明
內部地址 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 正在監控 網路流量。使用者只要輕觸受管理的裝置資訊,就會看到這個對話方塊 標籤
  • 當使用者剛開始連上網路時,系統會顯示可關閉的系統通知 。輕觸通知會顯示「裝置監控」對話方塊,其中包含 我們會在網路監控一節提供進一步的說明。通知就會消失 您 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 如此一來,您可以協助 IT 管理員找出 及記錄檔每當 DPC 啟用記錄功能,或發生在 就會重新啟動

DPC 可以將整個集合傳送至伺服器,或者您也可以決定 篩選裝置上的事件。舉例來說,您可以將應用程式 列入許可清單 報告 IT 管理員

開發和測試

在應用程式開發及測試期間,您可能會想收到 onNetworkLogsAvailable() 回呼,不必 瀏覽數百個網頁。在 Android 9.0 (API 級別 28) 以上版本中,您可以 發出幾個網路要求樣本,並強制系統傳送可用的記錄 回呼。在 Android Debug Bridge (ADB) 指令中執行下列 Android Debug Bridge (ADB) 指令 終端機:

adb shell dpm force-network-logs

系統會限制使用者使用這項工具的頻率,並 刻意減緩終端機輸出內容的執行速度。如果 擷取時,您的 DPC 就不會收到回呼。