Enquanto conversava sobre Twitter Sobre a API do Microsoft Graph, eu estava convencido de que os recursos tradicionais de eDiscovery do Exchange não estavam disponíveis na API do Microsoft Graph. Como eu estava enganado!.
Depois de me deparar com alguns endpoints que eu não tinha visto antes, decidi escrever um pacote em Python chamado graphish. Gráfico Swimlane é um pacote Python de código aberto que está sendo disponibilizado como código aberto e que permitirá que profissionais de TI, operações de segurança (SecOps), desenvolvedores e outros pesquisem e excluam mensagens de e-mail de caixas de correio usando a API do Microsoft Graph.
Se você é cliente do Office 365 e possui o Microsoft Azure Active Directory, então você tem todos os requisitos necessários para usar este novo pacote. Mas existem alguns passos adicionais que devem ser seguidos antes que você possa aproveitar ao máximo este novo pacote.
Primeiro, você precisa decidir qual tipo de serviço/aplicativo deseja usar ao executar este pacote. A API do Microsoft Graph fica acessível mediante o registro de um aplicativo pela sua organização no Microsoft Azure AD. Esse processo pode ser complexo, mas felizmente eu já escrevi uma série de artigos para ajudar você a entender os tipos de aplicativos e como usar a API do Microsoft Graph:
- Pontos de extremidade e tipos de aplicativos OAuth2 da Microsoft
- Implementação do OAuth2 da Microsoft: Registrando um aplicativo
- Implementação do OAuth2 da Microsoft: usando a API do Microsoft Graph
Dependendo do tipo de aplicação, o fluxo de trabalho de concessão de autenticação será diferente. Gráfico Suporta os tipos de registro de aplicativos Legacy (permissões delegadas) e Daemon/Service (permissões de aplicativo).
Aqui estão os pontos básicos: Se você deseja usar um nome de usuário e senha ao acessar a API do Microsoft Graph, precisará garantir que seu aplicativo registrado tenha as permissões apropriadas para o endpoint (com gráfico ou seja, Mail.ReadWrite) e o tipo é “Delegado”.
Se você quiser usar gráfico Como um aplicativo daemon/serviço, você precisará garantir que tenha permissões de Mail.ReadWrite com o tipo definido como "Aplicativo".“
A captura de tela abaixo mostra ambas as permissões — o que é normal —, mas recomendo escolher uma em detrimento da outra.

Depois de criar a aplicação no Azure Active Directory, vamos instalar o Graphish a partir do PyPI ou do nosso repositório:
Localmente, clone o repositório [email protected]:swimlane/graphish.git, acesse o diretório cd graphish e execute o comando pip install setup.py. No OS X e Linux: execute pip install graphish. No Windows: execute pip install graphish.
Agora que gráfico Após a instalação, devemos fornecer os valores apropriados com base no tipo de aplicativo que você registrou. Neste exemplo, mostrarei como usar a autenticação de aplicativo (fluxo de concessão de autenticação de credenciais do cliente).
NOTA: Mais informações sobre como usar o Graphish podem ser encontradas aqui.
Para usar gráfico Com as permissões de aplicativo, você precisará fornecer o clientId, clientSecret e tenantId para criar um objeto GraphConnector.
from graphish import GraphConnector # Para o fluxo de autenticação de credenciais do cliente/backend, basta fornecer o seguinte: connector = GraphConnector( clientId='', # seu clientId do aplicativo clientSecret='', # seu clientSecret do aplicativo tenantId='', # seu ID de locatário do Azure do aplicativo )
Ao usar a autenticação do aplicativo (Fluxo de Autenticação de Concessão de Credenciais do Cliente), você pode pesquisar sua própria caixa de correio (padrão) ou, se passar um `userPrincipalName`, gráfico irá pesquisar essa caixa de correio (endereço de e-mail):
Pesquisando seu Conta usando um fluxo de autenticação de serviço/daemon:
from graphish import Search search = Search(connector) new_search = search.create( searchFolderName='Phishing Search', sourceFolder='inbox', filterQuery="contains(subject, 'EXPIRES')" )
Procurando outro caixa de correio do usuário Utilizando um fluxo de autenticação de serviço/daemon:
from graphish import Search search = Search( connector, userPrincipalName='[email protected]' # a caixa de correio do usuário que você deseja pesquisar )
Depois de criar um novo objeto de pesquisa, você pode começar a criar pesquisas individuais:
nova_pesquisa = pesquisa.criar( nomeDaPastaDePesquisa='Pesquisa de Phishing 2', pastaDeOrigem='caixaDeEntrada', consultaDeFiltro="contém(assunto, 'phish')")
Após criarmos nossa nova pesquisa, incluindo o nome da pasta de pesquisa (oculta), a pasta de origem e os termos de pesquisa, podemos recuperar quaisquer resultados usando o método de mensagens:
mensagens = pesquisar.mensagens() para mensagem em mensagens: imprimir(mensagem)
Segue abaixo uma lista das propriedades disponíveis em um objeto de mensagem:
- dataHoraEnviada
- Link da web
- ID da conversa
- internetMessageId
- eu ia
- é solicitada confirmação de leitura
- assunto
- últimaDataModificada
- pré-visualização do corpo
- de
- é rascunho
- conector
- importância
- chave de mudança
- dataHoraRecebida
- ID da pasta pai
- corpo
- éComprovanteDeEntregaSolicitado
- responder
- Para os destinatários
- ccDestinatários
- bandeira
- usuário
- categorias
- _cabeçalhos
remetente - createdDateTime
- isRead
- possui anexos
- Destinatários bcc
- inferênciaClassificação
- @odata.etag
Se quisermos excluir uma mensagem encontrada durante nossa pesquisa, usamos o método `delete_search_messages`. Se quisermos excluir outra mensagem, usaríamos o método `delete`.
Para excluir uma mensagem em nossa pasta de pesquisa, precisamos fornecer tanto o ID da pasta de pesquisa quanto o ID da mensagem que queremos excluir.
# Excluir uma mensagem delete = Delete( connector, userPrincipalName='[email protected]', # a caixa de correio do usuário que você deseja pesquisar ) para mensagem em mensagens: delete.delete_search_message(search.folderId, message.id)
Existem algumas outras funcionalidades, como atualizar e excluir pesquisas, mas você pode encontrar mais informações sobre elas em nosso site. repositório.
Boa caçada!

