Registro de actividad de red

En este documento, se explica cómo un controlador de política de dispositivo (DPC) registra la actividad de red. Sigue leyendo para aprender a agregar registros de red a tu DPC.

Descripción general

El registro de la actividad de red puede ayudar a las empresas a detectar y rastrear la propagación de software malicioso en sus dispositivos. Tu DPC puede llamar a las APIs de registro de red para informar conexiones TCP y búsquedas de DNS a partir de llamadas de redes del sistema.

Por lo general, tu DPC entrega los registros a un servidor para mostrárselos a un administrador de TI. Recomendamos que sigas procesando los registros en tu servidor o de manera local en el dispositivo. Por ejemplo, puedes configurar listas de bloqueo de DNS para detectar comportamientos sospechosos y alertar a los administradores de TI.

Disponibilidad

El registro de red es compatible con Android 8 y versiones posteriores para los propietarios de dispositivos. Si está habilitada, recopila datos sobre la actividad de red del dispositivo. También es compatible con Android 12 y versiones posteriores para un propietario de perfil de un perfil administrado y una app delegada con DELEGATION_NETWORK_LOGGING. Cuando el propietario del perfil habilita el registro de red, los registros de red solo incluyen la actividad de red del perfil de trabajo y no recopilan datos del perfil personal.

Para obtener más información, consulta el artículo Usuarios afiliados.

Registros de eventos

Cuando el registro de red está activo, Android registra cada evento de las apps que usan las bibliotecas de red del sistema. El registro de red registra dos tipos de eventos:

  • Búsquedas de DNS
  • Conexiones de red

Búsquedas de DNS

El registro de red registra un evento para las búsquedas de DNS que forman parte de las solicitudes de red del sistema. Los registros capturan cada solicitud de DNS que resuelve un nombre de host en una dirección IP. No se registran otras consultas de DNS compatibles, como el descubrimiento del servidor de nombres.

Las APIs de registro de actividad de red presentan cada búsqueda de DNS como una instancia de DnsEvent. En la tabla 1, se describen los campos y valores típicos registrados en un DnsEvent.

Tabla 1: Campos de evento de DNS

Datos Ejemplo Descripción
Nombre de host host.example.com. El nombre de host enviado en la consulta de DNS.
Direcciones inet 203.0.113.9 y 198.51.100.25 Una lista de direcciones IPv4 o IPv6 que se resolvió para el nombre de host en la consulta de DNS. Para que el tamaño del registro siga siendo manejable, es posible que los resultados no incluyan todas las direcciones IP; consulta el recuento de direcciones en la siguiente fila.
Recuento de direcciones 4 La cantidad de direcciones IP mostradas a partir de la resolución de la consulta de DNS. Usa esto para averiguar si las direcciones IP registradas son un subconjunto de los resultados. Un valor de 0 (cero) significa que el nombre de host no se resolvió en una dirección IP.
Nombre de paquete com.android.chrome. Es el nombre del paquete de la app que realizó la consulta de DNS.
Marca de tiempo 1506297600000 Una marca de tiempo que registra cuándo se produjo la búsqueda de DNS. El valor es el intervalo de milisegundos entre la búsqueda de DNS y la medianoche del 1 de enero de 1970 UTC.
ID 25 Es un ID numérico que aumenta de forma monótona. Disponible en Android 9.0 (nivel de API 28) o versiones posteriores.

Si bien las búsquedas de DNS pueden ayudar a los administradores de TI a realizar un seguimiento de las conexiones de red, el registro de red no es una solución de grabación de DNS de uso general. Estas son algunas tareas de DNS que puede realizar una app y que no se registran:

  • Comunicación directa con un servidor de nombres de DNS
  • Cómo llamar a una biblioteca DNS de Java para realizar consultas de DNS
  • Cómo evitar una consulta de DNS mediante la conexión a una dirección IP fija.

Conexiones de red

El registro de red registra un evento por cada intento de conexión que sea parte de una solicitud de red del sistema. Los registros capturan conexiones TCP correctas y fallidas: las transferencias UDP no se registran.

Las APIs de registro de actividad de red presentan cada conexión como una instancia de ConnectEvent. En la tabla 2, se describen los campos y los valores típicos registrados en un ConnectEvent.

Tabla 2: Conecta campos de evento

Datos Ejemplo Descripción
Direcciones inet 2001:db8::2f:abc:0. La dirección IP a la que se conectó el dispositivo. Puede ser una dirección IPv4 o IPv6.
Puerto 80 El número de puerto TCP al que se conectó el dispositivo.
Nombre de paquete com.android.chrome. Es el nombre del paquete de la app que se conectó.
Marca de tiempo 1506297600000 Una marca de tiempo que registra el momento en que se produjo la conexión de red El valor es el intervalo de milisegundos entre la conexión y la medianoche, UTC, del 1 de enero de 1970.
ID 26 Es un ID numérico que aumenta de forma monótona. Disponible en Android 9.0 (nivel de API 28) o versiones posteriores.

El registro de red registra un evento cuando una app llama a bibliotecas de red estándar, como las APIs integradas de Android o bibliotecas populares de terceros, para conectarse a un host. No se registran las apps que emiten llamadas al sistema directamente para comunicarse. Recuerda que la red UDP no se registra, por lo que es posible que algunas apps de transmisión de contenido multimedia, mensajería y videojuegos no aparezcan en los registros.

