Microsoft 365 Defender is a unified platform for preventative protection, post-breach detection, automated investigation, and response. This connector facilitates the automated operations related to indicators such as files, machines, IP, Domain, or actor.
This document provides information about the Microsoft 365 Defender Connector, which facilitates automated interactions, with a Microsoft 365 Defender server using FortiSOAR™ playbooks. Add the Microsoft 365 Defender Connector as a step in FortiSOAR™ playbooks and perform automated operations with Microsoft 365 Defender.
Connector Version: 1.0.0
FortiSOAR™ Version Tested on: 7.3.0-2034 and later
Microsoft 365 Defender Tested on: Cloud Instance
Authored By: Fortinet
Certified: Yes
You can get authentication tokens to access the security graph APIs using two methods:
Incident.ReadIncident.ReadWriteAdvancedHunting.ReadTENANT_ID, CLIENT_ID, and REDIRECT_URI with your own tenant ID, client ID, and redirect URI: https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/authorize?response_type=code&scope=offline_access https://api.security.microsoft.com/.default&client_id=CLIENT_ID&redirect_uri=REDIRECT_URIREDIRECT_URI?code=AUTH_CODE&session_state=SESSION_STATEAUTH_CODE (without the code= prefix) and paste it in your instance configuration in the Authorization Code parameter.Incident.Read.AllIncident.ReadWrite.AllAdvancedHunting.Read.AllUse the Content Hub to install the connector. For the detailed procedure to install a connector, click here.
You can also use the yum command as a root user to install the connector:
yum install cyops-connector-microsoft-365-defender
For the minimum permissions required, refer to Getting Access Tokens section.
For the procedure to configure a connector, click here
In FortiSOAR™, on the Connectors page, click the Microsoft 365 Defender connector row (if you are in the Grid view on the Connectors page) and in the Configurations tab enter the required configuration details:
| Parameter | Description |
|---|---|
| Get Access Token | Select the method using which you will get authentication tokens used to access the Microsoft 365 Defender APIs. You can choose from one of the following options:
|
| Server URL | The service-based URL to which you connect and perform the automated operations. |
| Directory (tenant) ID | The ID of the tenant that you have been provided for your Azure Active Directory application. |
| Application (client) ID | Unique ID of the Azure Active Directory application that is used to create an authentication token required to access the API. |
| Application (Client) Secret | Unique Client Secret of the Azure Active Directory application that is used to create an authentication token required to access the API. |
| Authorization Code | (Only Applicable to On behalf of User - Delegate Permission) The authorization code that you acquired during the authorization step. For more information, see the Getting Access Tokens using the On behalf of the user - Delegate Permission method section. |
| Redirect URI | (Only Applicable to On behalf of User - Delegate Permission) The redirect_uri of your app, where authentication responses can be sent and received by your app. The redirect URL that you specify here must exactly match one of the redirect_uri's you have registered in your app registration portal. |
| Verify SSL | Specifies whether the SSL certificate for the server is to be verified or not. By default, this option is set to True. |
The following automated operations can be included in playbooks and you can also use the annotations to access operations from FortiSOAR™ release 4.10.0 and onwards:
| Function | Description | Annotation and Category |
|---|---|---|
| Get Incidents List | Retrieves a list of incidents along with their status for users to sort through and create an informed cybersecurity response. It exposes a collection of incidents that were flagged in your network, based on the time range, incident owner and other details that you have specified. | list_incidents Investigation |
| Get Incident Details | Retrieves the details of a specific incident based on the incident ID that you have specified. | get_incident Investigation |
| Update Incident | Updates the owner, status, comments, and other details of existing incidents based on the incident ID that you have specified. | update_incident Investigation |
| Advanced Hunting | Retrieves data from the past 30 days based on the query that you have specified. | advanced_hunting Investigation |
| Parameter | Description |
|---|---|
| Last Update Time | Specify the time when the incident was last updated on the server. |
| Status | Specify the current status of the incident. |
| Created Time | Specify the time when incident was first created. |
| Assigned To | Specify the incident owner's email address. |
| Offset | (Optional) Specify the count of the first few records to skip while retrieving response from Defender Endpoint API. |
| Limit | (Optional) Specify the maximum number of incidents that this operation should return from Microsoft 365 Defender. The maximum values it can return is 100. |
The output contains the following populated JSON schema:
{
"@odata.context": "",
"value": [
{
"incidentId": "",
"incidentUri": "",
"redirectIncidentId": "",
"incidentName": "",
"createdTime": "",
"lastUpdateTime": "",
"assignedTo": "",
"classification": "",
"determination": "",
"status": "",
"severity": "",
"tags": [],
"comments": [],
"alerts": [
{
"alertId": "",
"providerAlertId": "",
"incidentId": "",
"serviceSource": "",
"creationTime": "",
"lastUpdatedTime": "",
"resolvedTime": "",
"firstActivity": "",
"lastActivity": "",
"title": "",
"description": "",
"category": "",
"status": "",
"severity": "",
"investigationId": "",
"investigationState": "",
"classification": "",
"determination": "",
"detectionSource": "",
"detectorId": "",
"assignedTo": "",
"actorName": "",
"threatFamilyName": "",
"mitreTechniques": [],
"devices": [],
"entities": [
{
"entityType": "",
"evidenceCreationTime": "",
"verdict": "",
"remediationStatus": "",
"accountName": "",
"userSid": "",
"aadUserId": "",
"userPrincipalName": ""
}
]
}
]
}
]
}
| Parameter | Description |
|---|---|
| Incident ID | Specify the unique identifier that represents the incident to fetch its details. |
The output contains the following populated JSON schema:
{
"@odata.context": "",
"incidentId": "",
"incidentUri": "",
"redirectIncidentId": "",
"incidentName": "",
"createdTime": "",
"lastUpdateTime": "",
"assignedTo": "",
"classification": "",
"determination": "",
"status": "",
"severity": "",
"tags": [],
"comments": [],
"alerts": [
{
"alertId": "",
"providerAlertId": "",
"incidentId": "",
"serviceSource": "",
"creationTime": "",
"lastUpdatedTime": "",
"resolvedTime": "",
"firstActivity": "",
"lastActivity": "",
"title": "",
"description": "",
"category": "",
"status": "",
"severity": "",
"investigationId": "",
"investigationState": "",
"classification": "",
"determination": "",
"detectionSource": "",
"detectorId": "",
"assignedTo": "",
"actorName": "",
"threatFamilyName": "",
"mitreTechniques": [],
"devices": [],
"entities": [
{
"entityType": "",
"evidenceCreationTime": "",
"verdict": "",
"remediationStatus": "",
"accountName": "",
"userSid": "",
"aadUserId": "",
"userPrincipalName": ""
}
]
}
]
}
| Parameter | Description |
|---|---|
| Incident ID | Specify the unique identifier that represents the incident to update it. |
| Status | Select from drop-down the status with which to update the incident. |
| Assigned To | Specify the incident owner's email address. |
| Classification | Select from drop-down the specification of the incident:
|
| Tags | Specify a list of incident tags. |
| Comment | Specify a comment to be added to the incident. |
The output contains the following populated JSON schema:
{
"status": "",
"assignedTo": "",
"classification": "",
"determination": "",
"tags": [],
"comments": [
{
"comment": "",
"createdBy": "",
"createdTime": ""
}
]
}
| Parameter | Description |
|---|---|
| Query | Specify a query to examine the past 30 days of event data in Microsoft 365 Defender. For more information on the queries, refer to Microsoft 365 Defender Advanced hunting. |
The output contains the following populated JSON schema:
{
"Stats": {
"ExecutionTime": "",
"resource_usage": {
"cache": {
"memory": {
"hits": "",
"misses": "",
"total": ""
},
"disk": {
"hits": "",
"misses": "",
"total": ""
}
},
"cpu": {
"user": "",
"kernel": "",
"total cpu": ""
},
"memory": {
"peak_per_node": ""
}
},
"dataset_statistics": [
{
"table_row_count": "",
"table_size": ""
}
]
},
"Schema": [
{
"Name": "",
"Type": ""
}
],
"Results": [
{
"Timestamp": "",
"FileName": "",
"InitiatingProcessFileName": ""
},
{
"Timestamp": "",
"FileName": "",
"InitiatingProcessFileName": ""
}
]
}
The Sample - Microsoft 365 Defender - 1.0.0 playbook collection comes bundled with the Microsoft 365 Defender connector. These playbooks contain steps using which you can perform all supported actions. You can see bundled playbooks in the Automation > Playbooks section in FortiSOAR™ after importing the Microsoft 365 Defender connector.
Note: If you are planning to use any of the sample playbooks in your environment, ensure that you clone those playbooks and move them to a different collection, since the sample playbook collection gets deleted during connector upgrade and delete.
Use the Data Ingestion Wizard to easily ingest data into FortiSOAR™ by pulling data from Defender for Endpoint. For more information on the Data Ingestion Wizard, see the Connectors Guide in the FortiSOAR™ product documentation.
You can configure data ingestion using the Data Ingestion Wizard to seamlessly map Microsoft 365 Defender content to related FortiSOAR™ modules.
The Data Ingestion Wizard enables you to configure scheduled pulling of data from Microsoft 365 Defender into FortiSOAR™. It also lets you pull some sample data from Microsoft 365 Defender using which you can define the mapping of data between Microsoft 365 Defender and FortiSOAR™. The mapping of common fields is generally already done by the Data Ingestion Wizard; users mostly require to only map any custom fields that are added to the Microsoft 365 Defender incident.

