Vue grand angle d'un ordinateur portable ouvert sur un bureau blanc affichant du code, avec un écran et une tasse de café à proximité.

Swimlane met à disposition Graphish le code source pour aider les équipes SecOps.

3 Lecture en une minute

 

Tout en ayant une conversation sur Gazouillement Concernant l'API Microsoft Graph, j'étais persuadé que les fonctionnalités traditionnelles d'eDiscovery d'Exchange n'étaient pas disponibles. Quelle erreur !.

Après avoir découvert par hasard quelques points de terminaison que je n'avais jamais vus auparavant, j'ai décidé d'écrire un package Python appelé graphish. Graphique Swimlane est un package Python open-source qui permettra aux équipes informatiques, aux opérations de sécurité (SecOps), aux développeurs et autres de rechercher et de supprimer des messages électroniques dans les boîtes aux lettres à l'aide de l'API Microsoft Graph.

Si vous êtes client Office 365 et disposez de Microsoft Azure Active Directory, vous possédez toutes les prérequises pour utiliser ce nouveau package. Toutefois, quelques étapes supplémentaires sont nécessaires avant de pouvoir l'exploiter pleinement.

Vous devez d'abord choisir le type de service ou d'application que vous souhaitez utiliser pour exécuter ce package. L'API Microsoft Graph est accessible si votre organisation enregistre une application auprès de Microsoft Azure AD. Ce processus peut s'avérer complexe, mais j'ai heureusement déjà rédigé une série d'articles pour vous aider à comprendre les différents types d'applications et l'utilisation de l'API Microsoft Graph :

  1. Points de terminaison et types d'applications OAuth2 de Microsoft
  2. Implémentation OAuth2 de Microsoft : Enregistrement d’une application
  3. Implémentation OAuth2 de Microsoft : Utilisation de l’API Microsoft Graph

En fonction du type d'application, votre flux de travail d'octroi d'autorisation sera différent. Graphique prend en charge les deux types d'enregistrement d'applications : Legacy (autorisations déléguées) et Daemon/Service (autorisations d'application).

Voici les points essentiels : si vous souhaitez utiliser un nom d’utilisateur et un mot de passe pour accéder à l’API Microsoft Graph, vous devez vous assurer que votre application enregistrée dispose des autorisations appropriées pour le point de terminaison (avec graphish c'est-à-dire Mail.ReadWrite) et le type est “ Délégué ”.

Si vous souhaitez utiliser graphish En tant qu'application démon/service, vous devrez vous assurer de disposer des autorisations Mail.ReadWrite de type “ Application ”.”

La capture d'écran ci-dessous montre les deux autorisations, ce qui est normal, mais je recommande d'en choisir une plutôt que l'autre.

Une fois l'application créée dans Azure Active Directory, passons à l'installation de Graphish depuis PyPI ou notre dépôt :

En local : `git clone [email protected]:swimlane/graphish.git` `cd graphish` `pip install setup.py` OS X et Linux : `pip install graphish` Windows : `pip install graphish`

Maintenant, ça graphish Une fois l'application installée, vous devez fournir les valeurs appropriées en fonction du type d'application enregistré. Dans cet exemple, je vais vous montrer comment utiliser l'authentification d'application (flux d'autorisation par identifiants client).

REMARQUE : Vous trouverez plus d'informations sur l'utilisation de Graphish ici.

Pour utiliser graphish Pour créer un objet GraphConnector, vous devrez fournir les autorisations de l'application, notamment le clientId, le clientSecret et le tenantId.

from graphish import GraphConnector # Pour le flux d'authentification backend / client_credential, il suffit de fournir le connecteur suivant : connector = GraphConnector( clientId='', # votre application clientId clientSecret='', # votre application clientSecret tenantId='', # votre application ID de locataire Azure )

En utilisant l'authentification de l'application (flux d'autorisation d'octroi d'informations d'identification du client), vous pouvez effectuer une recherche dans votre propre boîte aux lettres (par défaut) ou, si vous transmettez un `userPrincipalName`, alors graphish effectuera une recherche dans cette boîte aux lettres (adresse e-mail) :

Recherche ton compte utilisant un flux d'authentification de service/démon :

from graphish import Search search = Search(connector) new_search = search.create( searchFolderName='Recherche de phishing', sourceFolder='boîte de réception', filterQuery="contains(subject, 'EXPIRES')" )

Recherche d'un autre boîte aux lettres de l'utilisateur utilisation d'un flux d'authentification de service/démon :

from graphish import Search search = Search( connector, userPrincipalName='[email protected]' # la boîte aux lettres de l'utilisateur que vous souhaitez rechercher ) 

Une fois que vous avez créé un nouvel objet de recherche, vous pouvez commencer à créer des recherches individuelles :

nouvelle_recherche = recherche.créer( nomDuDossierDeRecherche='RecherchePhishing2', dossierSource='boîteDeRéception', requêteFiltre="contient(sujet, 'phishing')" )

Après avoir créé notre nouvelle recherche, en incluant le nom de notre dossier de recherche (caché), le dossier source et nos termes de recherche, nous pouvons récupérer tous les résultats en utilisant la méthode des messages :

messages = search.messages() pour chaque message dans messages : print(message)

Voici la liste des propriétés disponibles pour un objet message :

  • Date d'envoi
  • Lien web
  • conversationId
  • internetMessageId
  • identifiant
  • estReadReceiptRequested
  • sujet
  • date et heure de dernière modification
  • aperçu du corps
  • depuis
  • est un brouillon
  • connecteur
  • importance
  • changeKey
  • date et heure de réception
  • parentFolderId
  • corps
  • un accusé de réception est-il demandé ?
  • répondre à
  • aux destinataires
  • ccDestinataires
  • drapeau
  • utilisateur
  • catégories
  • _en-têtes
    expéditeur
  • date_de_création
  • est lu
  • a des pièces jointes
  • bccDestinataires
  • inférence Classification
  • @odata.etag

Pour supprimer un message trouvé lors de la recherche, on utilise la méthode `delete_search_messages`. Pour supprimer un autre message, on utilise la méthode `delete`.

Pour supprimer un message de notre dossier de recherche, nous devons fournir à la fois l'identifiant du dossier de recherche et l'identifiant du message que nous souhaitons supprimer.

# Supprimer un message delete = Delete( connector, userPrincipalName='[email protected]', # la boîte aux lettres de l'utilisateur que vous souhaitez rechercher ) for message in messages: delete.delete_search_message(search.folderId, message.id)

Il existe d'autres fonctionnalités, comme la mise à jour et la suppression des recherches ; vous trouverez plus d'informations à ce sujet dans notre documentation. dépôt.

Bonne chasse !

Demander une démo en direct