Während eines Gesprächs auf Twitter Was die Microsoft Graph API betrifft, war ich überzeugt, dass die herkömmlichen Exchange eDiscovery-Funktionen in der Microsoft Graph API nicht verfügbar wären. Wie sehr ich mich doch geirrt habe!.
Nachdem ich auf einige Endpunkte gestoßen war, die ich zuvor noch nicht gesehen hatte, beschloss ich, ein Python-Paket namens graphish zu schreiben. Graphish Swimlane ist ein Open-Source-Python-Paket, das es IT-Abteilungen, Sicherheitsabteilungen (SecOps), Entwicklern und anderen ermöglicht, E-Mail-Nachrichten aus Postfächern mithilfe der Microsoft Graph API zu suchen und zu löschen.
Wenn Sie Office 365-Kunde sind und Microsoft Azure Active Directory nutzen, erfüllen Sie alle Voraussetzungen für die Verwendung dieses neuen Pakets. Es sind jedoch einige zusätzliche Schritte erforderlich, bevor Sie das neue Paket vollständig nutzen können.
Zunächst müssen Sie entscheiden, welchen Dienst- bzw. Anwendungstyp Sie beim Ausführen dieses Pakets verwenden möchten. Die Microsoft Graph-API ist zugänglich, sobald Ihre Organisation eine Anwendung bei Microsoft Azure AD registriert hat. Dieser Prozess kann komplex sein, aber glücklicherweise habe ich bereits eine Artikelreihe verfasst, die Ihnen hilft, Anwendungstypen und die Verwendung der Microsoft Graph-API zu verstehen.
- Microsofts OAuth2-Endpunkte und Anwendungstypen
- Microsofts OAuth2-Implementierung: Registrieren einer App
- Microsofts OAuth2-Implementierung: Verwendung der Microsoft Graph-API
Je nach Anwendungstyp ist Ihr Authentifizierungs-Workflow unterschiedlich. Graphish Unterstützt sowohl Legacy- (delegierte Berechtigungen) als auch Daemon/Service-Anwendungsregistrierungstypen (Anwendungsberechtigungen).
Hier die Grundlagen: Wenn Sie beim Zugriff auf die Microsoft Graph-API einen Benutzernamen und ein Kennwort verwenden möchten, müssen Sie sicherstellen, dass Ihre registrierte Anwendung über die entsprechenden Berechtigungen für den Endpunkt verfügt (mit Graphish Das ist Mail.ReadWrite) und der Typ ist “Delegiert”.
Wenn Sie verwenden möchten Graphish Als Daemon-/Dienstanwendung müssen Sie sicherstellen, dass Sie über die Berechtigungen Mail.ReadWrite mit dem Typ “Anwendung” verfügen.”
Der untenstehende Screenshot zeigt beide Berechtigungen – was in Ordnung ist –, aber ich empfehle, sich für eine der beiden zu entscheiden.

Sobald die Anwendung in Azure Active Directory erstellt ist, installieren wir nun graphish von pypi oder aus unserem Repository:
Lokal: `git clone [email protected]:swimlane/graphish.git` `cd graphish` `pip install setup.py` OS X & Linux: `pip install graphish` Windows: `pip install graphish`
Nun, dass Graphish Wenn die Anwendung installiert ist, müssen wir die entsprechenden Werte angeben, je nachdem, welchen Anwendungstyp Sie registriert haben. In diesem Beispiel zeige ich Ihnen, wie Sie die Anwendungsauthentifizierung (Client Credentials Auth Grant Flow) verwenden.
HINWEIS: Weitere Informationen zur Verwendung von graphish finden Sie hier.
Zur Verwendung Graphish Mit den erforderlichen Anwendungsberechtigungen müssen Sie die Client-ID, das Client-Geheimnis und die Mandanten-ID angeben, um ein GraphConnector-Objekt zu erstellen.
from graphish import GraphConnector # Für den Backend-/Client-Credential-Authentifizierungsablauf geben Sie einfach den folgenden Connector an: connector = GraphConnector( clientId='', # Ihre Anwendungs-Client-ID clientSecret='', # Ihr Anwendungs-Client-Secret tenantId='', # Ihre Anwendungs-Azure-Mandanten-ID )
Mithilfe der Anwendungsauthentifizierung (Client Credentials Grant Auth Flow) können Sie Ihr eigenes Postfach durchsuchen (Standard) oder, wenn Sie einen `userPrincipalName` angeben, dann Graphish wird dieses Postfach (E-Mail-Adresse) durchsuchen:
Suche dein Konto, das einen Dienst-/Daemon-Authentifizierungsablauf verwendet:
from graphish import Search search = Search(connector) new_search = search.create( searchFolderName='Phishing Search', sourceFolder='inbox', filterQuery="contains(subject, 'EXPIRES')" )
Suche nach einem anderen Postfach des Benutzers Verwendung eines Dienst-/Daemon-Authentifizierungsablaufs:
from graphish import Search search = Search( connector, userPrincipalName='[email protected]' # the user's mailbox you want to search )
Sobald Sie ein neues Suchobjekt erstellt haben, können Sie mit der Erstellung einzelner Suchvorgänge beginnen:
new_search = search.create( searchFolderName='Phishing Search2', sourceFolder='inbox', filterQuery="contains(subject, 'phish')" )
Nachdem wir unsere neue Suche erstellt haben, einschließlich des Namens unseres Suchordners (ausgeblendet), des Quellordners und unserer Suchbegriffe, können wir alle Ergebnisse mithilfe der Nachrichtenmethode abrufen:
Nachrichten = search.messages() for Nachricht in Nachrichten: print(Nachricht)
Hier ist eine Liste der verfügbaren Eigenschaften eines Nachrichtenobjekts:
- Sendedatum/Uhrzeit
- webLink
- Gesprächs-ID
- Internet-Nachrichten-ID
- Ausweis
- isReadReceiptRequested
- Thema
- Datum und Uhrzeit der letzten Änderung
- bodyPreview
- aus
- ist Entwurf
- Steckverbinder
- Bedeutung
- Schlüssel ändern
- EmpfangsdatumUhrzeit
- übergeordneterOrdnerId
- Körper
- isDeliveryReceiveRequested
- Antwort an
- an Empfänger
- cc-Empfänger
- Flagge
- Benutzer
- Kategorien
- _headers
Absender - Erstellungsdatum/Uhrzeit
- ist gelesen
- hat Anhänge
- bcc-Empfänger
- Inferenzklassifizierung
- @odata.etag
Um eine bei der Suche gefundene Nachricht zu löschen, verwenden wir die Methode `delete_search_messages`. Um eine andere Nachricht zu löschen, verwenden wir die Methode `delete`.
Um eine Nachricht in unserem Suchordner zu löschen, müssen wir sowohl die Suchordner-ID als auch die Nachrichten-ID angeben, die wir löschen möchten.
# Nachricht löschen delete = Delete( connector, userPrincipalName='[email protected]', # das Postfach des Benutzers, das durchsucht werden soll ) for message in messages: delete.delete_search_message(search.folderId, message.id)
Es gibt noch einige weitere Funktionen, wie das Aktualisieren und Löschen von Suchanfragen, aber weitere Informationen dazu finden Sie in unserer Dokumentation. Repository.
Viel Erfolg bei der Jagd!

