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 nhật ký mạng của bạn. 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 mạng có thể giúp doanh nghiệp phát hiện và theo dõi sự phát tán của 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 TCP kết nối và tra cứu DNS từ 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ý tới 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ủ của mình 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 bộ phận CNTT quản trị viên 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 đối với chủ sở hữu thiết bị. Nếu bật, nó sẽ thu thập dữ liệu về hoạt động mạng của thiết bị. Điều này cũng được hỗ trợ trong Android 12 trở lên đối với chủ sở hữu hồ sơ của hồ sơ được quản lý và một ứng dụng được uỷ quyền bằng DELEGATION_NETWORK_LOGGING. Khi chủ sở hữu hồ sơ bật tính năng ghi nhật ký mạng, thì tính năng ghi nhật ký mạng sẽ chỉ ghi lại bao gồm hoạt động trên 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 của bạ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ác 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 thuộc mạng hệ thống yêu cầu. 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 IP của bạn. Các truy vấn DNS hỗ trợ khác, chẳng hạn như tính năng khám phá máy chủ định danh, thì không ghi lại.

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

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

Dữ liệu Ví dụ 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 được phân giải cho tên máy chủ. Để giữ cho kích thước nhật ký ở mức có thể quản lý, kết quả có thể không bao gồm tất cả địa chỉ IP—xem số địa chỉ ở hàng sau.
Số địa chỉ 4 Số lượng địa chỉ IP được trả về từ quá trình phân giải truy vấn DNS. Sử dụng dữ liệu này để tìm hiểu xem địa chỉ IP đã ghi có phải là một tập hợp con của 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 thành địa chỉ IP.
Tên gói com.android.chrome Tên gói của ứng dụng đã tạo 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ị này là khoảng thời gian tính bằng mili giây giữa quá trình tra cứu DNS và nửa đêm, ngày 1 tháng 1 năm 1970 (theo giờ UTC).
ID 25 Mã nhận dạng dạng số tăng đơn điệu. Có trong Android 9.0 (API cấp 28) trở lên.

Mặc dù việc tra cứu DNS có thể giúp quản trị viên CNTT theo dõi kết nối mạng, thì việc ghi nhật ký mạng không phải là giải pháp ghi DNS đa năng. Sau đây là một số thao tác DNS mà một ứng dụng có thể thực hiện 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 để tạo 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

Việc ghi nhật ký mạng ghi lại sự kiện cho mỗi lần kết nối là một phần của yêu cầu mạng của hệ thống. TCP chụp thành công và không thành công nhật ký kết nối—Truyền UDP không được ghi lại.

API ghi nhật ký hoạt động mạng hiển thị 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à các giá trị điển hình được ghi lại vào ConnectEvent.

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

Dữ liệu Ví dụ Mô tả
Địa chỉ Inet 2001:db8::2f:abc:0 Địa chỉ IP được kết nối với thiết bị. Đây có thể là địa chỉ IPv4 hoặc IPv6.
Cổng 80 Số cổng TCP mà thiết bị được 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 có kết nối mạng. Giá trị là khoảng thời gian tính bằng mili giây giữa thời điểm kết nối và nửa đêm, ngày 1 tháng 1 năm 1970 (theo giờ UTC).
ID 26 Mã nhận dạng 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 ghi lại một sự kiện khi ứng dụng gọi các thư viện mạng chuẩn, chẳng hạn như API tích hợp sẵn của Android hoặc thư viện phổ biến của bên thứ ba để kết nối một máy chủ lưu trữ. Những ứng dụng thực hiện lệnh gọi hệ thống trực tiếp để giao tiếp sẽ không được ghi lại. Hãy nhớ rằng mạng UDP không được ghi lại nên một số hoạt động truyền trực tuyến nội dung nghe nhìn, nhắn tin và ứng dụng 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 thì bạn sẽ thấy các cảnh báo sau trên 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 giám sát lưu lượng truy cập mạng. Người dùng sẽ thấy hộp thoại bằng cách nhấn vào thông tin thiết bị được quản lý nhãn trong Cài đặt nhanh.
  • Một thông báo hệ thống có thể đóng hiển thị khi người dùng mới kết nối mạng ghi nhật ký. 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ị kèm theo được giải thích thêm trong phần giám sát mạng. Thông báo biến mất khi DPC của bạn 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 nhiệm 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ó trên Android 8.0 (API cấp 26) trở lên cho chủ sở hữu thiết bị và Android 12 (API cấp 31) trở lên đối với chủ sở hữu hồ sơ hồ sơ được quản lý. Trước khi ghi nhật ký hoạt động mạng, DPC của bạn nên kiểm tra xem chủ sở hữu thiết bị hoặc chủ sở hữu hồ sơ của một hồ sơ được quản lý. Nhật ký mạng trong một 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 chế độ 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 DevicePolicyManager phương thức setNetworkLoggingEnabled() và chuyển true làm đối số enabled. DPC của bạn có thể gọi isNetworkLoggingEnabled() để kiểm tra xem mạng hoạt động được ghi lại.

Sau khi DPC của bạn bật ghi nhật ký mạng, có thể phải mất một lúc trước khi lô nhật ký đầu tiên đã sẵn sàng. Bạn nên đặt ra kỳ vọng về việc phân phối quảng cáo cho bộ phậ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 truy cập ngẫu nhiên vào các mục riêng lẻ trước đó. Khi có lô nhật ký mới, Lớp con DeviceAdminReceiver của DPC nhận được Lệnh gọi lại onNetworkLogsAvailable(). Lệnh gọi lại bao gồm mã thông báo hàng loạt mà DPC của bạn có thể sử dụng để truy xuất nhật ký. DPC của bạn gọi hàm DevicePolicyManager phương thức retrieveNetworkLogs() đến nhận 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:

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 sẽ truy xuất nhật ký ngay lập tức vì hệ thống xoá nhật ký để có chỗ cho các lô mới. Bạn nên giữ lại bản sao trên máy của nhật ký cho đến khi bạn chắc chắn DPC của mình đã 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ập hợp DnsEventConnectEvent thực thể. Để tìm hiểu thêm về các trường dữ liệu của Tra cứu DNS và kết nối mạng, xem phần Nhật ký sự kiện. Sự kiện đều theo thứ tự thời gian và mỗi lô chứa không quá 1200 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. Chiến lược phát hành đĩa đơn có thể là null nếu một trong những điều sau xảy ra:

  • Lô được biểu thị bằng mã thông báo lô không còn dùng được nữa. DPC của bạn không thể truy xuất lô và phải đợ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 tên máy chủ DNS đã được giải quyết. DPC của bạn cần quá trình 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ể nhận mã dạng số cho các sự kiện có trong Android 9.0 (API cấp 28) trở lên. Bởi vì mã nhận dạng tăng đơn điệu cho mỗi sự kiện, bạn có thể giúp quản trị viên CNTT phát hiện những lỗ hổng trong nhật ký của họ. Hệ thống đặt lại ID bất cứ khi nào DPC bật 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 tới 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ể đưa ra lựa chọn báo cáo cho quản trị viên CNTT.

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

Trong khi phát triển và thử nghiệm, có thể bạn muốn nhận được Lệnh gọi lại onNetworkLogsAvailable() mà không cần phải duyệt qua 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 vài yêu cầu mạng mẫu và buộc hệ thống gửi nhật ký có sẵn . Chạy lệnh Cầu gỡ lỗi Android (adb) sau đây trong ga:

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 bất kỳ cố ý làm chậm trong đầu ra của thiết bị đầu cuối. Nếu không có nhật ký nào để truy xuất, DPC của bạn không nhận được lệnh gọi lại.