Logging dell'attività di rete

Questo documento spiega in che modo un controller dei criteri dei dispositivi (DPC) registra l'attività di rete. Continua a leggere per scoprire come aggiungere il logging di rete al tuo DPC.

Panoramica

Logging dell'attività di rete può aiutare le aziende a rilevare e tenere traccia della diffusione di malware sui loro dispositivi. Il DPC può chiamare le API di logging di rete per segnalare le connessioni TCP e le ricerche DNS provenienti dalle chiamate di rete di sistema.

In genere, il DPC invia i log a un server per la presentazione all'amministratore IT. Potresti voler elaborare ulteriormente i log sul tuo server o localmente sul dispositivo. Ad esempio, puoi configurare liste bloccate DNS per rilevare e avvisare gli amministratori IT di comportamenti sospetti.

Disponibilità

Il logging di rete è supportato in Android 8 e versioni successive per i proprietari di dispositivi. Se attivata, raccoglie i dati sull'attività di rete del dispositivo. È inoltre supportato in Android 12 e versioni successive per il proprietario di un profilo gestito e per un'app delegata con DELEGATION_NETWORK_LOGGING. Se il logging di rete è abilitato dal proprietario del profilo, i log di rete includono solo l'attività di rete del profilo di lavoro e non raccolgono dati dal profilo personale.

Per scoprire di più, consulta Utenti affiliati.

Log eventi

Quando il logging di rete è attivo, Android registra ogni evento dalle app utilizzando le librerie di rete del sistema. Il logging di rete registra due tipi di eventi:

  • Ricerche DNS
  • Connessioni di rete

Ricerche DNS

Il logging di rete registra un evento per le ricerche DNS che fanno parte delle richieste di rete di sistema. I log acquisiscono ogni richiesta DNS che risolve un nome host in un indirizzo IP. Altre query DNS di supporto, come il rilevamento dei server dei nomi, non vengono registrate.

Le API di logging delle attività di rete presentano ogni ricerca DNS come istanza DnsEvent. La tabella 1 descrive i campi e i valori tipici registrati in un DnsEvent.

Tabella 1. Campi evento DNS

Dati Esempio Descrizione
Nome host host.example.com Il nome host inviato nella query DNS.
Indirizzi Inet 203.0.113.9, 198.51.100.25 Un elenco di indirizzi IPv4 o IPv6 risolti dalla query DNS per il nome host. Affinché le dimensioni del log restino gestibili, i risultati potrebbero non includere tutti gli indirizzi IP. Vedi il conteggio degli indirizzi nella riga seguente.
Numero di indirizzi 4 Il numero di indirizzi IP restituiti dalla risoluzione delle query DNS. Utilizzalo per scoprire se gli indirizzi IP registrati sono un sottoinsieme dei risultati. Il valore 0 (zero) indica che il nome host non è stato risolto in un indirizzo IP.
Nome pacchetto com.android.chrome. Il nome del pacchetto dell'app che ha eseguito la query DNS.
Timestamp 1506297600000 Un timestamp che registra il momento in cui è avvenuta la ricerca DNS. Il valore è l'intervallo di millisecondi tra la ricerca DNS e la mezzanotte del 1° gennaio 1970 UTC.
ID 25 Un ID numerico crescente monotonica. Disponibile in Android 9.0 (livello API 28) o versioni successive.

Sebbene le ricerche DNS possano aiutare gli amministratori IT a monitorare le connessioni di rete, il logging di rete non è una soluzione di registrazione DNS generica. Ecco alcune attività DNS che un'app potrebbe eseguire e che non vengono registrate:

  • Comunicazione diretta con un server dei nomi DNS.
  • Chiamare una libreria DNS Java per eseguire query DNS.
  • Evitare una query DNS collegandosi a un indirizzo IP fisso.

Connessioni di rete

Il logging di rete registra un evento per ogni tentativo di connessione che fa parte di una richiesta di rete di sistema. I log acquisiscono le connessioni TCP riuscite e non riuscite: i trasferimenti UDP non vengono registrati.

Le API di logging delle attività di rete presentano ogni connessione come istanza ConnectEvent. La tabella 2 descrive i campi e i valori tipici registrati in un ConnectEvent.

Tabella 2. Collega campi evento

Dati Esempio Descrizione
Indirizzi Inet 2001:db8::2f:abc:0 L'indirizzo IP a cui si è connesso il dispositivo. Potrebbe essere un indirizzo IPv4 o IPv6.
Trasferimento 80 Il numero di porta TCP a cui è connesso il dispositivo.
Nome pacchetto com.android.chrome. Il nome del pacchetto dell'app collegata.
Timestamp 1506297600000 Un timestamp che registra il momento in cui si è verificata la connessione di rete. Il valore è l'intervallo di millisecondi tra la connessione e la mezzanotte del 1° gennaio 1970 UTC.
ID 26 Un ID numerico crescente monotonica. Disponibile in Android 9.0 (livello API 28) o versioni successive.

Il logging di rete registra un evento quando un'app chiama librerie di rete standard, come le API integrate di Android o le librerie di terze parti più utilizzate, per connettersi a un host. Le app che emettono direttamente chiamate di sistema per comunicare non vengono registrate. Tieni presente che le reti UDP non vengono registrate, pertanto alcune app di streaming multimediale, messaggistica e gioco potrebbero non essere visualizzate nei log.

