Ağ etkinliği günlük kaydı

Bu dokümanda, bir cihaz politikası denetleyicinin (DPC) ağ etkinliğini nasıl günlüğe kaydettiği açıklanmaktadır. DPC'nize ağ günlük kaydını nasıl ekleyeceğinizi öğrenmek için okumaya devam edin.

Genel bakış

Ağ etkinliğinin günlüğe kaydedilmesi, kuruluşların cihazlarındaki kötü amaçlı yazılımın yayılmasını tespit edip izlemesine yardımcı olabilir. DPC'niz, sistem ağ çağrılarındaki TCP bağlantılarını ve DNS aramalarını raporlamak için ağ günlük kaydı API'lerini çağırabilir.

Genellikle DPC'niz günlükleri BT yöneticisine sunulmak üzere bir sunucuya teslim eder. Günlükleri sunucunuzda veya yerel olarak cihazda daha fazla işlemeyi isteyebilirsiniz. Örneğin, BT yöneticilerini şüpheli davranışları tespit edip uyarmak için DNS ret listeleri oluşturabilirsiniz.

Kullanılabilirlik

Ağ günlük kaydı, Android 8 ve sonraki sürümlerde cihaz sahipleri tarafından desteklenir. Etkinleştirilirse cihazın ağ etkinliği hakkında veri toplar. Ayrıca, Android 12 ve sonraki sürümlerde, yönetilen profilin profil sahibi ve DELEGATION_NETWORK_LOGGING olan yetki verilmiş bir uygulama için desteklenir. Ağ günlük kaydı profil sahibi tarafından etkinleştirildiğinde, ağ günlükleri yalnızca iş profili ağ etkinliğini içerir ve kişisel profilden veri toplamaz.

Daha fazla bilgi edinmek için İlişkili kullanıcılar başlıklı makaleyi inceleyin.

Olay günlükleri

Ağ günlük kaydı etkin olduğunda Android, sistem ağ kitaplıklarını kullanarak uygulamalardaki her etkinliği kaydeder. Ağ günlük kaydı iki tür etkinliği kaydeder:

  • DNS aramaları
  • Ağ bağlantıları

DNS aramaları

Ağ günlük kaydı, sistem ağ isteklerinin bir parçası olan DNS aramaları için bir etkinlik kaydeder. Günlükler, ana makine adını IP adresine çözümleyen her bir DNS isteğini kaydeder. Ad sunucusu keşfi gibi diğer destekleyici DNS sorguları kaydedilmez.

Ağ etkinliği günlük kaydı API'leri, her DNS aramasını bir DnsEvent örneği olarak sunar. Tablo 1, DnsEvent içine kaydedilen alanlar ve tipik değerleri açıklar.

Tablo 1. DNS etkinlik alanları

Veri Örnek Açıklama
Ana makine adı barındırıcı.example.com DNS sorgusunda gönderilen ana makinenin adı.
Inet adresleri 203.0.113.9, 198.51.100.25 DNS sorgusunun ana makine adı için çözdüğü IPv4 veya IPv6 adreslerinin listesi. Günlük boyutunu yönetilebilir düzeyde tutmak için sonuçlar tüm IP adreslerini içermeyebilir. Aşağıdaki satırda adres sayısı bölümüne bakın.
Adres sayısı 4 DNS sorgu çözümlemesinden döndürülen IP adreslerinin sayısı. Günlüğe kaydedilen IP adreslerinin, sonuçların bir alt kümesi olup olmadığını öğrenmek için bunu kullanın. 0 (sıfır) değeri, ana makine adının bir IP adresine çözümlenmediği anlamına gelir.
Paket adı com.android.chrome DNS sorgusunu yapan uygulamanın paket adı.
Zaman Damgası 1506297600000 DNS araması gerçekleştiğinde bir zaman damgası kaydı. Değer, DNS araması ile 1 Ocak 1970 UTC gece yarısı arasındaki milisaniye aralığıdır.
ID 25 Tekdüze şekilde artan sayısal kimlik. Android 9.0 (API düzeyi 28) veya sonraki sürümlerde kullanılabilir.

DNS aramaları, BT yöneticilerinin ağ bağlantılarını izlemesine yardımcı olabilir. Ancak ağ günlük kaydı, genel amaçlı bir DNS kayıt çözümü değildir. Bir uygulamanın yapabileceği, ancak günlüğe kaydedilmemiş bazı DNS görevleri şunlardır:

  • Bir DNS alan adı sunucusuyla doğrudan iletişim kurmak.
  • DNS sorguları yapmak için Java DNS kitaplığı çağırma.
  • Sabit bir IP adresine bağlanarak DNS sorgusunu önleme.

