Zapisywanie aktywności sieci

Ten dokument wyjaśnia, w jaki sposób kontroler zasad dotyczących urządzeń (DPC) rejestruje aktywność w sieci. Czytaj dalej, aby dowiedzieć się, jak dodać logowanie sieciowe do kontrolera DPC.

Przegląd

Logowanie aktywności w sieci może pomóc firmom w wykrywaniu i śledzeniu rozprzestrzeniania się złośliwego oprogramowania na urządzeniach. DPC może wywoływać interfejsy API logowania sieciowego, aby raportować połączenia TCP i wyszukiwania DNS z wywołań sieciowych systemu.

Zwykle DPC dostarcza dzienniki na serwer, aby je zaprezentować administratorowi IT. Warto przetworzyć logi na serwerze lub lokalnie na urządzeniu. Możesz na przykład skonfigurować listy odrzuconych DNS, aby wykrywać podejrzane zachowania i ostrzegać administratorów IT o tym działaniu.

Dostępność

Rejestrowanie sieciowe jest obsługiwane na Androidzie 8 i nowszych właścicielach urządzeń. Po włączeniu zbiera dane o aktywności sieciowej urządzenia. Jest również obsługiwana w Androidzie 12 i nowszych dla właściciela profilu zarządzanego oraz aplikacji z przekazanym dostępem (DELEGATION_NETWORK_LOGGING). Gdy właściciel profilu włączy logowanie sieciowe, dzienniki sieciowe będą zawierać tylko aktywność w sieci w profilu służbowym i nie będą zbierać danych z profilu osobistego.

Więcej informacji znajdziesz w artykule Powiązani użytkownicy.

Dzienniki zdarzeń

Gdy logowanie sieciowe jest włączone, Android rejestruje wszystkie zdarzenia z aplikacji za pomocą systemowych bibliotek sieciowych. Logowanie sieciowe rejestruje 2 typy zdarzeń:

  • Wyszukiwania DNS
  • Połączenia sieciowe

Wyszukiwania DNS

Logowanie sieciowe rejestruje zdarzenie wyszukiwań DNS, które są częścią żądań sieciowych systemu. Logi przechwytują każde żądanie DNS, które zmienia nazwę hosta na adres IP. Inne obsługiwane zapytania DNS, np. wykrywanie serwerów nazw, nie są rejestrowane.

Interfejsy API logowania aktywności w sieci przedstawiają każde wyszukiwanie DNS jako instancję DnsEvent. Tabela 1 zawiera opis pól i typowych wartości rejestrowanych w polu DnsEvent.

Tabela 1. Pola zdarzenia DNS

Dane Przykład Opis
Nazwa hosta host.example.com Nazwa hosta wysłana w zapytaniu DNS.
Adresy inet 203.0.113.9, 198.51.100.25 Lista adresów IPv4 lub IPv6 zawiera odpowiedź na zapytanie DNS dotyczące nazwy hosta. Aby zachować rozmiar dziennika, wyniki mogą nie obejmować wszystkich adresów IP (zobacz liczbę adresów w następnym wierszu).
Liczba adresów 4 Liczba adresów IP zwróconych podczas rozpoznawania zapytań DNS. Dzięki temu możesz sprawdzić, czy zarejestrowane adresy IP są podzbiorem wyników. Wartość 0 (zero) oznacza, że nazwa hosta nie została rozpoznana jako adres IP.
Nazwa pakietu com.android.chrome, Nazwa pakietu aplikacji, która wysłała zapytanie DNS.
Sygnatura czasowa 1506297600000 Zapis sygnatury czasowej momentu wyszukiwania DNS. Wartość to milisekundowy odstęp między wyszukiwaniem DNS a północą, 1 stycznia 1970 r. czasu UTC.
ID 25 monotonicznie rosnący identyfikator liczbowy, Dostępne na urządzeniach z Androidem 9.0 (poziom interfejsu API 28) lub nowszym.