x minutes, status, last updated time, and assigned To fields to filter incidents pulled from Microsoft 365 Defender. The fetched data is used to create a mapping between the Microsoft 365 Defender data and FortiSOAR™ incidents.
On the Field Mapping screen, map the fields of a Microsoft 365 Defender incident to the fields of an incident present in FortiSOAR™.

For more information on field mapping, see the Data Ingestionchapter in the "Connectors Guide" in the FortiSOAR™ product documentation. Once you have completed mapping fields, click Save Mapping & Continue.
(Optional) Use the Scheduling screen to configure schedule-based ingestion, i.e., specify the polling frequency to Microsoft 365 Defender, so that the content gets pulled from the Microsoft 365 Defender integration into FortiSOAR™.
On the Scheduling screen, from the Do you want to schedule the ingestion? drop-down list, select Yes.
In the “Configure Schedule Settings” section, specify the Cron expression for the schedule. For example, if you want to pull data from Microsoft 365 Defender every 5 minutes, click Every X Minute and in the minute box enter */5. This would mean that based on the configuration you have set up, data, i.e., incidents will be pulled from Microsoft 365 Defender every 5 minutes.

Once you have completed scheduling, click Save Settings & Continue.
The Summary screen displays a summary of the mapping done, and it also contains links to the Ingestion playbooks. Click Done to complete the data ingestion and exit the Data Ingestion Wizard.
Microsoft 365 Defender is a unified platform for preventative protection, post-breach detection, automated investigation, and response. This connector facilitates the automated operations related to indicators such as files, machines, IP, Domain, or actor.
This document provides information about the Microsoft 365 Defender Connector, which facilitates automated interactions, with a Microsoft 365 Defender server using FortiSOAR™ playbooks. Add the Microsoft 365 Defender Connector as a step in FortiSOAR™ playbooks and perform automated operations with Microsoft 365 Defender.
Connector Version: 1.0.0
FortiSOAR™ Version Tested on: 7.3.0-2034 and later
Microsoft 365 Defender Tested on: Cloud Instance
Authored By: Fortinet
Certified: Yes
You can get authentication tokens to access the security graph APIs using two methods:
Incident.ReadIncident.ReadWriteAdvancedHunting.ReadTENANT_ID, CLIENT_ID, and REDIRECT_URI with your own tenant ID, client ID, and redirect URI: https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/authorize?response_type=code&scope=offline_access https://api.security.microsoft.com/.default&client_id=CLIENT_ID&redirect_uri=REDIRECT_URIREDIRECT_URI?code=AUTH_CODE&session_state=SESSION_STATEAUTH_CODE (without the code= prefix) and paste it in your instance configuration in the Authorization Code parameter.Incident.Read.AllIncident.ReadWrite.AllAdvancedHunting.Read.AllUse the Content Hub to install the connector. For the detailed procedure to install a connector, click here.
You can also use the yum command as a root user to install the connector:
yum install cyops-connector-microsoft-365-defender
For the minimum permissions required, refer to Getting Access Tokens section.
For the procedure to configure a connector, click here
In FortiSOAR™, on the Connectors page, click the Microsoft 365 Defender connector row (if you are in the Grid view on the Connectors page) and in the Configurations tab enter the required configuration details:
| Parameter | Description |
|---|---|
| Get Access Token | Select the method using which you will get authentication tokens used to access the Microsoft 365 Defender APIs. You can choose from one of the following options:
|
| Server URL | The service-based URL to which you connect and perform the automated operations. |
| Directory (tenant) ID | The ID of the tenant that you have been provided for your Azure Active Directory application. |
| Application (client) ID | Unique ID of the Azure Active Directory application that is used to create an authentication token required to access the API. |
| Application (Client) Secret | Unique Client Secret of the Azure Active Directory application that is used to create an authentication token required to access the API. |
| Authorization Code | (Only Applicable to On behalf of User - Delegate Permission) The authorization code that you acquired during the authorization step. For more information, see the Getting Access Tokens using the On behalf of the user - Delegate Permission method section. |
| Redirect URI | (Only Applicable to On behalf of User - Delegate Permission) The redirect_uri of your app, where authentication responses can be sent and received by your app. The redirect URL that you specify here must exactly match one of the redirect_uri's you have registered in your app registration portal. |
| Verify SSL | Specifies whether the SSL certificate for the server is to be verified or not. By default, this option is set to True. |
The following automated operations can be included in playbooks and you can also use the annotations to access operations from FortiSOAR™ release 4.10.0 and onwards:
| Function | Description | Annotation and Category |
|---|---|---|
| Get Incidents List | Retrieves a list of incidents along with their status for users to sort through and create an informed cybersecurity response. It exposes a collection of incidents that were flagged in your network, based on the time range, incident owner and other details that you have specified. | list_incidents Investigation |
| Get Incident Details | Retrieves the details of a specific incident based on the incident ID that you have specified. | get_incident Investigation |
| Update Incident | Updates the owner, status, comments, and other details of existing incidents based on the incident ID that you have specified. | update_incident Investigation |
| Advanced Hunting | Retrieves data from the past 30 days based on the query that you have specified. | advanced_hunting Investigation |
| Parameter | Description |
|---|---|
| Last Update Time | Specify the time when the incident was last updated on the server. |
| Status | Specify the current status of the incident. |
| Created Time | Specify the time when incident was first created. |
| Assigned To | Specify the incident owner's email address. |
| Offset | (Optional) Specify the count of the first few records to skip while retrieving response from Defender Endpoint API. |
| Limit | (Optional) Specify the maximum number of incidents that this operation should return from Microsoft 365 Defender. The maximum values it can return is 100. |
The output contains the following populated JSON schema:
{
"@odata.context": "",
"value": [
{
"incidentId": "",
"incidentUri": "",
"redirectIncidentId": "",
"incidentName": "",
"createdTime": "",
"lastUpdateTime": "",
"assignedTo": "",
"classification": "",
"determination": "",
"status": "",
"severity": "",
"tags": [],
"comments": [],
"alerts": [
{
"alertId": "",
"providerAlertId": "",
"incidentId": "",
"serviceSource": "",
"creationTime": "",
"lastUpdatedTime": "",
"resolvedTime": "",
"firstActivity": "",
"lastActivity": "",
"title": "",
"description": "",
"category": "",
"status": "",
"severity": "",
"investigationId": "",
"investigationState": "",
"classification": "",
"determination": "",
"detectionSource": "",
"detectorId": "",
"assignedTo": "",
"actorName": "",
"threatFamilyName": "",
"mitreTechniques": [],
"devices": [],
"entities": [
{
"entityType": "",
"evidenceCreationTime": "",
"verdict": "",
"remediationStatus": "",
"accountName": "",
"userSid": "",
"aadUserId": "",
"userPrincipalName": ""
}
]
}
]
}
]
}
| Parameter | Description |
|---|---|
| Incident ID | Specify the unique identifier that represents the incident to fetch its details. |
The output contains the following populated JSON schema:
{
"@odata.context": "",
"incidentId": "",
"incidentUri": "",
"redirectIncidentId": "",
"incidentName": "",
"createdTime": "",
"lastUpdateTime": "",
"assignedTo": "",
"classification": "",
"determination": "",
"status": "",
"severity": "",
"tags": [],
"comments": [],
"alerts": [
{
"alertId": "",
"providerAlertId": "",
"incidentId": "",
"serviceSource": "",
"creationTime": "",
"lastUpdatedTime": "",
"resolvedTime": "",
"firstActivity": "",
"lastActivity": "",
"title": "",
"description": "",
"category": "",
"status": "",
"severity": "",
"investigationId": "",
"investigationState": "",
"classification": "",
"determination": "",
"detectionSource": "",
"detectorId": "",
"assignedTo": "",
"actorName": "",
"threatFamilyName": "",
"mitreTechniques": [],
"devices": [],
"entities": [
{
"entityType": "",
"evidenceCreationTime": "",
"verdict": "",
"remediationStatus": "",
"accountName": "",
"userSid": "",
"aadUserId": "",
"userPrincipalName": ""
}
]
}
]
}
| Parameter | Description |
|---|---|
| Incident ID | Specify the unique identifier that represents the incident to update it. |
| Status | Select from drop-down the status with which to update the incident. |
| Assigned To | Specify the incident owner's email address. |
| Classification | Select from drop-down the specification of the incident:
|
| Tags | Specify a list of incident tags. |
| Comment | Specify a comment to be added to the incident. |
The output contains the following populated JSON schema:
{
"status": "",
"assignedTo": "",
"classification": "",
"determination": "",
"tags": [],
"comments": [
{
"comment": "",
"createdBy": "",
"createdTime": ""
}
]
}
| Parameter | Description |
|---|---|
| Query | Specify a query to examine the past 30 days of event data in Microsoft 365 Defender. For more information on the queries, refer to Microsoft 365 Defender Advanced hunting. |
The output contains the following populated JSON schema:
{
"Stats": {
"ExecutionTime": "",
"resource_usage": {
"cache": {
"memory": {
"hits": "",
"misses": "",
"total": ""
},
"disk": {
"hits": "",
"misses": "",
"total": ""
}
},
"cpu": {
"user": "",
"kernel": "",
"total cpu": ""
},
"memory": {
"peak_per_node": ""
}
},
"dataset_statistics": [
{
"table_row_count": "",
"table_size": ""
}
]
},
"Schema": [
{
"Name": "",
"Type": ""
}
],
"Results": [
{
"Timestamp": "",
"FileName": "",
"InitiatingProcessFileName": ""
},
{
"Timestamp": "",
"FileName": "",
"InitiatingProcessFileName": ""
}
]
}
The Sample - Microsoft 365 Defender - 1.0.0 playbook collection comes bundled with the Microsoft 365 Defender connector. These playbooks contain steps using which you can perform all supported actions. You can see bundled playbooks in the Automation > Playbooks section in FortiSOAR™ after importing the Microsoft 365 Defender connector.
Note: If you are planning to use any of the sample playbooks in your environment, ensure that you clone those playbooks and move them to a different collection, since the sample playbook collection gets deleted during connector upgrade and delete.
Use the Data Ingestion Wizard to easily ingest data into FortiSOAR™ by pulling data from Defender for Endpoint. For more information on the Data Ingestion Wizard, see the Connectors Guide in the FortiSOAR™ product documentation.
You can configure data ingestion using the Data Ingestion Wizard to seamlessly map Microsoft 365 Defender content to related FortiSOAR™ modules.
The Data Ingestion Wizard enables you to configure scheduled pulling of data from Microsoft 365 Defender into FortiSOAR™. It also lets you pull some sample data from Microsoft 365 Defender using which you can define the mapping of data between Microsoft 365 Defender and FortiSOAR™. The mapping of common fields is generally already done by the Data Ingestion Wizard; users mostly require to only map any custom fields that are added to the Microsoft 365 Defender incident.

