Ghi nhật ký hoạt động mạng

Tài liệu này giải thích cách trình kiểm soát chính sách thiết bị (DPC) ghi lại hoạt động mạng. Hãy tiếp tục đọc để tìm hiểu cách thêm tính năng ghi nhật ký mạng vào DPC của bạn.

Tổng quan

Việc ghi nhật ký hoạt động trên mạng có thể giúp các doanh nghiệp phát hiện và theo dõi tình trạng phát tán phần mềm độc hại trên thiết bị của họ. DPC của bạn có thể gọi các API ghi nhật ký mạng để báo cáo các kết nối TCP và hoạt động tra cứu DNS qua các lệnh gọi nối mạng hệ thống.

Thông thường, DPC của bạn phân phối nhật ký đến máy chủ để trình bày cho quản trị viên CNTT. Bạn có thể muốn xử lý thêm nhật ký trên máy chủ hoặc cục bộ trên thiết bị. Ví dụ: bạn có thể thiết lập danh sách từ chối DNS để phát hiện và cảnh báo cho các quản trị viên CNTT về hành vi đáng ngờ.

Phạm vi cung cấp

Tính năng ghi nhật ký mạng được hỗ trợ trên Android 8 trở lên dành cho chủ sở hữu thiết bị. Nếu được bật, chính sách này sẽ thu thập dữ liệu về hoạt động mạng của thiết bị. API này cũng được hỗ trợ trong Android 12 trở lên cho chủ sở hữu hồ sơ được quản lý và ứng dụng được uỷ quyền có DELEGATION_NETWORK_LOGGING. Khi chủ sở hữu hồ sơ bật tính năng ghi nhật ký mạng, nhật ký mạng chỉ bao gồm hoạt động mạng của hồ sơ công việc và không thu thập dữ liệu từ hồ sơ cá nhân.

Để tìm hiểu thêm, hãy đọc bài viết Người dùng liên kết.

Nhật ký sự kiện

Khi tính năng ghi nhật ký mạng đang hoạt động, Android sẽ ghi lại từng sự kiện từ các ứng dụng bằng cách sử dụng thư viện mạng hệ thống. Tính năng ghi nhật ký mạng ghi lại hai loại sự kiện:

  • tra cứu DNS
  • Kết nối mạng

tra cứu DNS

Tính năng ghi nhật ký mạng ghi lại một sự kiện cho hoạt động tra cứu DNS trong các yêu cầu mạng hệ thống. Nhật ký ghi lại từng yêu cầu DNS phân giải tên máy chủ thành một địa chỉ IP. Các truy vấn DNS hỗ trợ khác, chẳng hạn như việc khám phá máy chủ định danh, sẽ không được ghi lại.

API ghi nhật ký hoạt động mạng hiển thị mỗi lượt tra cứu DNS dưới dạng một thực thể DnsEvent. Bảng 1 mô tả các trường và giá trị điển hình được ghi vào DnsEvent.

Bảng 1. Trường sự kiện DNS

Dữ liệu Ví dụ Nội dung mô tả
Tên máy chủ host.example.com Tên máy chủ được gửi trong truy vấn DNS.
Địa chỉ Inet 203.0.113.9, 198.51.100.25 Danh sách địa chỉ IPv4 hoặc IPv6 mà truy vấn DNS đã phân giải cho tên máy chủ. Để có thể quản lý kích thước nhật ký, kết quả có thể không bao gồm tất cả địa chỉ IP — xem số lượng địa chỉ trong hàng sau.
Số lượng địa chỉ 4 Số lượng địa chỉ IP được trả về từ quá trình phân giải truy vấn DNS. Hãy sử dụng công cụ này để tìm hiểu xem các địa chỉ IP đã ghi lại có phải là một tập hợp con của các kết quả hay không. Giá trị 0 (không) có nghĩa là tên máy chủ không phân giải được thành địa chỉ IP.
Tên gói com.android.chrome Tên gói của ứng dụng đã thực hiện truy vấn DNS.
Dấu thời gian 1506297600000 Bản ghi dấu thời gian khi quá trình tra cứu DNS diễn ra. Giá trị là khoảng thời gian mili giây giữa lần tra cứu DNS đến nửa đêm, ngày 1 tháng 1 năm 1970 (theo giờ UTC).
ID 25 Mã dạng số tăng đơn điệu. Có trong Android 9.0 (API cấp 28) trở lên.

Mặc dù hoạt động tra cứu DNS có thể giúp quản trị viên CNTT theo dõi kết nối mạng, nhưng tính năng ghi nhật ký mạng không phải là một giải pháp ghi DNS chung. Dưới đây là một số tác vụ DNS mà một ứng dụng có thể thực hiện nhưng chưa được ghi lại:

  • Kết nối trực tiếp với máy chủ định danh DNS.
  • Gọi một thư viện DNS Java để thực hiện truy vấn DNS.
  • Tránh truy vấn DNS bằng cách kết nối với một địa chỉ IP cố định.