Informa a los usuarios

El sistema alerta a los usuarios del dispositivo que el registro de actividad de red está activo. Los usuarios ven las siguientes advertencias en la interfaz:

  • Una sección en el diálogo Device management en la que se explica que tu DPC supervisa el tráfico de red. Los usuarios ven el diálogo presionando la etiqueta de información del dispositivo administrado en la Configuración rápida.
  • Una notificación del sistema descartable que se muestra cuando el usuario es nuevo en el registro de red. Cuando se presiona la notificación, se muestra el diálogo Device monitoring con una explicación más detallada en una sección de supervisión de red. La notificación desaparece cuando tu DPC inhabilita el registro de red.

Agrega registro de red a tu DPC

Para ayudar a los administradores de TI a revisar los registros de red, tu DPC debe poder completar las siguientes tareas:

  • Activa y desactiva el registro de red.
  • Recuperar los registros registrados cuando un nuevo lote esté listo.
  • Envía los datos útiles de los registros a un servidor.

Requisitos

El registro de red está disponible en Android 8.0 (nivel de API 26) o versiones posteriores para un propietario de dispositivo y en Android 12 (nivel de API 31) o versiones posteriores para un propietario de perfil de un perfil administrado. Antes de registrar la actividad de red, tu DPC debe verificar si es el propietario de un dispositivo o de un perfil de un perfil administrado. Los registros de red de un propietario de dispositivo con un perfil de trabajo no incluyen la actividad de red del perfil personal si el propietario del perfil la habilitó.

Habilitar registro de red

Para comenzar a registrar la actividad de red, llama al método DevicePolicyManager setNetworkLoggingEnabled() y pasa true como el argumento enabled. Tu DPC puede llamar a isNetworkLoggingEnabled() para verificar si se registró la actividad de red.

Después de que tu DPC habilite el registro de red, puede pasar algún tiempo antes de que el primer lote de registros esté listo. Puedes establecer las expectativas de entrega para los administradores de TI en la interfaz de usuario.

Para dejar de registrar la actividad de red, llama a setNetworkLoggingEnabled() y pasa false. Cuando un administrador de TI desactiva el registro de red, el sistema borra los registros recopilados y no informados.

Recupera registros

Tu DPC puede recuperar registros por lotes: las APIs de registro de red no proporcionan acceso aleatorio a entradas individuales anteriores. Cuando hay un nuevo lote de registros disponible, la subclase DeviceAdminReceiver de tu DPC recibe la devolución de llamada onNetworkLogsAvailable(). La devolución de llamada incluye un token de lote que tu DPC puede usar para recuperar los registros. Tu DPC llama al método retrieveNetworkLogs() de DevicePolicyManager para obtener una lista de eventos de red.

En el siguiente ejemplo, se muestra que puedes recuperar los registros en tu subclase 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 ...
}

Tu DPC debería recuperar los registros de inmediato, ya que el sistema los borra a fin de dejar lugar para lotes nuevos. Es posible que quieras conservar tu copia local de los registros hasta que estés seguro de que el DPC los procesó sin problemas.

Procesa cualquier registro

Por lo general, un lote de registros contiene una combinación de instancias DnsEvent y ConnectEvent. Para obtener más información sobre los campos de datos de las búsquedas de DNS y las conexiones de red, consulta Registros de eventos. Los eventos están en orden cronológico y cada lote no contiene más de 1,200 eventos.

Después de la llamada para recuperar los registros, verifica que el valor que se muestra no sea null. El valor podría ser null si ocurre alguna de las siguientes situaciones:

  • El lote que representa el token de lote ya no está disponible. Tu DPC no puede recuperar el lote y debe esperar el siguiente.
  • El administrador de TI inhabilitó el registro de red.

En el siguiente ejemplo simplificado, se muestra cómo el DPC puede extraer los nombres de host de DNS resueltos. Tu DPC necesita un procesamiento y generación de informes más 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());
  }
}

En el ejemplo anterior, también se muestra cómo puedes obtener el ID numérico de los eventos incluidos en Android 9.0 (nivel de API 28) o versiones posteriores. Debido a que el ID aumenta monótonamente para cada evento, puedes ayudar a los administradores de TI a detectar brechas en sus registros. El sistema restablece el ID cada vez que un DPC habilita el registro o cuando se reinicia el dispositivo.

Tu DPC puede enviar la colección completa a un servidor, o bien puedes optar por filtrar los eventos en el dispositivo. Por ejemplo, puedes ofrecer informes en la lista de entidades permitidas para los administradores de TI.

Desarrollo y pruebas

Mientras desarrollas y pruebas, es posible que desees recibir devoluciones de llamada onNetworkLogsAvailable() sin tener que navegar por cientos de páginas web. En Android 9.0 (nivel de API 28) o versiones posteriores, puedes realizar algunas solicitudes de red de ejemplo y forzar al sistema para que envíe una devolución de llamada con registros disponibles. Ejecuta el siguiente comando de Android Debug Bridge (adb) en tu terminal:

adb shell dpm force-network-logs

El sistema limita la frecuencia con la que puedes usar la herramienta y también informa cualquier ralentización intencional en el resultado de la terminal. Si no hay registros para recuperar, tu DPC no recibirá una devolución de llamada.