Wyszukiwanie DNS może pomóc administratorom IT śledzić połączenia sieciowe, ale logowanie sieciowe nie jest uniwersalnym rozwiązaniem do rejestrowania DNS. Oto kilka zadań DNS, które może wykonywać aplikacja, które nie są logowane:

  • Bezpośrednia komunikacja z serwerem nazw DNS.
  • Wywołanie biblioteki DNS w Javie w celu utworzenia zapytań DNS.
  • Unikanie zapytań DNS przez łączenie się ze stałym adresem IP.

Połączenia sieciowe

Logowanie sieciowe rejestruje zdarzenie dla każdego podjętego połączenia, które jest częścią systemowego żądania sieciowego. Logi przechwytują udane i nieudane połączenia TCP – transfery UDP nie są rejestrowane.

Interfejsy API logowania aktywności w sieci prezentują każde połączenie jako instancję ConnectEvent. Tabela 2 zawiera opis pól i typowych wartości rejestrowanych w polu ConnectEvent.

Tabela 2. Połącz pola zdarzenia

Dane Przykład Opis
Adresy inet 2001:db8::2f:abc:0 Adres IP, z którym połączyło się urządzenie. Może to być adres IPv4 lub IPv6.
Przeniesienie 80 Numer portu TCP, do którego urządzenie zostało podłączone.
Nazwa pakietu com.android.chrome, Nazwa pakietu aplikacji, która się połączyła.
Sygnatura czasowa 1506297600000 Sygnatura czasowa zarejestrowania połączenia z siecią. Wartość to milisekundowy odstęp między połączeniem a północą, 1 stycznia 1970 r. czasu UTC.
ID 26 monotonicznie rosnący identyfikator liczbowy, Dostępne na urządzeniach z Androidem 9.0 (poziom interfejsu API 28) lub nowszym.

Logowanie sieciowe rejestruje zdarzenie, gdy aplikacja wywołuje standardowe biblioteki sieciowe, takie jak wbudowane interfejsy API Androida lub popularne biblioteki innych firm, aby połączyć się z hostem. Aplikacje wydające systemowi połączenia bezpośrednio w celu komunikacji nie są rejestrowane. Pamiętaj, że połączenia z siecią UDP nie są rejestrowane, więc niektóre aplikacje do strumieniowego przesyłania multimediów, wiadomości i gier mogą nie być widoczne w dziennikach.

Informuj użytkowników

System powiadamia użytkowników urządzeń, że logowanie aktywności w sieci jest włączone. Użytkownicy zobaczą w interfejsie te ostrzeżenia:

  • Sekcja w oknie Zarządzanie urządzeniami z objaśnieniem DPC monitoruje ruch w sieci. Użytkownicy mogą wyświetlić to okno, klikając etykietę informacji o zarządzanym urządzeniu w Szybkich ustawieniach.
  • Powiadomienie systemowe, które można zamknąć, wyświetlane, gdy użytkownik dopiero zaczyna korzystać z rejestrowania sieciowego. Po kliknięciu powiadomienia wyświetli się okno Monitorowanie urządzenia z dodatkowym wyjaśnieniem w sekcji monitorowania sieci. Znika ono, gdy DPC wyłączy logowanie sieciowe.

Dodaj logowanie sieciowe do DPC

Aby administratorzy IT mogli sprawdzać dzienniki sieciowe, DPC musi mieć możliwość wykonywania tych zadań:

  • Włącz lub wyłącz logowanie sieciowe.
  • Gdy nowa wsad będzie gotowa, pobierz wszystkie zarejestrowane logi.
  • Wysyłanie przydatnych danych z logów na serwer.

Wymagania

Logowanie sieciowe jest dostępne w Androidzie 8.0 (poziom interfejsu API 26) lub nowszym dla właściciela urządzenia i Androida 12 (poziom interfejsu API 31) lub nowszego w przypadku właściciela profilu zarządzanego. Zanim zarejestrujesz aktywność w sieci, DPC powinien sprawdzić, czy jest właścicielem urządzenia czy profilu zarządzanego profilu. Dzienniki sieci na koncie właściciela urządzenia korzystającego z profilu służbowego nie obejmują aktywności w sieci na profilu osobistym, jeśli włączył ją właściciel profilu.