Kết nối mạng

Tính năng ghi nhật ký mạng sẽ ghi lại một sự kiện cho mỗi lần cố gắng kết nối trong yêu cầu mạng của hệ thống. Việc ghi lại nhật ký các kết nối TCP đã thực hiện thành công và không thành công — quá trình chuyển UDP sẽ không được ghi lại.

API ghi nhật ký hoạt động mạng trình bày từng kết nối dưới dạng một thực thể ConnectEvent. Bảng 2 mô tả các trường và giá trị điển hình được ghi vào ConnectEvent.

Bảng 2. Kết nối các trường sự kiện

Dữ liệu Ví dụ Nội dung mô tả
Địa chỉ Inet 2001:db8::2f:abc:0 Địa chỉ IP mà thiết bị đã kết nối đến. Đó có thể là địa chỉ IPv4 hoặc IPv6.
Chuyển số 80 Số cổng TCP mà thiết bị đã kết nối.
Tên gói com.android.chrome Tên gói của ứng dụng đã kết nối.
Dấu thời gian 1506297600000 Bản ghi dấu thời gian khi kết nối mạng diễn ra. Giá trị là khoảng thời gian mili giây giữa kết nối và nửa đêm, ngày 1 tháng 1 năm 1970 (giờ UTC).
ID 26 Mã dạng số tăng đơn điệu. Có trong Android 9.0 (API cấp 28) trở lên.

Tính năng ghi nhật ký mạng sẽ ghi lại một sự kiện khi ứng dụng gọi các thư viện mạng tiêu chuẩn, chẳng hạn như API tích hợp của Android hoặc các thư viện phổ biến của bên thứ ba, để kết nối với một máy chủ lưu trữ. Những ứng dụng thực hiện lệnh gọi trực tiếp trên hệ thống để giao tiếp sẽ không được ghi lại. Hãy nhớ rằng việc kết nối mạng UDP không được ghi lại, vì vậy, một số ứng dụng phát trực tuyến nội dung đa phương tiện, nhắn tin và trò chơi có thể không xuất hiện trong nhật ký.

Thông báo cho người dùng

Hệ thống sẽ thông báo cho người dùng thiết bị rằng tính năng ghi nhật ký hoạt động mạng đang hoạt động. Người dùng sẽ thấy các cảnh báo sau đây trong giao diện:

  • Một phần trong hộp thoại Device Management (Quản lý thiết bị) giải thích DPC của bạn đang theo dõi lưu lượng truy cập mạng. Người dùng sẽ nhìn thấy hộp thoại này bằng cách nhấn vào nhãn thông tin thiết bị được quản lý trong trình đơn Cài đặt nhanh.
  • Một thông báo hệ thống có thể đóng xuất hiện khi người dùng mới sử dụng tính năng ghi nhật ký mạng. Thao tác nhấn vào thông báo sẽ hiển thị hộp thoại Giám sát thiết bị cùng nội dung giải thích thêm trong phần giám sát mạng. Thông báo sẽ biến mất khi DPC tắt tính năng ghi nhật ký mạng.

Thêm tính năng ghi nhật ký mạng vào DPC

Để giúp quản trị viên CNTT xem xét nhật ký mạng, DPC của bạn cần có khả năng hoàn tất các tác vụ sau:

  • Bật và tắt tính năng ghi nhật ký mạng.
  • Truy xuất mọi nhật ký đã ghi khi một lô mới đã sẵn sàng.
  • Gửi dữ liệu hữu ích trong nhật ký đến máy chủ.

Yêu cầu

Tính năng ghi nhật ký mạng có trong Android 8.0 (API cấp 26) trở lên dành cho chủ sở hữu thiết bị và Android 12 (API cấp 31) trở lên dành cho chủ sở hữu hồ sơ được quản lý. Trước khi ghi nhật ký hoạt động mạng, DPC của bạn phải kiểm tra xem mình là chủ sở hữu thiết bị hay chủ sở hữu hồ sơ được quản lý. Nhật ký mạng trong chủ sở hữu thiết bị có hồ sơ công việc không bao gồm hoạt động mạng trên hồ sơ cá nhân nếu chủ sở hữu hồ sơ bật tính năng này.

Bật tính năng ghi nhật ký mạng

