Registro de atividades de rede

Este documento explica como um controlador de política de dispositivo (DPC, na sigla em inglês) registra a atividade de rede. Continue lendo para saber como adicionar o registro de rede ao DPC.

Visão geral

O registro de atividades de rede pode ajudar as empresas a detectar e rastrear a disseminação de malware nos dispositivos. O DPC pode chamar APIs de geração de registros de rede para relatar conexões TCP e buscas DNS de chamadas de rede do sistema.

Normalmente, o DPC envia registros a um servidor para apresentação a um administrador de TI. Talvez você queira processar os registros mais a fundo no servidor ou localmente no dispositivo. Por exemplo, é possível configurar listas de bloqueio de DNS para detectar e alertar os administradores de TI sobre comportamento suspeito.

Disponibilidade

O registro de rede é compatível com o Android 8 e versões mais recentes para o proprietário do dispositivo. Se ativado, ele coleta dados sobre a atividade de rede do dispositivo. Ele também tem suporte no Android 12 e versões mais recentes para um proprietário de perfil de um perfil gerenciado e um app delegado com DELEGATION_NETWORK_LOGGING. Quando o registro de rede é ativado pelo proprietário do perfil, os registros de rede incluem apenas a atividade de rede do perfil de trabalho e não coletam dados do perfil pessoal.

Para saber mais, leia Usuários afiliados.

Logs de eventos

Quando a geração de registros de rede está ativa, o Android registra cada evento de apps usando as bibliotecas de rede do sistema. O registro de rede registra dois tipos de eventos:

  • Pesquisas DNS
  • Conexões de rede

Pesquisas DNS

O registro de rede registra um evento para buscas DNS que fazem parte das solicitações de rede do sistema. Os registros capturam cada solicitação DNS que resolve um nome do host para um endereço IP. Outras consultas DNS de suporte, como descoberta de servidor de nomes, não são gravadas.

As APIs de registro de atividades de rede apresentam cada busca DNS como uma instância DnsEvent. A Tabela 1 descreve os campos e valores típicos registrados em um DnsEvent.

Tabela 1. Campos de evento DNS

Dados Exemplo Descrição
Nome do host host.exemplo.com O nome do host enviado na consulta DNS.
Endereços IP 203.0.113.9, 198.51.100.25 Uma lista de endereços IPv4 ou IPv6 que a consulta DNS resolveu para o nome do host. Para manter o tamanho do registro gerenciável, os resultados podem não incluir todos os endereços IP. Consulte a contagem de endereços na linha a seguir.
Contagem de endereços 4 O número de endereços IP retornados da resolução da consulta DNS. Use isso para descobrir se os endereços IP registrados são um subconjunto dos resultados. Um valor de 0 (zero) significa que o nome do host não foi resolvido para um endereço IP.
Nome do pacote com.android.chrome (link em inglês) O nome do pacote do app que fez a consulta DNS.
Timestamp (1506297600000). Um registro de carimbo de data/hora de quando a busca DNS aconteceu. O valor é o intervalo de milissegundos entre a busca DNS e a meia-noite de 1o de janeiro de 1970 (UTC).
ID 25 Um ID numérico monotonicamente crescente. Disponível no Android 9.0 (API de nível 28) ou versões mais recentes.

Embora as buscas DNS possam ajudar os administradores de TI a rastrear conexões de rede, a geração de registros de rede não é uma solução de gravação DNS de uso geral. Confira algumas tarefas de DNS que um app pode realizar e que não estão registradas:

  • Comunicar-se diretamente com um servidor de nomes DNS.
  • Chamar uma biblioteca DNS Java para fazer consultas DNS
  • Evitar uma consulta DNS conectando-se a um endereço IP fixo.

Conexões de rede

A geração de registros de rede registra um evento para cada tentativa de conexão que faz parte de uma solicitação de rede do sistema. Os registros capturam conexões TCP bem-sucedidas e com falha. As transferências UDP não são gravadas.

As APIs de registro de atividades de rede apresentam cada conexão como uma instância ConnectEvent. A Tabela 2 descreve os campos e valores típicos registrados em um ConnectEvent.

Tabela 2. Conectar campos de eventos

Dados Exemplo Descrição
Endereços IP 2001:db8::2f:abc:0 (link em inglês) O endereço IP ao qual o dispositivo está conectado. Pode ser um endereço IPv4 ou IPv6.
Portabilidade 80 O número da porta TCP a que o dispositivo se conectou.
Nome do pacote com.android.chrome (link em inglês) O nome do pacote do app conectado.
Timestamp (1506297600000). Um carimbo de data/hora que registra quando a conexão de rede aconteceu. O valor é o intervalo de milissegundos entre a conexão e a meia-noite (UTC) de 1o de janeiro de 1970.
ID 26 Um ID numérico monotonicamente crescente. Disponível no Android 9.0 (API de nível 28) ou versões mais recentes.

A geração de registros de rede registra um evento quando um app chama bibliotecas de rede padrão, como APIs integradas do Android ou bibliotecas conhecidas de terceiros, para se conectar a um host. Os apps que emitem chamadas diretas ao sistema para se comunicar não são registrados. Lembre-se de que a rede UDP não é registrada. Portanto, alguns apps de streaming de mídia, mensagens e jogos podem não aparecer nos registros.

