Zapisywanie aktywności sieci

Ten dokument wyjaśnia, jak kontroler zasad urządzeń (DPC) rejestruje sieć działania. Czytaj dalej, aby dowiedzieć się, jak dodać logowanie sieciowe do DPC.

Omówienie

Logowanie aktywności w sieci może pomóc firmom wykrywać i śledzić rozprzestrzenianie się złośliwe oprogramowanie. DPC może wywoływać interfejsy API logowania sieciowego, aby zgłaszać TCP połączeń i wyszukiwań DNS z systemowych wywołań sieciowych.

Zwykle DPC dostarcza dzienniki na serwer w celu przedstawienia administratorowi IT. Dzienniki można przetworzyć dokładniej na serwerze lub lokalnie urządzenia. Możesz na przykład skonfigurować listy odrzuconych DNS, aby wykrywać i wysyłać alerty o podejrzanym działaniu.

Dostępność

Rejestrowanie sieciowe jest obsługiwane przez właściciela urządzenia na Androidzie 8 i nowszych. Jeśli włączony, zbiera dane o aktywności urządzenia w sieci. Jest także obsługiwane na Androidzie 12 i nowszych w przypadku właściciela profilu zarządzanego oraz z przekazaną aplikacją z parametrem DELEGATION_NETWORK_LOGGING. Gdy właściciel profilu włączy rejestrowanie sieciowe, dzienniki sieciowe będą rejestrowane tylko uwzględnia aktywność sieciową w profilu służbowym i nie zbiera danych z osobisty profil użytkownika.

Więcej informacji znajdziesz w artykule Użytkownicy stowarzyszeni.

Dzienniki zdarzeń

Gdy logowanie sieciowe jest włączone, Android rejestruje każde zdarzenie z aplikacji, które korzystają z: bibliotekami sieciowymi. Logowanie sieciowe rejestruje 2 typy zdarzeń:

  • Wyszukiwania DNS
  • Połączenia sieciowe

Wyszukiwania DNS

Logowanie sieciowe rejestruje zdarzenie dotyczące wyszukiwań DNS, które są częścią sieci systemowej żądań. Logi przechwytują każde żądanie DNS, które przekształca nazwę hosta w adres IP adresu. Inne obsługujące zapytania DNS, takie jak wykrywanie serwerów nazw, nie są zostały nagrane.

Interfejsy API logowania aktywności w sieci prezentują każde wyszukiwanie DNS jako DnsEvent. Tabela 1 opisuje pola i typowe wartości zarejestrowane w DnsEvent.

Tabela 1. Pola zdarzeń DNS

Dane Przykład Opis
Nazwa hosta host.example.com. Nazwa hosta wysłana w zapytaniu DNS.
Adresy docelowe 203.0.113.9, 198.51.100.25 Lista adresów IPv4 lub IPv6 rozpoznanych przez zapytanie DNS dla nazwy hosta. Aby można było zarządzać rozmiarem dziennika, wyniki mogą nie zawierać wszystkich adresów IP (liczbę adresów znajdziesz w następnym wierszu).
Liczba adresów 4 Liczba adresów IP zwróconych w wyniku rozpoznawania zapytania DNS. Dzięki temu możesz sprawdzić, czy zarejestrowane adresy IP są podzbiorem wyników. Wartość 0 (0) oznacza, że nazwa hosta nie została rozpoznana pod adresem IP.
Nazwa pakietu com.android.chrome, Nazwa pakietu aplikacji, która wysłała zapytanie DNS.
Sygnatura czasowa 1506297600000, Sygnatura czasowa określająca, kiedy przeprowadzono wyszukiwanie DNS. Wartość to odstęp między wyszukiwaniami DNS a północy 1 stycznia 1970 roku czasu UTC wyrażony w milisekundach.
ID 25 Montonicznie rosnący identyfikator numeryczny. Dostępne na Androidzie 9.0 (poziom interfejsu API 28) i nowszym.