Ağ bağlantıları

Ağ günlük kaydı, sistem ağ isteğinin parçası olan her bağlantı girişimi için bir etkinlik kaydeder. Günlükler başarılı ve başarısız TCP bağlantılarını yakalar. UDP aktarımları kaydedilmez.

Ağ etkinliği günlük kaydı API'leri her bağlantıyı bir ConnectEvent örneği olarak sunar. Tablo 2'de, ConnectEvent içine kaydedilen alanlar ve tipik değerler açıklanmaktadır.

Tablo 2. Etkinlik alanlarını bağla

Veri Örnek Açıklama
Inet adresleri 2001:db8::2f:abc:0 Cihazın bağlandığı IP adresi. Bu bir IPv4 veya IPv6 adresi olabilir.
Taşıma 80 Cihazın bağlandığı TCP bağlantı noktası numarası.
Paket adı com.android.chrome Bağlanan uygulamanın paket adı.
Zaman Damgası 1506297600000 Ağ bağlantısı gerçekleştiğinde kaydedilen zaman damgası. Değer, bağlantı ile 1 Ocak 1970 UTC gece yarısı arasındaki milisaniye aralığıdır.
ID 26 Tekdüze şekilde artan sayısal kimlik. Android 9.0 (API düzeyi 28) veya sonraki sürümlerde kullanılabilir.

Ağ günlük kaydı, bir uygulama bir ana makineye bağlanmak için Android'in yerleşik API'leri veya popüler üçüncü taraf kitaplıkları gibi standart ağ kitaplıklarını çağırdığında bir etkinliği kaydeder. İletişim için doğrudan sistem çağrılarını yapan uygulamalar günlüğe kaydedilmez. UDP ağının günlüğe kaydedilmediğini, bu nedenle bazı medya akışı, mesajlaşma ve oyun uygulamalarının günlüklerde görünmeyebileceğini unutmayın.

Kullanıcıları bilgilendirme

Sistem, ağ etkinliği günlük kaydının etkin olduğu konusunda cihaz kullanıcılarına uyarı gönderir. Kullanıcılar arayüzde aşağıdaki uyarıları görür:

  • Cihaz yönetimi iletişim kutusunda, DPC'nizin ağ trafiğini izlediğini açıklayan bir bölüm. Kullanıcılar, iletişim kutusunu Hızlı Ayarlar'daki yönetilen cihaz bilgileri etiketine dokunarak görür.
  • Kullanıcı ağ günlük kaydını kullanmaya yeni başladığında gösterilen kapatılabilir bir sistem bildirimi. Bildirime dokunduğunuzda, ağ izleme bölümünde daha ayrıntılı açıklamaların yer aldığı Cihaz izleme iletişim kutusu gösterilir. DPC'niz ağ günlük kaydını devre dışı bıraktığında bildirim kaybolur.

DPC'nize ağ günlük kaydı ekleme

BT yöneticilerinin ağ günlüklerini incelemesine yardımcı olmak için DPC'nizin aşağıdaki görevleri tamamlayabilmesi gerekir:

  • Ağ günlük kaydını açın ve kapatın.
  • Yeni bir grup hazır olduğunda kayıtlı günlükleri alın.
  • Günlüklerdeki yararlı verileri bir sunucuya gönderin.

Şartlar

Ağ günlük kaydı, cihaz sahibi için Android 8.0 (API düzeyi 26) veya sonraki sürümlerde, yönetilen bir profilin profil sahibi için Android 12 (API düzeyi 31) veya sonraki sürümlerde kullanılabilir. Ağ etkinliğini günlüğe kaydetmeden önce DPC'niz, kendisinin bir cihaz sahibi mi yoksa yönetilen bir profilin profil sahibi mi olduğunu kontrol etmelidir. İş profili olan bir cihaz sahibinin ağ günlükleri, profil sahibi tarafından etkinleştirildiyse kişisel profildeki ağ etkinliğini içermez.

Ağ günlük kaydını etkinleştir

Ağ etkinliğini günlüğe kaydetmeye başlamak için DevicePolicyManager yöntemini setNetworkLoggingEnabled() çağırın ve true yöntemini enabled bağımsız değişkeni olarak iletin. DPC'niz, ağ etkinliğinin günlüğe kaydedilip kaydedilmediğini kontrol etmek için isNetworkLoggingEnabled() numarasını arayabilir.