Informar os usuários

O sistema alerta os usuários do dispositivo que o registro de atividade de rede está ativo. Os usuários verão os seguintes avisos na interface:

  • Uma seção na caixa de diálogo Gerenciamento de dispositivos explicando que o DPC está monitorando o tráfego de rede. Os usuários veem essa caixa de diálogo tocando no marcador de informações do dispositivo gerenciado nas Configurações rápidas.
  • Uma notificação do sistema dispensável mostrada enquanto o usuário é novo na geração de registros de rede. Tocar na notificação mostra a caixa de diálogo Monitoramento do dispositivo com mais explicações em uma seção de monitoramento de rede. A notificação desaparece quando o DPC desativa a geração de registros de rede.

Adicionar o registro de rede ao DPC

Para ajudar os administradores de TI a analisar os registros de rede, o DPC precisa concluir as seguintes tarefas:

  • Ative e desative o registro de rede.
  • Recupere os registros gravados quando um novo lote estiver pronto.
  • Envie os dados úteis nos registros para um servidor.

Requisitos

A geração de registros de rede está disponível no Android 8.0 (nível 26 da API) ou versões mais recentes para proprietários de dispositivos e no Android 12 (nível 31 da API) ou versões mais recentes para proprietários de perfis gerenciados. Antes de registrar a atividade de rede, o DPC precisa verificar se é um proprietário do dispositivo ou de um perfil gerenciado. Os registros de rede em um proprietário de dispositivo com um perfil de trabalho não vão incluir a atividade de rede no perfil pessoal se ela for ativada pelo proprietário do perfil.

Ativar registro de rede

Para começar a registrar a atividade de rede, chame o método DevicePolicyManager setNetworkLoggingEnabled() e transmita true como o argumento enabled. O DPC pode chamar isNetworkLoggingEnabled() para verificar se a atividade de rede está registrada.

Depois que o DPC ativar a geração de registros de rede, pode levar algum tempo até que o primeiro lote de registros esteja pronto. Defina expectativas de entrega para administradores de TI na interface do usuário.

Para interromper o registro de atividades de rede, chame setNetworkLoggingEnabled() e transmita false. Quando um administrador de TI desativa a geração de registros de rede, o sistema exclui todos os registros coletados e não informados.

Recuperar registros

O DPC pode recuperar registros em lotes. As APIs de geração de registros de rede não fornecem acesso aleatório a entradas individuais anteriores. Quando um novo lote de registros está disponível, a subclasse DeviceAdminReceiver do DPC recebe o callback onNetworkLogsAvailable(). O callback inclui um token de lote que o DPC pode usar para recuperar os registros. O DPC chama o método DevicePolicyManager retrieveNetworkLogs() para acessar uma lista de eventos de rede.

O exemplo a seguir mostra que é possível recuperar os registros na subclasse 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 ...
}

O DPC recuperará os registros imediatamente porque o sistema os exclui para liberar espaço para novos lotes. Convém manter sua cópia local dos registros até ter certeza de que o DPC processou todos sem problemas.

Processe os registros

Um lote de registros normalmente contém uma combinação de instâncias DnsEvent e ConnectEvent. Para saber mais sobre os campos de dados de pesquisas DNS e conexões de rede, consulte Registros de eventos. Os eventos estão em ordem cronológica, e cada lote não contém mais de 1.200 eventos.

Após a chamada para recuperar os registros, verifique se o valor de retorno não é null. O valor poderá ser null se uma das seguintes situações acontecer:

  • O lote representado pelo token de lote não está mais disponível. O DPC não pode recuperar o lote e precisa aguardar o próximo.
  • O administrador de TI desativou a geração de registros de rede.

O exemplo simplificado a seguir mostra como o DPC pode extrair os nomes de host DNS resolvidos. Seu DPC precisa de processamento e relatórios mais sofisticados.

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

O exemplo anterior também mostra como receber o ID numérico para eventos incluídos no Android 9.0 (API de nível 28) ou versões mais recentes. Como o ID aumenta constantemente para cada evento, você pode ajudar os administradores de TI a detectar lacunas nos registros. O sistema redefine o ID sempre que um DPC ativar a geração de registros ou quando o dispositivo for reiniciado.

O DPC pode enviar toda a coleção a um servidor, ou você pode filtrar os eventos no dispositivo. Por exemplo, você pode oferecer relatórios da lista de permissões a administradores de TI.

Desenvolvimento e teste

Durante o desenvolvimento e os testes, você pode receber callbacks onNetworkLogsAvailable() sem precisar navegar por centenas de páginas da Web. No Android 9.0 (nível 28 da API) ou versões mais recentes, é possível fazer alguns exemplos de solicitações de rede e forçar o sistema a enviar um callback com registro disponível. Execute o seguinte comando do Android Debug Bridge (adb) no seu terminal:

adb shell dpm force-network-logs

O sistema limita a frequência de uso da ferramenta e informa qualquer redução intencional na saída do terminal. Se não houver registros para extrair, o DPC não vai receber um callback.