Logging aktivitas jaringan

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

Ringkasan

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

Biasanya, DPC mengirimkan log ke server untuk presentasi kepada admin IT. Anda mungkin ingin memproses log lebih lanjut di server Anda atau secara lokal di perangkat seluler. Misalnya, Anda dapat menyiapkan daftar tolak DNS untuk mendeteksi dan memberi tahu tim IT mengenai perilaku mencurigakan.

Ketersediaan

Logging jaringan didukung di Android 8 dan yang lebih tinggi untuk pemilik perangkat. Jika diaktifkan, sistem akan mengumpulkan data aktivitas jaringan perangkat. 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 Anda.

Untuk mempelajari lebih lanjut, baca Pengguna terafiliasi.

Log aktivitas

Saat logging jaringan aktif, Android akan mencatat setiap peristiwa dari aplikasi menggunakan {i>library<i} jaringan sistem. Logging jaringan mencatat dua jenis peristiwa:

  • Pencarian DNS
  • Koneksi jaringan

Pencarian DNS

Pencatatan log jaringan mencatat peristiwa untuk pencarian DNS yang merupakan bagian dari jaringan sistem permintaan. Log ini menangkap setiap permintaan DNS yang me-resolve nama host menjadi IP alamat IPv6 Kueri DNS pendukung lainnya, seperti penemuan server nama, tidak direkam.

API logging aktivitas jaringan menyajikan setiap pencarian DNS sebagai Instance DnsEvent. Tabel 1 menjelaskan {i>field<i} dan tipikal nilai yang dicatat ke dalam DnsEvent.

Tabel 1. Kolom peristiwa DNS

Data Contoh Deskripsi
Hostname host.contoh.com Nama host yang dikirim dalam kueri DNS.
Alamat inet 203.0.113.9, 198.51.100.25 Daftar IPv4 atau IPv6 yang mencakup kueri DNS yang diselesaikan untuk nama {i>host<i}. Agar ukuran log tetap dapat dikelola, hasilnya mungkin tidak mencakup 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 merupakan sebagian 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 Pencatatan 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 (level API 28) atau yang lebih tinggi.

Sementara pencarian DNS dapat membantu admin IT melacak koneksi jaringan, pencatatan jaringan dan tujuan umum perekaman DNS. Berikut adalah beberapa tugas DNS yang mungkin dilakukan aplikasi yang tidak dicatat:

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

Koneksi jaringan

Log jaringan mencatat peristiwa untuk setiap percobaan koneksi yang merupakan bagian dari permintaan jaringan sistem. Perekaman log berhasil dan gagal koneksi—transfer UDP tidak dicatat.

API pencatatan aktivitas jaringan menyajikan setiap koneksi sebagai Instance ConnectEvent. Tabel 2 menjelaskan {i>field<i} dan nilai standar yang dicatat ke dalam ConnectEvent.

Tabel 2. Menghubungkan kolom peristiwa

Data Contoh Deskripsi
Alamat inet 2001:db8::2f:abc:0 Alamat IP yang terhubung dengan perangkat. Ini mungkin alamat IPv4 atau IPv6.
Port 80 Nomor porta TCP yang terhubung ke perangkat.
Nama paket com.android.chrome Nama paket aplikasi yang terhubung.
Stempel waktu 1506297600000 Stempel waktu yang merekam 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 (level API 28) atau yang lebih tinggi.

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

Memberi tahu pengguna

Sistem akan memberi tahu pengguna perangkat bahwa pencatatan aktivitas jaringan sedang aktif. Pengguna lihat peringatan berikut di antarmuka:

  • Bagian di dialog Pengelolaan perangkat yang menjelaskan DPC sedang memantau lalu lintas jaringan. Pengguna melihat dialog dengan mengetuk informasi perangkat terkelola label di Setelan Cepat.
  • Notifikasi sistem yang dapat ditutup ditampilkan saat pengguna baru menggunakan jaringan pembuatan log. Mengetuk notifikasi akan menampilkan dialog Device Monitoring dengan penjelasan lebih lanjut di bagian pemantauan jaringan. Notifikasi menghilang jika DPC menonaktifkan logging jaringan.

Menambahkan logging jaringan ke DPC

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

  • Aktifkan dan nonaktifkan logging jaringan.
  • Ambil log yang direkam saat batch baru sudah siap.
  • Kirim 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, DPC harus memeriksa apakah 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 DevicePolicyManager metode setNetworkLoggingEnabled() dan teruskan true sebagai argumen enabled. DPC Anda dapat memanggil isNetworkLoggingEnabled() untuk memeriksa apakah jaringan aktivitas ini dicatat.

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

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

Mengambil log

DPC Anda dapat mengambil log dalam batch—API logging jaringan tidak memberikan akses acak ke entri individu sebelumnya. Saat batch log baru tersedia, subclass DeviceAdminReceiver DPC menerima Callback onNetworkLogsAvailable(). Callback menyertakan token batch yang dapat digunakan DPC untuk mengambil log. DPC memanggil Metode DevicePolicyManager retrieveNetworkLogs() untuk mendapatkan daftar peristiwa jaringan.

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

Memproses log apa pun

Batch log biasanya berisi campuran DnsEvent dan ConnectEvent. Untuk mempelajari lebih lanjut tentang {i>field<i} data dari Pencarian DNS dan koneksi jaringan, lihat Log peristiwa. Acara dalam urutan kronologis dan setiap batch berisi tidak lebih dari 1.200 peristiwa.

Setelah panggilan Anda untuk mengambil log, pastikan nilai yang ditampilkan bukan null. Tujuan mungkin bernilai null jika salah satu dari 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 menunjukkan cara DPC mengekstrak nama host DNS diselesaikan. 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 bagaimana Anda bisa mendapatkan ID numerik untuk peristiwa yang disertakan dalam Android 9.0 (API level 28) atau yang lebih baru. Karena ID meningkat secara monoton untuk setiap peristiwa, Anda dapat membantu admin IT log mereka. Sistem menyetel ulang ID setiap kali DPC mengaktifkan logging atau ketika perangkat dimulai ulang.

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

Pengembangan dan pengujian

Selagi Anda melakukan pengembangan dan pengujian, Anda mungkin ingin menerima Callback onNetworkLogsAvailable() tanpa harus menelusuri ratusan laman web. Di Android 9.0 (level API 28) atau yang lebih tinggi, Anda bisa membuat beberapa contoh permintaan jaringan dan memaksa sistem untuk mengirim log yang tersedia . Jalankan perintah Android Debug Bridge (adb) berikut di terminal:

adb shell dpm force-network-logs

Sistem membatasi seberapa sering Anda dapat menggunakan alat ini dan melaporkan setiap {i>output <i}yang sengaja dibuat menjadi lambat. Jika tidak ada log untuk DPC tidak akan menerima callback.