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