Wyszukiwanie DNS może pomóc administratorom IT śledzić połączenia sieciowe, rejestrowanie sieci nie jest ogólnego przeznaczenia do nagrywania DNS. Oto kilka zadań DNS, które może wykonać aplikacja nierejestrowane:

  • Bezpośrednia komunikacja z serwerem nazw DNS.
  • Wywoływanie biblioteki DNS Java w celu tworzenia zapytań DNS.
  • Unikanie zapytań DNS przez nawiązywanie połączenia ze stałym adresem IP.

Połączenia sieciowe

Logowanie sieci rejestruje zdarzenie dla każdego nieudanego połączenia, które jest częścią żądania sieciowego systemu. Dzienniki TCP przechwycono pomyślnie i nie udało się przechwycić połączenia – transfery UDP nie są rejestrowane.

Interfejsy API logowania aktywności w sieci prezentują każde połączenie jako ConnectEvent. Tabela 2 opisuje pola i typowe wartości rejestrowane w ConnectEvent.

Tabela 2. Połącz pola zdarzeń

Dane Przykład Opis
Adresy docelowe 2001:db8::2f:abc:0 Adres IP, z którym urządzenie się połączyło. Może to być adres IPv4 lub IPv6.
Port 80 Numer portu TCP, z którym jest połączone urządzenie.
Nazwa pakietu com.android.chrome, Nazwa pakietu aplikacji, która się połączyła.
Sygnatura czasowa 1506297600000, Sygnatura czasowa wskazująca czas nawiązania połączenia sieciowego. Wartość to przedział czasu między połączeniem a północą (1 stycznia 1970 roku) czasu UTC w milisekundach.
ID 26 Montonicznie rosnący identyfikator numeryczny. Dostępne na Androidzie 9.0 (poziom interfejsu API 28) i nowszym.

Rejestrowanie sieciowe rejestruje zdarzenie, gdy aplikacja wywołuje standardowe biblioteki sieciowe, takich jak wbudowane interfejsy API Androida lub popularne biblioteki innych firm, aby połączyć się hosta. Aplikacje generujące bezpośrednio wywołania systemowe w celu komunikacji nie są rejestrowane. Pamiętaj, że sieci UDP nie są rejestrowane, więc niektóre strumienie multimediów, wiadomości gry mobilne mogą nie pojawiać się w dziennikach.

Informuj użytkowników

System powiadamia użytkowników urządzeń, że zapisywanie aktywności w sieci jest aktywne. Użytkownicy mogą wyświetlić się następujące ostrzeżenia w interfejsie:

  • Sekcja w oknie Zarządzanie urządzeniami wyjaśniająca, że DPC monitoruje i ruchu w sieci. Użytkownicy mogą wyświetlić to okno, klikając informacje o urządzeniu zarządzanym w Szybkich ustawieniach.
  • Powiadomienie systemowe, które można zamknąć, wyświetlane, gdy użytkownik nie jest jeszcze w sieci logowanie. Po kliknięciu powiadomienia pojawi się okno Monitorowanie urządzenia z Wyjaśnienie znajdziesz w sekcji dotyczącej monitorowania sieci. Powiadomienie znika gdy DPC wyłącza rejestrowanie sieciowe.

Dodawanie logowania sieciowego do DPC

Aby ułatwić administratorom IT sprawdzanie dzienników sieciowych, DPC musi mieć możliwość wykonania następujące zadania:

  • Włącz lub wyłącz logowanie sieciowe.
  • Pobierz wszystkie zarejestrowane logi, gdy nowy wsad będzie gotowy.
  • Wyślij przydatne dane z logów na serwer.

Wymagania

Logowanie sieciowe jest dostępne na 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 profilu zarządzanego. Przed zapisaniem aktywności sieciowej DPC powinien sprawdzić, czy właściciela urządzenia lub właściciela profilu zarządzanego. Dzienniki sieci w właściciel urządzenia z profilem służbowym nie uwzględnia aktywności w sieci w profilu osobistym, o ile włączył go właściciel.

Włącz logowanie sieciowe