x minutes, status, last updated time, and assigned To fields to filter incidents pulled from Microsoft 365 Defender. The fetched data is used to create a mapping between the Microsoft 365 Defender data and FortiSOAR™ incidents.
On the Field Mapping screen, map the fields of a Microsoft 365 Defender incident to the fields of an incident present in FortiSOAR™.

For more information on field mapping, see the Data Ingestionchapter in the "Connectors Guide" in the FortiSOAR™ product documentation. Once you have completed mapping fields, click Save Mapping & Continue.
(Optional) Use the Scheduling screen to configure schedule-based ingestion, i.e., specify the polling frequency to Microsoft 365 Defender, so that the content gets pulled from the Microsoft 365 Defender integration into FortiSOAR™.
On the Scheduling screen, from the Do you want to schedule the ingestion? drop-down list, select Yes.
In the “Configure Schedule Settings” section, specify the Cron expression for the schedule. For example, if you want to pull data from Microsoft 365 Defender every 5 minutes, click Every X Minute and in the minute box enter */5. This would mean that based on the configuration you have set up, data, i.e., incidents will be pulled from Microsoft 365 Defender every 5 minutes.

Once you have completed scheduling, click Save Settings & Continue.
The Summary screen displays a summary of the mapping done, and it also contains links to the Ingestion playbooks. Click Done to complete the data ingestion and exit the Data Ingestion Wizard.