Logging aktivitas jaringan

Dokumen ini menjelaskan cara pengontrol kebijakan perangkat (DPC) mencatat aktivitas jaringan dalam log. Lanjutkan membaca untuk mempelajari cara menambahkan logging jaringan ke DPC.

Ringkasan

Logging aktivitas jaringan dapat membantu perusahaan mendeteksi dan melacak penyebaran malware di perangkat mereka. DPC Anda dapat memanggil API logging jaringan untuk melaporkan koneksi TCP dan pencarian DNS dari panggilan jaringan sistem.

Biasanya, DPC mengirimkan log ke server untuk presentasi ke admin IT. Sebaiknya Anda memproses log lebih lanjut di server atau secara lokal di perangkat. Misalnya, Anda dapat menyiapkan daftar tolak DNS untuk mendeteksi dan memberi tahu Admin IT tentang perilaku yang mencurigakan.

Ketersediaan

Logging jaringan didukung di Android 8 dan yang lebih baru untuk pemilik perangkat. Jika diaktifkan, fitur ini akan mengumpulkan data tentang aktivitas jaringan perangkat. Fitur ini juga didukung di Android 12 dan yang lebih tinggi untuk pemilik profil dari profil terkelola dan aplikasi yang didelegasikan dengan DELEGATION_NETWORK_LOGGING. Jika logging jaringan diaktifkan oleh pemilik profil, log jaringan hanya menyertakan aktivitas jaringan profil kerja dan tidak mengumpulkan data dari profil pribadi.

Untuk mempelajari lebih lanjut, baca Pengguna terafiliasi.

Log aktivitas

Saat logging jaringan aktif, Android akan merekam setiap peristiwa dari aplikasi menggunakan library jaringan sistem. Logging jaringan mencatat dua jenis peristiwa:

  • Pencarian DNS
  • Koneksi jaringan

Pencarian DNS

Logging jaringan mencatat peristiwa untuk pencarian DNS yang merupakan bagian dari permintaan jaringan sistem. Log tersebut mencatat setiap permintaan DNS yang mengubah nama host menjadi alamat IP. Kueri DNS pendukung lainnya, seperti penemuan server nama, tidak direkam.

API logging aktivitas jaringan menampilkan setiap pencarian DNS sebagai instance DnsEvent. Tabel 1 menjelaskan kolom dan nilai standar yang dicatat ke dalam DnsEvent.

Tabel 1. Kolom peristiwa DNS

Data Contoh Deskripsi
Nama host host.example.com Nama host yang dikirim dalam kueri DNS.
Alamat Inet 203.0.113.9, 198.51.100.25 Daftar IPv4 atau IPv6 membahas kueri DNS yang diselesaikan untuk nama host. Agar ukuran log tetap dapat dikelola, hasilnya mungkin tidak menyertakan semua alamat IP—lihat jumlah alamat di baris berikut.
Jumlah alamat 4 Jumlah alamat IP yang ditampilkan dari resolusi kueri DNS. Gunakan ini untuk mengetahui apakah alamat IP yang dicatat adalah bagian dari hasil. Nilai 0 (nol) berarti nama host tidak di-resolve menjadi alamat IP.
Nama paket com.android.chrome Nama paket aplikasi yang membuat kueri DNS.
Stempel waktu 1506297600000 Rekaman stempel waktu saat pencarian DNS terjadi. Nilainya adalah interval milidetik antara pencarian DNS dan tengah malam, 1 Januari 1970 UTC.
ID 25 ID numerik yang meningkat secara monoton. Tersedia di Android 9.0 (API level 28) atau yang lebih tinggi.

Meskipun pencarian DNS dapat membantu admin IT melacak koneksi jaringan, logging jaringan bukanlah solusi perekaman DNS untuk tujuan umum. Berikut adalah beberapa tugas DNS yang mungkin dilakukan aplikasi yang tidak dicatat dalam log:

  • Berkomunikasi secara langsung dengan server nama DNS.
  • Memanggil library DNS Java untuk membuat kueri DNS.
  • Menghindari kueri DNS dengan menghubungkan ke alamat IP tetap.

Koneksi jaringan

Logging jaringan mencatat peristiwa untuk setiap percobaan koneksi yang merupakan bagian dari permintaan jaringan sistem. Log merekam koneksi TCP yang berhasil dan gagal. Transfer UDP tidak direkam.

API logging aktivitas jaringan menampilkan setiap koneksi sebagai instance ConnectEvent. Tabel 2 menjelaskan kolom dan nilai umum yang dicatat ke dalam ConnectEvent.

Tabel 2. Menghubungkan kolom peristiwa

Data Contoh Deskripsi
Alamat Inet 2001:db8::2f:abc:0 Alamat IP yang terhubung ke perangkat. Ini mungkin alamat IPv4 atau IPv6.
Pengambilan 80 Nomor port TCP yang terhubung ke perangkat.
Nama paket com.android.chrome Nama paket aplikasi yang terhubung.
Stempel waktu 1506297600000 Perekaman stempel waktu saat koneksi jaringan terjadi. Nilainya adalah interval milidetik antara koneksi dan tengah malam, 1 Januari 1970 UTC.
ID 26 ID numerik yang meningkat secara monoton. Tersedia di Android 9.0 (API level 28) atau yang lebih tinggi.

Logging jaringan mencatat peristiwa saat aplikasi memanggil library jaringan standar, seperti API bawaan Android atau library pihak ketiga yang populer, untuk terhubung ke host. Aplikasi yang melakukan panggilan sistem secara langsung untuk berkomunikasi tidak dicatat dalam log. Ingat, jaringan UDP tidak dicatat ke dalam log sehingga beberapa aplikasi streaming media, pesan, dan game mungkin tidak muncul dalam log.