Để bắt đầu ghi nhật ký hoạt động mạng, hãy gọi phương thức DevicePolicyManager setNetworkLoggingEnabled() và chuyển true làm đối số enabled. DPC của bạn có thể gọi isNetworkLoggingEnabled() để kiểm tra xem hoạt động mạng đã được ghi nhật ký hay chưa.

Sau khi DPC bật tính năng ghi nhật ký mạng, có thể mất một khoảng thời gian để lô nhật ký đầu tiên sẵn sàng. Bạn nên đặt kỳ vọng phân phối cho quản trị viên CNTT trong giao diện người dùng.

Để dừng ghi nhật ký hoạt động mạng, hãy gọi setNetworkLoggingEnabled() và truyền false. Khi quản trị viên CNTT tắt tính năng ghi nhật ký mạng, hệ thống sẽ xoá mọi nhật ký đã thu thập và chưa báo cáo.

Truy xuất nhật ký

DPC của bạn có thể truy xuất nhật ký theo lô – API ghi nhật ký mạng không cung cấp quyền truy cập ngẫu nhiên vào các mục riêng lẻ trước đó. Khi có một lô nhật ký mới, lớp con DeviceAdminReceiver của DPC sẽ nhận được lệnh gọi lại onNetworkLogsAvailable(). Lệnh gọi lại bao gồm một mã thông báo theo lô mà DPC của bạn có thể dùng để truy xuất nhật ký. DPC của bạn gọi phương thức DevicePolicyManager retrieveNetworkLogs() để lấy danh sách các sự kiện mạng.

Ví dụ sau cho thấy bạn có thể truy xuất nhật ký trong lớp con DeviceAdminReceiver của mình:

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 của bạn nên truy xuất nhật ký ngay vì hệ thống sẽ xoá nhật ký để dành chỗ cho các lô mới. Bạn nên giữ lại bản sao nhật ký trên máy cho đến khi chắc chắn rằng DPC đã xử lý tất cả các nhật ký đó mà không gặp vấn đề gì.

Xử lý mọi nhật ký

Một lô nhật ký thường chứa tổ hợp các thực thể DnsEventConnectEvent. Để tìm hiểu thêm về các trường dữ liệu của hoạt động tra cứu DNS và kết nối mạng, hãy xem phần Nhật ký sự kiện. Các sự kiện được sắp xếp theo thứ tự thời gian và mỗi lô chứa không quá 1.200 sự kiện.

Sau khi bạn gọi để truy xuất nhật ký, hãy kiểm tra để đảm bảo giá trị trả về không phải là null. Giá trị này có thể là null nếu một trong những trường hợp sau xảy ra:

  • Lô được biểu thị bằng mã thông báo theo lô không còn hoạt động nữa. DPC của bạn không thể truy xuất lô và sẽ đợi lô tiếp theo.
  • Quản trị viên CNTT đã tắt tính năng ghi nhật ký mạng.

Ví dụ đơn giản sau đây cho thấy cách DPC có thể trích xuất phân giải tên máy chủ DNS. DPC của bạn cần xử lý và báo cáo phức tạp hơn.

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());
  }
}

Ví dụ trước cũng cho thấy cách bạn có thể lấy mã nhận dạng dạng số cho các sự kiện có trong Android 9.0 (API cấp 28) trở lên. Vì mã nhận dạng tăng đơn điệu cho mỗi sự kiện, nên bạn có thể giúp quản trị viên CNTT phát hiện các khoảng trống trong nhật ký. Hệ thống sẽ đặt lại mã nhận dạng bất cứ khi nào DPC bật tính năng ghi nhật ký hoặc khi thiết bị khởi động lại.

DPC của bạn có thể gửi toàn bộ bộ sưu tập đến một máy chủ hoặc bạn có thể quyết định lọc các sự kiện trên thiết bị. Ví dụ: bạn có thể cung cấp tính năng báo cáo trong danh sách cho phép cho quản trị viên CNTT.

Phát triển và kiểm thử

Trong quá trình phát triển và kiểm thử, bạn có thể muốn nhận được các lệnh gọi lại onNetworkLogsAvailable() mà không cần phải duyệt xem hàng trăm trang web. Trong Android 9.0 (API cấp 28) trở lên, bạn có thể thực hiện một số yêu cầu mạng mẫu và buộc hệ thống gửi một lệnh gọi lại có sẵn trong nhật ký. Chạy lệnh Cầu gỡ lỗi Android (adb) sau đây trong thiết bị đầu cuối của bạn:

adb shell dpm force-network-logs

Hệ thống giới hạn tần suất bạn có thể sử dụng công cụ này và báo cáo mọi trường hợp chủ ý làm chậm ở đầu ra của thiết bị đầu cuối. Nếu không có nhật ký nào để truy xuất, thì DPC của bạn sẽ không nhận được lệnh gọi lại.