Este documento explica como um controlador de política de dispositivo (DPC) registra a rede atividades. Continue lendo para saber como adicionar o registro de rede ao DPC.
Visão geral
Registrar a atividade da rede pode ajudar as empresas a detectar e rastrear a disseminação malware nos dispositivos deles. Seu DPC pode chamar APIs de registro de rede para relatar o 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. É possível processar os registros em seu servidor ou localmente na dispositivo. Por exemplo, é possível configurar listas de bloqueio de DNS para detectar e alertar o departamento de sobre comportamento suspeito.
Disponibilidade
A geração de registros de rede é compatível com o Android 8 e versões mais recentes para proprietários de dispositivos. Se ativado, ele coleta dados sobre a atividade de rede do dispositivo. Também é compatível com o Android 12 e versões mais recentes para proprietários de perfis gerenciados e um app delegado com DELEGATION_NETWORK_LOGGING. Quando o registro de rede é ativado pelo proprietário do perfil, os registros de rede inclui atividades de rede do perfil de trabalho e não coleta dados do do perfil pessoal.
Saiba mais em Usuários afiliados.
Logs de eventos
Quando a geração de registros de rede está ativa, o Android registra cada evento dos aplicativos usando a bibliotecas de rede do sistema. A geração de registros de rede registra dois tipos de eventos:
- Buscas DNS
- Conexões de rede
Buscas DNS
O registro de rede registra um evento para buscas DNS que fazem parte da rede do sistema solicitações. Os registros capturam cada solicitação de DNS que resolve um nome de host em um IP endereço IP. Outras consultas DNS de suporte, como descoberta de servidor de nome, não estão a gravação.
As APIs de registro de atividades de rede apresentam cada busca DNS como uma
Instância de DnsEvent
. A Tabela 1 descreve os campos e tipos
valores registrados em um DnsEvent
.
Dados | Exemplo | Descrição |
---|---|---|
Nome do host | host.example.com (link em inglês) | O nome do host enviado na consulta DNS. |
Endereços Inet | 203.0.113.9, 198.51.100.25 | Uma lista de endereços IPv4 ou IPv6 para a consulta DNS resolvida para o nome do host. Para manter o tamanho do registro gerenciável, os resultados podem não incluir todos os endereços IP. Confira 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. |
Carimbo de data/hora | 1506297600000 (link em inglês) | Uma gravação de carimbo de data/hora em que a busca DNS ocorreu. 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 (nível 28 da API) ou versões mais recentes. |
Embora as buscas DNS possam ajudar os administradores de TI rastrear conexões de rede, o registro de rede não é um solução de registro de DNS de uso geral. Aqui estão algumas tarefas de DNS que um app pode realizar que não estão registrados:
- Comunicar-se diretamente com um servidor de nomes DNS.
- Chamar uma biblioteca Java DNS para fazer consultas DNS.
- conectar-se a um endereço IP fixo para evitar uma consulta DNS;
Conexões de rede
O registro de rede registra um evento para cada tentativa de conexão que é parte de um solicitação de rede do sistema. A captura de registros foi realizada com sucesso e com falha do TCP conexões: as transferências UDP não são registradas.
As APIs de registro de atividades de rede apresentam cada conexão como uma
Instância de ConnectEvent
. A Tabela 2 descreve os campos
e valores típicos gravados em um ConnectEvent
.
Dados | Exemplo | Descrição |
---|---|---|
Endereços Inet | 2001:db8::2f:abc:0 (em inglês) | O endereço IP ao qual o dispositivo se conectou. Pode ser um endereço IPv4 ou IPv6. |
Porta | 80 | O número da porta TCP a que o dispositivo está conectado. |
Nome do pacote | com.android.chrome (link em inglês) | O nome do pacote do app que se conectou. |
Carimbo de data/hora | 1506297600000 (link em inglês) | Um carimbo de data/hora do momento em que a conexão de rede aconteceu. O valor é o intervalo de milissegundos entre a conexão e a meia-noite (UTC) do dia 1o de janeiro de 1970. |
ID | 26 | Um ID numérico monotonicamente crescente. Disponível no Android 9.0 (nível 28 da API) 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 as APIs integradas do Android ou as bibliotecas de terceiros mais usadas, para se conectar um host. Os apps que emitem chamadas do sistema diretamente para se comunicar não são registrados. Lembre-se de que a rede UDP não é registrada, portanto, alguns streamings de mídia, e apps de jogos podem não aparecer nos registros.
Informar os usuários
O sistema alerta os usuários do dispositivo de que o registro de atividades de rede está ativo. Usuários verá 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 a caixa de diálogo tocando nas informações do dispositivo gerenciado marcador nas Configurações rápidas.
- Uma notificação do sistema dispensável exibida enquanto o usuário é novo na rede geração de registros. Tocar na notificação mostra a caixa de diálogo Monitoramento de dispositivos com mais explicações em uma seção sobre monitoramento de rede. A notificação desaparece quando o DPC desativa o registro na rede.
Adicionar a geração de registros de rede ao DPC
Para ajudar os administradores de TI a analisar os registros de rede, o DPC precisa concluir a as seguintes tarefas:
- Ative e desative a geração de registros de rede.
- Recupere todos 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 (API de nível 26) ou versões mais recentes para um proprietário do dispositivo e do Android 12 (nível 31 da API) ou mais recente para o proprietário de um perfil perfil gerenciado. Antes de registrar a atividade de rede, o DPC deve verificar proprietário de dispositivo ou de perfil gerenciado. registros de rede em um proprietário do dispositivo com um perfil de trabalho não inclui a atividade de rede no perfil pessoal se tiver sido ativado pelo proprietário do perfil.
Ativar a geração de registros de rede
Para começar a registrar a atividade de rede, chame o método DevicePolicyManager
método setNetworkLoggingEnabled()
e transmita true
como o argumento enabled
. Seu DPC pode ligar
isNetworkLoggingEnabled()
para verificar se a rede
atividade seja registrada.
Depois que o DPC ativar o registro de rede, pode levar algum tempo até que o primeiro lote de registros está pronto. Talvez você queira definir expectativas de entrega para a TI administradores na interface do usuário.
Para interromper o registro de atividade de rede, chame setNetworkLoggingEnabled()
e transmita
false
. Quando um administrador de TI desativa o registro de rede, o sistema exclui qualquer
registros coletados e não informados.
Recuperar registros
Seu DPC pode recuperar registros em lotes. As APIs de registro de rede não fornecem
acesso aleatório a entradas individuais anteriores. Quando um novo lote de registros estiver disponível,
a subclasse DeviceAdminReceiver
do seu DPC recebe
Chamada de retorno de onNetworkLogsAvailable()
. A chamada de retorno
inclui um token de lote que o DPC pode usar para recuperar os registros. Seu DPC chama o método
Método retrieveNetworkLogs()
do DevicePolicyManager
para
uma lista de eventos de rede.
O exemplo a seguir mostra que é possível recuperar os registros
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 deve recuperar os registros imediatamente porque o sistema exclui os registros para dar espaço a novos lotes. É recomendável manter sua cópia local registros até ter certeza de que o DPC processou todos eles sem problemas.
Processe todos os registros
Um lote de registros normalmente contém uma combinação de DnsEvent
e
ConnectEvent
instâncias. Para saber mais sobre os campos de dados
Pesquisas DNS e conexões de rede, consulte Registros de eventos. Eventos
estão em ordem cronológica e cada lote contém no máximo 1.200 eventos.
Após a chamada para recuperar os registros, verifique se o valor de retorno não é null
. A
o valor poderá ser null
se uma das situações a seguir acontecer:
- O lote representado pelo token do lote não está mais disponível. Seu DPC não pode recuperar o lote e deve aguardar o próximo lote.
- 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 de DNS resolvido. 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 conseguir o ID numérico para eventos incluídos no Android 9.0 (nível 28 da API) ou versões mais recentes. Como o ID aumenta monotonicamente para cada evento, você pode ajudar os administradores de TI a identificar lacunas os registros. O sistema redefine o ID sempre que um DPC ativa o registro ou quando o o dispositivo for reiniciado.
Seu DPC pode enviar toda a coleção para um servidor ou você pode decidir filtrar os eventos no dispositivo. Por exemplo, você pode oferecer para administradores de TI.
Desenvolvimento e teste
Enquanto você desenvolve e testa, pode ser interessante receber
onNetworkLogsAvailable()
sem precisar
navegar em centenas de páginas da Web. No Android 9.0 (API de nível 28) ou versões mais recentes,
fazer algumas solicitações de rede de amostra e forçar o sistema a enviar uma solicitação
o retorno de chamada. Execute o seguinte comando do Android Debug Bridge (adb) na sua
terminal:
adb shell dpm force-network-logs
O sistema limita a frequência com que você pode usar a ferramenta e informa qualquer desaceleração intencional na saída do terminal. Se não houver registros para recuperar, o DPC não receberá um callback.