Memberi tahu pengguna

Sistem memberi tahu pengguna perangkat bahwa logging aktivitas jaringan aktif. Pengguna akan melihat peringatan berikut di antarmuka:

  • Bagian dalam dialog Pengelolaan perangkat yang menjelaskan DPC Anda adalah memantau traffic jaringan. Pengguna melihat dialog dengan mengetuk label informasi perangkat terkelola di Setelan Cepat.
  • Notifikasi sistem yang dapat ditutup yang ditampilkan saat pengguna baru mengenal logging jaringan. Mengetuk notifikasi akan menampilkan dialog Pemantauan perangkat dengan penjelasan lebih lanjut di bagian pemantauan jaringan. Notifikasi menghilang saat DPC menonaktifkan logging jaringan.

Menambahkan logging jaringan ke DPC

Untuk membantu admin IT meninjau log jaringan, DPC harus dapat menyelesaikan tugas berikut:

  • Aktifkan dan nonaktifkan logging jaringan.
  • Mengambil log yang direkam saat batch baru sudah siap.
  • Mengirim data yang berguna dalam log ke server.

Persyaratan

Logging jaringan tersedia di Android 8.0 (API level 26) atau yang lebih baru untuk pemilik perangkat dan Android 12 (API level 31) atau yang lebih baru untuk pemilik profil profil terkelola. Sebelum mencatat aktivitas jaringan ke dalam log, DPC harus memeriksa apakah ia adalah pemilik perangkat atau pemilik profil dari profil terkelola. Log jaringan di pemilik perangkat dengan profil kerja tidak menyertakan aktivitas jaringan di profil pribadi jika diaktifkan oleh pemilik profil.

Aktifkan logging jaringan

Untuk mulai mencatat aktivitas jaringan ke dalam log, panggil metode DevicePolicyManager setNetworkLoggingEnabled() dan teruskan true sebagai argumen enabled. DPC dapat memanggil isNetworkLoggingEnabled() untuk memeriksa apakah aktivitas jaringan dicatat ke dalam log.

Setelah DPC mengaktifkan logging jaringan, mungkin perlu waktu beberapa saat sebelum batch log pertama siap. Anda mungkin ingin menetapkan ekspektasi untuk admin IT di antarmuka pengguna.

Untuk berhenti mencatat aktivitas jaringan ke dalam log, panggil setNetworkLoggingEnabled() dan teruskan false. Saat admin IT menonaktifkan logging jaringan, sistem akan menghapus log yang dikumpulkan dan tidak dilaporkan.

Mengambil log

DPC Anda dapat mengambil log dalam batch—API logging jaringan tidak memberikan akses acak ke entri individual terdahulu. Jika batch log baru tersedia, subclass DeviceAdminReceiver DPC Anda akan menerima callback onNetworkLogsAvailable(). Callback menyertakan token batch yang dapat digunakan DPC untuk mengambil log. DPC Anda memanggil metode DevicePolicyManager retrieveNetworkLogs() untuk mendapatkan daftar peristiwa jaringan.

Contoh berikut menunjukkan bahwa Anda dapat mengambil log di subclass 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 Anda harus langsung mengambil log karena sistem menghapus log untuk memberi ruang bagi batch baru. Simpan salinan log lokal sampai Anda yakin DPC telah memproses semuanya tanpa masalah.

Memproses log apa pun

Batch log biasanya berisi campuran instance DnsEvent dan ConnectEvent. Untuk mempelajari kolom data pencarian DNS dan koneksi jaringan lebih lanjut, lihat Log peristiwa. Peristiwa berada dalam urutan kronologis dan setiap batch berisi tidak lebih dari 1.200 peristiwa.

Setelah Anda melakukan panggilan untuk mengambil log, pastikan nilai return bukan null. Nilainya mungkin null jika salah satu hal berikut terjadi:

  • Batch yang diwakili oleh token batch tidak lagi tersedia. DPC Anda tidak dapat mengambil batch dan harus menunggu batch berikutnya.
  • Admin IT menonaktifkan logging jaringan.

Contoh sederhana berikut ini menunjukkan cara DPC dapat mengekstrak nama host DNS yang telah di-resolve. DPC Anda memerlukan pemrosesan dan pelaporan yang lebih canggih.

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

Contoh sebelumnya juga menunjukkan cara mendapatkan ID numerik untuk peristiwa yang disertakan dalam Android 9.0 (API level 28) atau yang lebih tinggi. Karena ID meningkat secara monoton untuk setiap peristiwa, Anda dapat membantu admin IT menemukan celah di log mereka. Sistem mereset ID setiap kali DPC mengaktifkan logging atau saat perangkat dimulai ulang.

DPC dapat mengirim seluruh koleksi ke server atau Anda mungkin memutuskan untuk memfilter peristiwa di perangkat. Misalnya, Anda mungkin menawarkan pelaporan yang diizinkan untuk admin IT.

Pengembangan dan pengujian

Saat melakukan pengembangan dan pengujian, Anda mungkin ingin menerima callback onNetworkLogsAvailable() tanpa harus menjelajahi ratusan halaman web. Di Android 9.0 (API level 28) atau yang lebih baru, Anda dapat membuat beberapa contoh permintaan jaringan dan memaksa sistem untuk mengirim callback yang tersedia log. Jalankan perintah Android Debug Bridge (adb) berikut di terminal Anda:

adb shell dpm force-network-logs

Sistem membatasi frekuensi penggunaan alat dan melaporkan perlambatan yang disengaja dalam output terminal. Jika tidak ada log untuk diambil, DPC Anda tidak akan menerima callback.