Informare gli utenti

Il sistema avvisa gli utenti del dispositivo che il logging dell'attività di rete è attivo. Gli utenti vedono i seguenti avvisi nell'interfaccia:

  • Una sezione della finestra di dialogo Gestione dispositivi in cui viene spiegato che il DPC sta monitorando il traffico di rete. Per visualizzare la finestra di dialogo, gli utenti toccano l'etichetta delle informazioni del dispositivo gestito nelle Impostazioni rapide.
  • Una notifica di sistema ignorabile mostrata quando l'utente non ha mai utilizzato il logging di rete. Se tocchi la notifica, viene visualizzata la finestra di dialogo Monitoraggio dispositivo con ulteriori spiegazioni in una sezione sul monitoraggio della rete. La notifica scompare quando il DPC disattiva il logging di rete.

Aggiungere i log di rete al DPC

Per aiutare gli amministratori IT a esaminare i log di rete, il tuo DPC deve essere in grado di completare le seguenti attività:

  • Attiva e disattiva i log di rete.
  • Recupera tutti i log registrati quando è pronto un nuovo batch.
  • Invia a un server i dati utili dei log.

Requisiti

Il logging di rete è disponibile in Android 8.0 (livello API 26) o versioni successive per il proprietario del dispositivo e in Android 12 (livello API 31) o versioni successive per un proprietario del profilo di un profilo gestito. Prima di registrare l'attività di rete, il DPC deve controllare se si tratta del proprietario di un dispositivo o di un profilo di un profilo gestito. I log di rete in un proprietario del dispositivo con un profilo di lavoro non includono l'attività di rete sul profilo personale se è abilitata dal proprietario del profilo.

Abilita logging della rete

Per avviare il logging dell'attività di rete, chiama il metodo DevicePolicyManager setNetworkLoggingEnabled() e passa true come argomento enabled. Il DPC può chiamare isNetworkLoggingEnabled() per verificare se l'attività di rete è stata registrata.

Dopo che il DPC abilita il logging di rete, potrebbe essere necessario attendere un po' di tempo prima che sia pronto il primo batch di log. Puoi anche impostare le aspettative di consegna per gli amministratori IT nell'interfaccia utente.

Per interrompere il logging dell'attività di rete, chiama setNetworkLoggingEnabled() e supera false. Quando un amministratore IT disattiva il logging di rete, il sistema elimina tutti i log raccolti e non segnalati.

Recupera i log

Il DPC può recuperare i log in batch: le API di logging di rete non forniscono l'accesso casuale alle singole voci precedenti. Quando è disponibile un nuovo batch di log, la sottoclasse DeviceAdminReceiver del tuo DPC riceve il callback onNetworkLogsAvailable(). Il callback include un token batch che il DPC può utilizzare per recuperare i log. Il tuo DPC chiama il metodo DevicePolicyManager retrieveNetworkLogs() per ottenere un elenco di eventi di rete.

Nell'esempio seguente è possibile recuperare i log nella sottoclasse 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 ...
}

Il DPC dovrebbe recuperare i log immediatamente, poiché il sistema li elimina per fare spazio ai nuovi batch. Puoi conservare una copia locale dei log finché non sei sicuro che il DPC li abbia elaborati tutti senza problemi.

Elabora eventuali log

Un batch di log in genere contiene una combinazione di istanze DnsEvent e ConnectEvent. Per scoprire di più sui campi dati delle ricerche DNS e delle connessioni di rete, consulta Log eventi. Gli eventi sono in ordine cronologico e ogni batch non contiene più di 1200 eventi.

Dopo la chiamata per recuperare i log, controlla che il valore restituito non sia null. Il valore potrebbe essere null se si verifica una delle seguenti condizioni:

  • Il batch rappresentato dal token batch non è più disponibile. Il DPC non riesce a recuperare il batch e dovrebbe attendere il batch successivo.
  • L'amministratore IT ha disattivato il logging di rete.

Il seguente esempio semplificato mostra come DPC potrebbe estrarre i nomi host DNS risolti. Il tuo DPC ha bisogno di elaborazione e reporting più sofisticate.

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

L'esempio precedente mostra anche come ottenere l'ID numerico per gli eventi inclusi in Android 9.0 (livello API 28) o versioni successive. Poiché l'ID aumenta monotonicamente per ogni evento, puoi aiutare gli amministratori IT a individuare le lacune nei loro log. Il sistema reimposta l'ID ogni volta che un DPC attiva il logging o al riavvio del dispositivo.

Il DPC può inviare l'intera raccolta a un server oppure potresti decidere di filtrare gli eventi sul dispositivo. Ad esempio, potresti offrire report nella lista consentita per gli amministratori IT.

Sviluppo e test

Durante lo sviluppo e i test, potresti voler ricevere callback di onNetworkLogsAvailable() senza dover sfogliare centinaia di pagine web. In Android 9.0 (livello API 28) o versioni successive, puoi effettuare alcune richieste di rete di esempio e forzare il sistema a inviare un callback disponibile sui log. Esegui il seguente comando Android Debug Bridge (adb) nel terminale:

adb shell dpm force-network-logs

Il sistema limita la frequenza di utilizzo dello strumento e segnala eventuali rallentamenti involontari nell'output del terminale. Se non ci sono log da recuperare, il DPC non riceve una chiamata.