Publicado en

Búsquedas altamente efectivas en Microsoft 365 eDiscovery con PowerShell

Microsoft Purview

Guía práctica: cómo diseñar búsquedas altamente efectivas en Microsoft 365 eDiscovery (con PowerShell)

Cuando llega una campaña de phishing o spam masivo a tu organización, el reloj empieza a correr. No basta con que “más o menos” encuentres los correos: necesitas una búsqueda quirúrgica, lo suficientemente precisa como para:

  • No dejar fuera instancias del correo malicioso (evitar falsos negativos).
  • No tocar mensajes legítimos (evitar falsos positivos), sobre todo cuando vas a usar un Purge masivo.

En esta guía te muestro, paso a paso, cómo:

  1. Conectarte a Microsoft 365 Compliance/Purview desde PowerShell.
  2. Diseñar una consulta KQL (ContentMatchQuery) altamente precisa.
  3. Ejecutar la búsqueda con New-ComplianceSearch desde PowerShell.

1. Requisitos previos: permisos y contexto

Antes de empezar, asegúrate de tener:

  • Una cuenta con rol adecuado en el portal de Compliance:
    • Compliance Administrator, eDiscovery Manager o equivalente.
  • Acceso a PowerShell en tu equipo (Windows PowerShell o PowerShell 7).
  • Conectividad hacia Microsoft 365 (sin bloqueos de firewall.

Todo lo que vamos a hacer está pensado para trabajar con:

  • Content Search / eDiscovery / Purview en Microsoft 365.
  • Correos almacenados en Exchange Online.

2. Instalar e importar el módulo de PowerShell

El módulo que necesitamos es ExchangeOnlineManagement, que incluye Connect-IPPSSession y los cmdlets de Compliance.

2.1. Instalar el módulo (una sola vez)

Abre PowerShell y ejecuta:

Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser

Si te pregunta por la confianza en el repositorio PSGallery, responde Y.

2.2. Importar el módulo (cada vez que abras PowerShell)

En cada nueva sesión, importa el módulo:

Import-Module ExchangeOnlineManagement

Puedes validar que está cargado con:

Get-Module ExchangeOnlineManagement

3. Cómo conectarse al portal de Compliance/Purview

Para poder usar New-ComplianceSearch, debemos conectarnos al endpoint de Compliance usando Connect-IPPSSession.

3.1. Conexión básica con usuario específico

Connect-IPPSSession -UserPrincipalName tu_usuario@tu_dominio.com
  • Sustituye tu_usuario@tu_dominio.com por tu UPN de administrador o cuenta con permisos de eDiscovery.
  • Se abrirá la ventana de inicio de sesión de Microsoft 365 (con MFA si está habilitado).

3.2. Conexión pidiendo credenciales en ventana

Si prefieres que te pida el usuario directamente en una ventana de login:

Connect-IPPSSession

Una vez conectado, puedes validar que tienes los cmdlets disponibles:

Get-Command *-ComplianceSearch

Deberías ver, entre otros:

  • New-ComplianceSearch
  • Start-ComplianceSearch
  • Get-ComplianceSearch

4. Diseñando una búsqueda altamente efectiva: la huella del correo

El corazón de todo es la query KQL que va en -ContentMatchQuery. La idea es crear una huella (fingerprint) del correo malicioso combinando varias propiedades:

  • kind: tipo de elemento (correo, reunión, archivo, etc.).
  • from: remitente exacto.
  • subject: asunto con IDs o cadenas únicas.
  • body: tokens largos y poco probables (URLs, IDs, hashes).
  • received: fecha o rango de fechas.

Un ejemplo de huella muy precisa para un correo malicioso podría ser:

(kind:email)
AND (from:"bad.sender@malicious-domain.com")
AND (subject:"[ID] 5f9d1c44bfe24e5b9d01a81a")
AND (body:"tZEqcO6opzIqGtbiruXsBFttr6l7a9gdi3Ks")
AND (received:2025-11-27)

Qué aporta cada parte:

  • kind:email: limita la búsqueda a correos electrónicos.
  • from: obliga a que el correo provenga de un remitente muy concreto.
  • subject: usa un ID/hash específico dentro del asunto, muy difícil de encontrar en un correo legítimo.
  • body: usa un token largo del cuerpo (por ejemplo parte de una URL de Zoom/Teams o tracking ID), casi imposible de repetir.
  • received: restringe a los mensajes recibidos en una fecha concreta o rango corto.

El objetivo es conseguir una búsqueda que produzca cero falsos positivos antes de usarla en un purge.


5. Armando la consulta KQL en una variable de PowerShell

En PowerShell es mucho más limpio guardar la consulta en una variable y reutilizarla.

Ejemplo de construcción de la query (adáptala a tu escenario concreto):

$KqlQuery = '(kind:email) AND (from:"bad.sender@malicious-domain.com") AND (subject:"[ID] 5f9d1c44bfe24e5b9d01a81a") AND (body:"tZEqcO6opzIqGtbiruXsBFttr6l7a9gdi3Ks") AND (received:2025-11-27)'

Observa que:

  • La query completa va entre comillas simples en PowerShell, lo que evita problemas con las comillas dobles internas.
  • Dentro de la query usamos comillas dobles para las propiedades KQL (from:"...", subject:"...", etc.).

6. Ejecutar la búsqueda con New-ComplianceSearch (PowerShell)

Una vez conectados y con la query lista, podemos crear y lanzar la búsqueda desde PowerShell.

6.1. Crear la búsqueda

$KqlQuery = '(kind:email) AND (from:"bad.sender@malicious-domain.com") AND (subject:"[ID] 5f9d1c44bfe24e5b9d01a81a") AND (body:"tZEqcO6opzIqGtbiruXsBFttr6l7a9gdi3Ks") AND (received:2025-11-27)'

$Search = New-ComplianceSearch `
  -Name "Busqueda Correo Malicioso 2025-11-27" `
  -ExchangeLocation All `
  -ContentMatchQuery $KqlQuery

Explicación rápida:

  • -Name: nombre descriptivo de la búsqueda (aparecerá en el portal de Compliance).
  • -ExchangeLocation All: ejecuta la búsqueda en todos los buzones de Exchange Online. Puedes limitarlo a ciertos usuarios si lo prefieres.
  • -ContentMatchQuery: recibe la query KQL que definimos.

6.2. Iniciar la búsqueda

Crear la búsqueda no la ejecuta automáticamente; hay que iniciarla:

Start-ComplianceSearch -Identity $Search.Identity

Después de unos minutos (dependiendo del tamaño del tenant), puedes revisar el estado:

Get-ComplianceSearch -Identity $Search.Identity

7. Validar los resultados antes de cualquier purge

Antes de usar esta búsqueda en un proceso de eliminación (purge), valida manualmente que la query es tan precisa como crees.

  1. Ve al portal de Microsoft Purview / eDiscovery.
  2. Localiza la búsqueda con el nombre que usaste en -Name.
  3. Abre la búsqueda y utiliza la opción de Preview (vista previa) para revisar varios resultados:
    • ¿Todos los mensajes corresponden al correo malicioso o a la misma campaña?
    • ¿No aparecen correos legítimos (notificaciones reales de bancos, Zoom, proveedores, etc.)?
  4. Si ves falsos positivos, vuelve a PowerShell, refina $KqlQuery (añadiendo otro token, ajustando fechas, especificando dominio, etc.) y repite el proceso.

Solo cuando estés 100 % seguro de que la búsqueda es quirúrgica deberías plantearte usarla en un purge masivo.

Importante: la ejecución de acciones de borrado (por ejemplo, New-ComplianceSearchAction -Purge) debe seguir tu proceso interno de aprobación y documentación. La idea de este artículo es que llegues con una búsqueda sólida y validada antes de tomar esa decisión.


8. Cerrar la sesión de PowerShell

Cuando termines de trabajar con Compliance y Exchange Online, es buena práctica cerrar las sesiones abiertas:

Disconnect-ExchangeOnline -Confirm:$false

Con esto limpias las conexiones de tu sesión de PowerShell.


9. Conclusión

Diseñar búsquedas “altamente efectivas” en Microsoft 365 eDiscovery no es escribir cualquier texto en el cuadro de búsqueda. Es construir una huella digital del correo malicioso combinando:

  • Tipo de contenido (kind).
  • Remitente (from).
  • Asunto (subject) con IDs o cadenas únicas.
  • Tokens largos del cuerpo (body).
  • Ventanas de tiempo (received).

Con esa huella bien diseñada, más una conexión correcta a Compliance desde PowerShell y el uso de New-ComplianceSearch, tendrás búsquedas potentes y precisas para analizar y erradicar campañas de correo malicioso sin poner en riesgo mensajes legítimos.

En un siguiente artículo puedes ampliar este enfoque con ejemplos concretos para phishing bancario, falsas notificaciones de Zoom/Teams y supuestas facturas electrónicas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tiempo excedido. Por favor completa el captcha nuevamente

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.