DPC'niz ağ günlük kaydını etkinleştirdikten sonra ilk günlük grubunun hazır olması biraz zaman alabilir. Kullanıcı arayüzünüzde BT yöneticileri için teslim beklentilerini belirlemek isteyebilirsiniz.

Ağ etkinliğinin günlüğe kaydedilmesini durdurmak için setNetworkLoggingEnabled() numaralı telefonu arayıp false kartını geçirin. BT yöneticisi ağ günlük kaydını kapattığında sistem, toplanan ve bildirilmeyen tüm günlükleri siler.

Günlükleri alma

DPC'niz günlükleri gruplar halinde alabilir. Ağ günlük kaydı API'leri, geçmiş bağımsız girişlere rastgele erişim sağlamaz. Yeni bir günlük grubu mevcut olduğunda DPC'nizin DeviceAdminReceiver alt sınıfı onNetworkLogsAvailable() geri çağırmasını alır. Geri çağırma, DPC'nizin günlükleri almak için kullanabileceği bir toplu jeton içerir. DPC'niz, ağ etkinliklerinin listesini almak için DevicePolicyManager yöntemini retrieveNetworkLogs() kullanır.

Aşağıdaki örnekte DeviceAdminReceiver alt sınıfınızdaki günlükleri alabileceğiniz gösterilmektedir:

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 ...
}

Sistem yeni gruplara yer açmak için günlükleri sildiği için DPC'niz günlükleri hemen almalıdır. DPC'nizin bunları sorunsuz bir şekilde işlediğinden emin olana kadar günlüklerin yerel kopyasını saklayabilirsiniz.

Tüm günlükleri işleme

Bir günlük grubu genellikle DnsEvent ve ConnectEvent örneklerinin bir karışımını içerir. DNS aramalarının ve ağ bağlantılarının veri alanları hakkında daha fazla bilgi edinmek için Etkinlik günlükleri bölümüne bakın. Etkinlikler kronolojik sıradadır ve her grupta en fazla 1.200 etkinlik bulunur.

Günlükleri almak için çağrınızın ardından döndürülen değerin null olmadığını kontrol edin. Aşağıdakilerden biri olursa değer null olabilir:

  • Toplu jeton tarafından temsil edilen grup artık kullanılamıyor. DPC'niz grubu alamıyor ve sonraki grubu beklemesi gerekir.
  • BT yöneticisi ağ günlük kaydını devre dışı bıraktı.

Aşağıdaki basitleştirilmiş örnekte, DPC'nin çözümlenen DNS ana makine adlarını nasıl çıkarabileceği gösterilmektedir. DPC'niz için daha gelişmiş işleme ve raporlama süreçleri gerekir.

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

Önceki örnekte, Android 9.0 (API düzeyi 28) veya sonraki sürümlere dahil edilen etkinlikler için sayısal kimliği nasıl edinebileceğiniz de gösterilmektedir. Kimlik her etkinlik için monoton olarak arttığından, BT yöneticilerinin günlüklerindeki boşlukları tespit etmesine yardımcı olabilirsiniz. DPC günlük kaydını etkinleştirdiğinde veya cihaz yeniden başlatıldığında, sistem kimliği sıfırlar.

DPC'niz tüm koleksiyonu bir sunucuya gönderebilir veya etkinlikleri cihazda filtrelemeyi tercih edebilirsiniz. Örneğin, BT yöneticileri için izin verilenler listesine eklenmiş raporlar sunabilirsiniz.

Geliştirme ve test

Geliştirme ve test aşamasında yüzlerce web sayfasına göz atmak zorunda kalmadan onNetworkLogsAvailable() geri çağırmalarını almak isteyebilirsiniz. Android 9.0 (API düzeyi 28) veya sonraki sürümlerde birkaç örnek ağ isteğinde bulunabilir ve sistemi, günlüklerden erişilebilen bir geri arama göndermeye zorlayabilirsiniz. Terminalinizde aşağıdaki Android Debug Bridge (adb) komutunu çalıştırın:

adb shell dpm force-network-logs

Sistem, aracı kullanma sıklığını sınırlar ve terminal çıktısında meydana gelen kasten yavaşlamaları bildirir. Alınacak günlük yoksa DPC'niz geri arama almaz.