Aby zacząć rejestrować aktywność sieciową, wywołaj DevicePolicyManager metoda setNetworkLoggingEnabled() i fałsz: true jako argument enabled. DPC może zadzwonić isNetworkLoggingEnabled(), aby sprawdzić, czy sieć aktywność jest zapisywana.

Może minąć trochę czasu, zanim DPC włączy rejestrowanie sieciowe pierwsza porcja logów jest gotowa. Warto określić oczekiwania dotyczące dostarczania treści za pomocą konsoli administracyjnej.

Aby zatrzymać rejestrowanie aktywności w sieci, wywołaj setNetworkLoggingEnabled() i przekaż false Gdy administrator wyłączy rejestrowanie sieciowe, system usunie wszystkie zbierane i niezgłoszone dzienniki.

Pobieranie logów

DPC może pobierać dzienniki partiami – interfejsy API logowania sieciowego nie udostępniają losowego dostępu do wcześniejszych wpisów. Gdy dostępna będzie nowa grupa logów, podklasa DeviceAdminReceiver DPC otrzyma wartość onNetworkLogsAvailable() oddzwonienie. Wywołanie zwrotne zawiera token wsadowy, którego DPC może użyć do pobrania dzienników. DPC wywołuje metodę DevicePolicyManager metoda retrieveNetworkLogs() do pobierz listę zdarzeń sieciowych.

Poniższy przykład pokazuje, jak można pobrać logi z Podklasa 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 aby uzyskać miejsce na nowe wsady. Warto zachować lokalną kopię aż będziesz mieć pewność, że DPC przetworzył je wszystkie bez problemów.

Przetwarzaj logi

Zbiór dzienników zawiera zwykle mieszankę wartości DnsEvent i ConnectEvent instancji. Aby dowiedzieć się więcej o polach danych Wyszukiwania DNS i połączenia sieciowe patrz Dzienniki zdarzeń. Wydarzenia są uporządkowane chronologicznie, a każda grupa zawiera nie więcej niż 1200 wydarzeń.

Po wywołaniu pobrania dzienników sprawdź, czy zwrócona wartość nie wynosi null. wartością może być null, jeśli wystąpi jedna z tych sytuacji:

  • Grupa reprezentowana przez token wsadowy nie jest już dostępna. Twój DPC nie może pobrać wsadu i powinien zaczekać na następną wsad.
  • Administrator IT wyłączył logowanie sieciowe.

Ten uproszczony przykład pokazuje, jak DPC może wyodrębniać nazwy hostów DNS . Twój DPC wymaga bardziej złożonych procesów 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());
  }
}

W poprzednim przykładzie pokazujemy też, jak uzyskać identyfikator numeryczny dla zdarzeń dostępnych w Androidzie 9.0 (poziom interfejsu API 28) lub nowszym. Ponieważ identyfikator monotonicznie zwiększa się dla każdego zdarzenia, możesz pomóc administratorom IT dostrzec luki ich dzienniki. System resetuje identyfikator za każdym razem, gdy DPC włączy logowanie lub gdy ponowne uruchomienie urządzenia.

DPC może wysłać całą kolekcję na serwer. Możesz też filtrować zdarzenia na urządzeniu. Możesz na przykład zaoferować listę dozwolonych, i raportowania dla administratorów IT.

Programowanie i testowanie

W trakcie programowania i testowania możesz otrzymywać onNetworkLogsAvailable() wywołań zwrotnych bez konieczności przeglądać setki stron internetowych. W Androidzie 9.0 (poziom interfejsu API 28) lub nowszym możesz wykonaj kilka przykładowych żądań sieciowych i wymuś wysłanie przez system logów oddzwanianie. Uruchom w komponencie Android Debug Bridge (adb) polecenie terminal:

adb shell dpm force-network-logs

System ogranicza częstotliwość korzystania z narzędzia i zgłasza celowe spowolnienie pracy na danych wyjściowych terminala. Jeśli nie ma żadnych logów do DPC nie otrzyma oddzwonienia.