本文档介绍了设备政策控制器 (DPC) 如何记录网络 活动。继续阅读,了解如何向您的 DPC 添加网络日志记录。
概览
记录网络活动有助于企业检测和跟踪 恶意软件您的 DPC 可调用网络日志记录 API 来报告 TCP 来自系统网络调用的大量连接和 DNS 查找。
通常情况下,DPC 会将日志传送到服务器,以便呈现给 IT 管理员。 您可能希望在服务器上进一步处理日志, 设备。例如,您可以设置 DNS 拒绝名单来检测 协助管理员了解可疑行为
可用性
对于设备所有者,Android 8 及更高版本支持网络日志记录功能。如果 便会收集与设备的网络活动有关的数据。它还 Android 12 及更高版本支持受管理资料的资料所有者,以及 使用 DELEGATION_NETWORK_LOGGING 的委托应用。 当配置文件所有者启用网络日志记录时,仅网络日志 包含工作资料网络活动,并且不会从 个人资料。
如需了解详情,请参阅关联用户。
事件日志
启用网络日志记录功能后,Android 会使用 和系统网络库网络日志记录会记录两种类型的事件:
- DNS 查询次数
- 网络连接
DNS 查询次数
网络日志记录会针对系统网络中的 DNS 查找记录事件 请求。日志会捕获每个将主机名解析为 IP 的 DNS 请求 地址。不会支持其他支持 DNS 查询,例如域名服务器发现 已记录。
网络活动日志记录 API 将每次 DNS 查找显示为
DnsEvent
实例。表 1 介绍了
值记录到 DnsEvent
中。
数据 | 示例 | 说明 |
---|---|---|
主机名 | host.example.com | DNS 查询中发送的主机名。 |
Inet 地址 | 203.0.113.9、198.51.100.25 | 为主机名解析的 IPv4 或 IPv6 地址列表。为了确保日志大小可控,结果可能不会包含所有 IP 地址,请参阅下一行中的地址计数。 |
地址数量 | 4 | 通过 DNS 查询解析返回的 IP 地址数量。使用此方法了解记录的 IP 地址是否是结果的子集。值 0(零)表示主机名未解析为 IP 地址。 |
软件包名称 | com.android.chrome | 执行 DNS 查询的应用的软件包名称。 |
时间戳 | 1506297600000 | DNS 查找发生时记录的时间戳。该值是 DNS 查找到世界协调时间 (UTC) 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
中。
数据 | 示例 | 说明 |
---|---|---|
Inet 地址 | 2001:db8::2f:abc:0 | 设备所连接的 IP 地址。这可能是 IPv4 地址,也可能是 IPv6 地址。 |
端口 | 80 | 设备连接的 TCP 端口号。 |
软件包名称 | com.android.chrome | 关联的应用的软件包名称。 |
时间戳 | 1506297600000 | 记录网络连接发生时的时间戳。该值是连接与世界协调时间 (UTC) 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 已顺利处理所有记录。
处理任何日志
一批日志通常同时包含 DnsEvent
和
ConnectEvent
个实例。要详细了解
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()); } }
上面的示例还展示了如何获取 事件。由于 ID 为 每个活动单调递增,您可以帮助 IT 管理员找出 用户的日志每当 DPC 启用日志记录或 设备重启。
您的设备政策控制器 (DPC) 可将整个设备集发送到服务器,或者您可能会决定 过滤设备上的事件例如,您可以提供已列入许可名单 IT 管理员使用的报告。
开发和测试
在开发和测试阶段,您可能希望
onNetworkLogsAvailable()
回调,而无需
浏览数百个网页在 Android 9.0(API 级别 28)或更高版本中,您可以
发出一些示例网络请求,并强制系统发送
回调。在 Android Studio 中,运行以下 Android 调试桥 (adb) 命令
终端:
adb shell dpm force-network-logs
系统会限制您使用该工具的频率,并报告任何 输出速度会有意减慢。如果没有任何日志 则您的 DPC 不会收到回调。