Włącz logowanie sieciowe

Aby zacząć rejestrować aktywność w sieci, wywołaj metodę DevicePolicyManager setNetworkLoggingEnabled() i przekaż true jako argument enabled. DPC może wywołać metodę isNetworkLoggingEnabled(), by sprawdzić, czy aktywność sieciowa jest rejestrowana.

Zanim DPC włączy logowanie sieciowe, może minąć trochę czasu, zanim pierwsza porcja logów będzie gotowa. Warto określić oczekiwania administratorów IT w swoim interfejsie.

Aby zatrzymać rejestrowanie aktywności w sieci, wywołaj setNetworkLoggingEnabled() i przekaż false. Gdy administrator IT wyłączy logowanie sieciowe, system usuwa wszystkie zebrane i nieraportowane logi.

Pobieranie dzienników

DPC może pobierać dzienniki partiami – interfejsy API logowania sieciowego nie zapewniają przypadkowego dostępu do poszczególnych wpisów. Gdy pojawi się nowa grupa logów, podklasa DeviceAdminReceiver DPC otrzyma wywołanie zwrotne onNetworkLogsAvailable(). Wywołanie zwrotne zawiera token wsadowy, którego DPC może użyć do pobrania dzienników. DPC wywołuje metodę DevicePolicyManager retrieveNetworkLogs(), aby pobrać listę zdarzeń sieciowych.

Ten przykład pokazuje, że można pobrać logi w podklasie 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 powinien od razu pobrać dzienniki, ponieważ system usuwa je, aby zrobić miejsce na nowe wsady. Lokalną kopię dzienników warto zachować do momentu, aż DPC przetworzy je wszystkie bez problemów.

Przetwarzanie logów

Wsadowe logi zwykle zawierają mieszankę instancji DnsEvent i ConnectEvent. Więcej informacji o polach danych związanych z wyszukiwaniami DNS i połączeniami sieciowymi znajdziesz w artykule Dzienniki zdarzeń. Zdarzenia są uporządkowane chronologicznie, a każda grupa zawiera maksymalnie 1200 zdarzeń.

Po wysłaniu wywołania w celu pobrania dzienników sprawdź, czy wartość zwracana nie jest null. Wartość może wynosić null, jeśli wystąpi jedna z tych sytuacji:

  • Wsad reprezentowany przez token wsadowy nie jest już dostępny. DPC nie może pobrać wsadu i poczeka na następną.
  • Administrator IT wyłączył logowanie sieciowe.

Poniższy uproszczony przykład pokazuje, jak DPC może wyodrębnić nazwy hostów DNS. DPC wymaga bardziej zaawansowanego przetwarzania i raportowania.

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

Poprzedni przykład pokazuje też, jak uzyskać identyfikator numeryczny zdarzeń zawartych w Androidzie 9.0 (poziom interfejsu API 28) lub nowszym. Identyfikator rośnie monotonicznie dla każdego zdarzenia, dzięki czemu administratorzy IT mogą łatwiej dostrzec luki w dziennikach. System resetuje identyfikator za każdym razem, gdy DPC włączy logowanie lub gdy urządzenie uruchomi się ponownie.

DPC może wysłać całą kolekcję na serwer lub odfiltrować zdarzenia na urządzeniu. Możesz na przykład zaoferować raportowanie z listy dozwolonych administratorom IT.

Programowanie i testowanie

W czasie programowania i testowania możesz korzystać z wywołań zwrotnych onNetworkLogsAvailable() bez konieczności przeglądania setek stron internetowych. W Androidzie 9.0 (poziom interfejsu API 28) lub nowszym możesz wykonać kilka przykładowych żądań sieciowych i zmusić system do wysłania wywołania zwrotnego dostępnego logów. Uruchom w terminalu to polecenie Android Debug Bridge (adb):

adb shell dpm force-network-logs

System ogranicza częstotliwość, z jaką możesz używać narzędzia, i zgłasza wszelkie przypadki planowanego spowolnienia działania terminala. Jeśli nie ma żadnych logów do pobrania, urządzenie DPC nie otrzyma wywołania zwrotnego.