Vista de gran angular de una computadora portátil abierta sobre un escritorio blanco que muestra un código, con un monitor y una taza de café cerca.

Swimlane crea gráficos de código abierto para ayudar a los equipos de SecOps

3 Minuto de lectura

 

Mientras mantenía una conversación sobre Gorjeo Acerca de la API de Microsoft Graph, estaba convencido de que las funciones tradicionales de eDiscovery de Exchange no estaban disponibles en la API de Microsoft Graph. ¡Y qué equivocado estaba!.

Después de encontrarme con algunos puntos finales que no había visto antes, decidí escribir un paquete de Python llamado graphish. Gráfico Swimlane es un paquete de Python de código abierto que permitirá a TI, operaciones de seguridad (SecOps), desarrolladores y otros buscar y eliminar mensajes de correo electrónico de los buzones de correo utilizando la API de Microsoft Graph.

Si es cliente de Office 365 y tiene Microsoft Azure Active Directory, cumple con todos los requisitos necesarios para usar este nuevo paquete. Sin embargo, debe realizar algunos pasos adicionales antes de poder aprovecharlo al máximo.

Primero, debe decidir el tipo de servicio/aplicación que desea usar al ejecutar este paquete. Para acceder a la API de Microsoft Graph, su organización debe registrar una aplicación en Microsoft Azure AD. Este proceso puede ser complejo, pero por suerte ya escribí una serie de artículos para ayudarle a comprender los tipos de aplicaciones y el uso de la API de Microsoft Graph:

  1. Puntos finales y tipos de aplicaciones OAuth2 de Microsoft
  2. Implementación de OAuth2 de Microsoft: registro de una aplicación
  3. Implementación de OAuth2 de Microsoft: uso de la API de Microsoft Graph

Según el tipo de aplicación, el flujo de trabajo de concesión de autenticación será diferente. Gráfico Admite tipos de registro de aplicaciones tanto Legacy (permisos delegados) como Daemon/Service (permisos de aplicación).

Estos son los conceptos básicos: si desea utilizar un nombre de usuario y una contraseña al acceder a la API de Microsoft Graph, deberá asegurarse de que su aplicación registrada tenga los permisos adecuados para el punto final (con gráfico es decir Mail.ReadWrite) y el tipo es “Delegado”.

Si quieres usar gráfico Como aplicación de servicio/demonio, deberá asegurarse de tener permisos Mail.ReadWrite con el tipo “Aplicación”.”

La captura de pantalla a continuación muestra ambos permisos, lo cual está bien, pero recomiendo elegir uno sobre el otro.

Una vez que tenga la aplicación creada en Azure Active Directory, ahora sigamos adelante e instalemos graphish desde pypi o nuestro repositorio:

Localmente git clone [email protected]:swimlane/graphish.git cd graphish pip install setup.py OS X y Linux: pip install graphish Windows: pip install graphish

Ahora que gráfico Si está instalado, debemos proporcionar los valores adecuados según el tipo de aplicación que haya registrado. En este ejemplo, le mostraré cómo usar la autenticación de aplicaciones (flujo de concesión de credenciales de cliente).

NOTA: Más información sobre cómo utilizar graphish se encuentra aquí.

Para utilizar gráfico con permisos de aplicación, deberá proporcionar clientId, clientSecret y tenantId para crear un objeto GraphConnector.

desde graphish, importe GraphConnector # Para el flujo de autenticación de backend/client_credential, simplemente proporcione el siguiente conector = GraphConnector( clientId='', # sus aplicaciones clientId clientSecret='', # sus aplicaciones clientSecret tenantId='', # sus aplicaciones Azure Tenant ID )

Al usar la autenticación de la aplicación (flujo de autenticación de concesión de credenciales de cliente), puede buscar su propio buzón (predeterminado) o, si pasa un `userPrincipalName`, gráfico buscará en ese buzón (dirección de correo electrónico):

Búsqueda su cuenta que utiliza un flujo de autenticación de servicio/demonio:

de graphish importar Buscar búsqueda = Buscar(conector) nueva_búsqueda = búsqueda.crear( searchFolderName='Búsqueda de phishing', sourceFolder='bandeja de entrada', filterQuery="contiene(asunto, 'EXPIRES')" )

Buscando otro buzón del usuario Usando un flujo de autenticación de servicio/demonio:

de graphish import Search search = Search( conector, userPrincipalName='[email protected]' # el buzón del usuario en el que desea buscar ) 

Una vez que haya creado un nuevo objeto de búsqueda, puede comenzar a crear búsquedas individuales:

new_search = search.create( searchFolderName='Búsqueda de phishing2', sourceFolder='bandeja de entrada', filterQuery="contiene(asunto, 'phish')" )

Después de crear nuestra nueva búsqueda, incluido el nombre de nuestra carpeta de búsqueda (oculta), la carpeta de origen y nuestros términos de búsqueda, podemos recuperar cualquier hallazgo utilizando el método de mensajes:

mensajes = buscar.mensajes() para mensaje en mensajes: print(mensaje)

Aquí hay una lista de las propiedades disponibles en un objeto de mensaje:

  • fecha y hora de envío
  • Enlace web
  • ID de conversación
  • ID de mensaje de Internet
  • identificación
  • se solicita lectura de recibo
  • sujeto
  • Fecha y hora de la última modificación
  • Vista previa del cuerpo
  • de
  • esBorrador
  • conector
  • importancia
  • cambio de clave
  • Fecha y hora de recepción
  • ID de carpeta principal
  • cuerpo
  • se solicita recibo de entrega
  • Responder a
  • a los destinatarios
  • Destinatarios de cc
  • bandera
  • usuario
  • categorías
  • _encabezados
    remitente
  • fecha y hora de creación
  • esLeído
  • tiene archivos adjuntos
  • Destinatarios de bcc
  • Clasificación de inferencia
  • @odata.etag

Si queremos eliminar un mensaje encontrado durante nuestra búsqueda, usamos el método delete_search_messages. Si queremos eliminar otro mensaje, usaremos el método delete.

Para eliminar un mensaje en nuestra carpeta de búsqueda, debemos proporcionar tanto el ID de la carpeta de búsqueda como el ID del mensaje que queremos eliminar.

# Eliminar un mensaje delete = Delete(conector, userPrincipalName='[email protected]', # el buzón del usuario en el que desea buscar el mensaje en mensajes: delete.delete_search_message(search.folderId, message.id)

Hay algunas otras capacidades como actualizar y eliminar búsquedas, pero puede encontrar más información sobre ellas dentro de nuestra repositorio.

¡Feliz caza!

Solicitar una demostración en vivo