Skip to content

Commit f9ef102

Browse files
Merge pull request #20 from ianwills-splunk/certifcate-based-authentication
2 parents 1d225fd + 7dac272 commit f9ef102

16 files changed

+266
-37
lines changed

NOTICE

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,35 @@
11
Splunk SOAR App: Microsoft 365 Defender
22
Copyright (c) 2022-2025 Splunk Inc.
3+
Third Party Software Attributions:
4+
5+
@@@@============================================================================
6+
7+
Library: msal - 1.33.0
8+
Homepage: https://github.com/AzureAD/microsoft-authentication-library-for-python
9+
License: MIT License
10+
License Text:
11+
12+
The MIT License (MIT)
13+
14+
Copyright (c) Microsoft Corporation.
15+
All rights reserved.
16+
17+
This code is licensed under the MIT License.
18+
19+
Permission is hereby granted, free of charge, to any person obtaining a copy
20+
of this software and associated documentation files(the "Software"), to deal
21+
in the Software without restriction, including without limitation the rights
22+
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
23+
copies of the Software, and to permit persons to whom the Software is
24+
furnished to do so, subject to the following conditions :
25+
26+
The above copyright notice and this permission notice shall be included in
27+
all copies or substantial portions of the Software.
28+
29+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
32+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
35+
THE SOFTWARE.

README.md

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# Microsoft 365 Defender
22

3-
Publisher: Splunk \
4-
Connector Version: 1.4.3 \
5-
Product Vendor: Microsoft \
6-
Product Name: Microsoft 365 Defender \
3+
Publisher: Splunk <br>
4+
Connector Version: 1.4.3 <br>
5+
Product Vendor: Microsoft <br>
6+
Product Name: Microsoft 365 Defender <br>
77
Minimum Product Version: 6.3.0
88

99
This app integrates with Microsoft 365 Defender to execute various generic and investigative actions
@@ -98,7 +98,7 @@ are the default ports used by Splunk SOAR.
9898

9999
- offline_access
100100

101-
#### Create a client secret
101+
#### Create a client secret or jump to next section to use Certificate Based Authentication
102102

103103
17. Select the 'Certificates & secrets' menu from the left-side panel.
104104
01. Select 'New client secret' button to open a pop-up window.
@@ -107,9 +107,17 @@ are the default ports used by Splunk SOAR.
107107
01. Click 'Copy to clipboard' to copy the generated secret value and paste it in a safe place. You
108108
will need it to configure the asset and will not be able to retrieve it later.
109109

110+
#### Using Certificate Based Authentication
111+
112+
21. Select the 'Certificates & secrets' menu from the left-side panel.
113+
01. Select the 'Certificates' tab.
114+
01. Click 'Upload Certificate' and choose a '\*.crt' file that contains the server certificate.
115+
01. Select the 'Thumbprint' for the newly uploaded certificate and copy it somewhere to be
116+
used when configuring the SOAR app.
117+
110118
#### Copy your application id and tenant id
111119

112-
21. Select the 'Overview' menu from the left-side panel.
120+
25. Select the 'Overview' menu from the left-side panel.
113121
01. Copy the **Application (client) ID** and **Directory (tenant) ID** . You will need these to
114122
configure the SOAR asset.
115123

@@ -124,7 +132,14 @@ When creating an asset for the app,
124132
ID' field.
125133

126134
- Provide the client secret of the app created during the previous step of app creation in the
127-
'Client Secret' field.
135+
'Client Secret' field. -or- If using Certificate Based Authenticaion, do not not enter anything
136+
in this field, instead, complete the next three steps.
137+
138+
- For Certificate Based Authentication only: Provide the 'Certificate Thumbprint' recorded above from Microsoft Entra.
139+
140+
- For Certificate Based Authentication only: Provide the 'Certificate Private Key' (cut and paste the .pem file contents).
141+
142+
- For Certificate Based Authentication only: Ensure the 'Non-Interactive Auth' checkbox is checked.
128143

129144
- Provide the tenant ID of the app created during the previous step of Azure app creation in the
130145
'Tenant ID' field. For getting the value of tenant ID, navigate to the Microsoft Entra ID; The value displayed in the 'Tenant ID'.
@@ -268,7 +283,9 @@ VARIABLE | REQUIRED | TYPE | DESCRIPTION
268283
-------- | -------- | ---- | -----------
269284
**tenant_id** | required | string | Tenant ID |
270285
**client_id** | required | string | Client ID |
271-
**client_secret** | required | password | Client Secret |
286+
**client_secret** | optional | password | Client Secret |
287+
**certificate_thumbprint** | optional | password | Certificate Thumbprint (required for CBA) |
288+
**certificate_private_key** | optional | password | Certificate Private Key (.PEM) |
272289
**timeout** | optional | numeric | HTTP API timeout in seconds |
273290
**non_interactive** | optional | boolean | Non-Interactive Auth |
274291
**max_incidents_per_poll** | optional | numeric | Maximum Incidents for scheduled/interval polling for each cycle |
@@ -277,21 +294,21 @@ VARIABLE | REQUIRED | TYPE | DESCRIPTION
277294

278295
### Supported Actions
279296

280-
[test connectivity](#action-test-connectivity) - Validate the asset configuration for connectivity using supplied configuration \
281-
[on poll](#action-on-poll) - Callback action for the on_poll ingest functionality \
282-
[run query](#action-run-query) - An advanced search query \
283-
[list incidents](#action-list-incidents) - List all the incidents \
284-
[list alerts](#action-list-alerts) - List all the alerts \
285-
[get incident](#action-get-incident) - Retrieve specific incident by its ID \
286-
[update incident](#action-update-incident) - Update the properties of an incident object \
287-
[get alert](#action-get-alert) - Retrieve specific alert by its ID \
297+
[test connectivity](#action-test-connectivity) - Validate the asset configuration for connectivity using supplied configuration <br>
298+
[on poll](#action-on-poll) - Callback action for the on_poll ingest functionality <br>
299+
[run query](#action-run-query) - An advanced search query <br>
300+
[list incidents](#action-list-incidents) - List all the incidents <br>
301+
[list alerts](#action-list-alerts) - List all the alerts <br>
302+
[get incident](#action-get-incident) - Retrieve specific incident by its ID <br>
303+
[update incident](#action-update-incident) - Update the properties of an incident object <br>
304+
[get alert](#action-get-alert) - Retrieve specific alert by its ID <br>
288305
[update alert](#action-update-alert) - Update properties of existing alert
289306

290307
## action: 'test connectivity'
291308

292309
Validate the asset configuration for connectivity using supplied configuration
293310

294-
Type: **test** \
311+
Type: **test** <br>
295312
Read only: **True**
296313

297314
#### Action Parameters
@@ -306,7 +323,7 @@ No Output
306323

307324
Callback action for the on_poll ingest functionality
308325

309-
Type: **ingest** \
326+
Type: **ingest** <br>
310327
Read only: **True**
311328

312329
#### Action Parameters
@@ -327,7 +344,7 @@ No Output
327344

328345
An advanced search query
329346

330-
Type: **investigate** \
347+
Type: **investigate** <br>
331348
Read only: **True**
332349

333350
#### Action Parameters
@@ -359,7 +376,7 @@ summary.total_objects_successful | numeric | | 1 |
359376

360377
List all the incidents
361378

362-
Type: **investigate** \
379+
Type: **investigate** <br>
363380
Read only: **True**
364381

365382
#### Action Parameters
@@ -408,7 +425,7 @@ summary.total_objects_successful | numeric | | 1 |
408425

409426
List all the alerts
410427

411-
Type: **investigate** \
428+
Type: **investigate** <br>
412429
Read only: **True**
413430

414431
#### Action Parameters
@@ -582,7 +599,7 @@ action_result.data.\*.Intent_odata_type | string | | #Int64 |
582599

583600
Retrieve specific incident by its ID
584601

585-
Type: **investigate** \
602+
Type: **investigate** <br>
586603
Read only: **True**
587604

588605
#### Action Parameters
@@ -628,7 +645,7 @@ action_result.data.\*[email protected] | string | | https://graph.test.com/v1.0/$m
628645

629646
Update the properties of an incident object
630647

631-
Type: **generic** \
648+
Type: **generic** <br>
632649
Read only: **False**
633650

634651
In this `SecurityIncident.ReadWrite.All` delegated or application permission is required. One of the parameters `status`, `assign_to`, `classification` or `determination` must be specified; otherwise, the action fails.
@@ -680,7 +697,7 @@ action_result.data.\*[email protected] | string | | https://graph.test.com/v1.0/$m
680697

681698
Retrieve specific alert by its ID
682699

683-
Type: **investigate** \
700+
Type: **investigate** <br>
684701
Read only: **True**
685702

686703
#### Action Parameters
@@ -837,7 +854,7 @@ action_result.data.\*.evidence.\*.vmMetadata.subscriptionId | string | | |
837854

838855
Update properties of existing alert
839856

840-
Type: **generic** \
857+
Type: **generic** <br>
841858
Read only: **False**
842859

843860
#### Action Parameters

manual_readme_content.md

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ are the default ports used by Splunk SOAR.
8888

8989
- offline_access
9090

91-
#### Create a client secret
91+
#### Create a client secret or jump to next section to use Certificate Based Authentication
9292

9393
17. Select the 'Certificates & secrets' menu from the left-side panel.
9494
01. Select 'New client secret' button to open a pop-up window.
@@ -97,9 +97,17 @@ are the default ports used by Splunk SOAR.
9797
01. Click 'Copy to clipboard' to copy the generated secret value and paste it in a safe place. You
9898
will need it to configure the asset and will not be able to retrieve it later.
9999

100+
#### Using Certificate Based Authentication
101+
102+
21. Select the 'Certificates & secrets' menu from the left-side panel.
103+
01. Select the 'Certificates' tab.
104+
01. Click 'Upload Certificate' and choose a '\*.crt' file that contains the server certificate.
105+
01. Select the 'Thumbprint' for the newly uploaded certificate and copy it somewhere to be
106+
used when configuring the SOAR app.
107+
100108
#### Copy your application id and tenant id
101109

102-
21. Select the 'Overview' menu from the left-side panel.
110+
25. Select the 'Overview' menu from the left-side panel.
103111
01. Copy the **Application (client) ID** and **Directory (tenant) ID** . You will need these to
104112
configure the SOAR asset.
105113

@@ -114,7 +122,14 @@ When creating an asset for the app,
114122
ID' field.
115123

116124
- Provide the client secret of the app created during the previous step of app creation in the
117-
'Client Secret' field.
125+
'Client Secret' field. -or- If using Certificate Based Authenticaion, do not not enter anything
126+
in this field, instead, complete the next three steps.
127+
128+
- For Certificate Based Authentication only: Provide the 'Certificate Thumbprint' recorded above from Microsoft Entra.
129+
130+
- For Certificate Based Authentication only: Provide the 'Certificate Private Key' (cut and paste the .pem file contents).
131+
132+
- For Certificate Based Authentication only: Ensure the 'Non-Interactive Auth' checkbox is checked.
118133

119134
- Provide the tenant ID of the app created during the previous step of Azure app creation in the
120135
'Tenant ID' field. For getting the value of tenant ID, navigate to the Microsoft Entra ID; The value displayed in the 'Tenant ID'.

microsoft365defender.json

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,35 +42,47 @@
4242
"client_secret": {
4343
"description": "Client Secret",
4444
"data_type": "password",
45-
"required": true,
45+
"required": false,
4646
"order": 3
4747
},
48+
"certificate_thumbprint": {
49+
"description": "Certificate Thumbprint (required for CBA)",
50+
"data_type": "password",
51+
"order": 4,
52+
"required": false
53+
},
54+
"certificate_private_key": {
55+
"description": "Certificate Private Key (.PEM)",
56+
"data_type": "password",
57+
"required": false,
58+
"order": 5
59+
},
4860
"timeout": {
4961
"description": "HTTP API timeout in seconds",
5062
"data_type": "numeric",
51-
"order": 4
63+
"order": 6
5264
},
5365
"non_interactive": {
5466
"description": "Non-Interactive Auth",
5567
"data_type": "boolean",
5668
"default": false,
57-
"order": 5
69+
"order": 7
5870
},
5971
"max_incidents_per_poll": {
6072
"description": "Maximum Incidents for scheduled/interval polling for each cycle",
6173
"data_type": "numeric",
6274
"default": 1000,
63-
"order": 6
75+
"order": 8
6476
},
6577
"start_time": {
6678
"description": "Start time for schedule/interval/manual poll (Use this format: 1970-01-01T00:00:00Z)",
6779
"data_type": "string",
68-
"order": 7
80+
"order": 9
6981
},
7082
"filter": {
7183
"description": "Filter incidents based on property (example: status ne 'active')",
7284
"data_type": "string",
73-
"order": 8
85+
"order": 10
7486
}
7587
},
7688
"actions": [
@@ -4214,5 +4226,60 @@
42144226
},
42154227
"versions": "EQ(*)"
42164228
}
4217-
]
4229+
],
4230+
"pip_dependencies": {
4231+
"wheel": []
4232+
},
4233+
"pip39_dependencies": {
4234+
"wheel": [
4235+
{
4236+
"module": "PyJWT",
4237+
"input_file": "wheels/py3/PyJWT-2.10.1-py3-none-any.whl"
4238+
},
4239+
{
4240+
"module": "cffi",
4241+
"input_file": "wheels/py39/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
4242+
},
4243+
{
4244+
"module": "cryptography",
4245+
"input_file": "wheels/py3/cryptography-46.0.1-cp38-abi3-manylinux_2_28_x86_64.whl"
4246+
},
4247+
{
4248+
"module": "msal",
4249+
"input_file": "wheels/py3/msal-1.34.0-py3-none-any.whl"
4250+
},
4251+
{
4252+
"module": "pycparser",
4253+
"input_file": "wheels/py3/pycparser-2.23-py3-none-any.whl"
4254+
},
4255+
{
4256+
"module": "typing_extensions",
4257+
"input_file": "wheels/py3/typing_extensions-4.15.0-py3-none-any.whl"
4258+
}
4259+
]
4260+
},
4261+
"pip313_dependencies": {
4262+
"wheel": [
4263+
{
4264+
"module": "PyJWT",
4265+
"input_file": "wheels/py3/PyJWT-2.10.1-py3-none-any.whl"
4266+
},
4267+
{
4268+
"module": "cffi",
4269+
"input_file": "wheels/py313/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
4270+
},
4271+
{
4272+
"module": "cryptography",
4273+
"input_file": "wheels/py3/cryptography-46.0.1-cp311-abi3-manylinux_2_28_x86_64.whl"
4274+
},
4275+
{
4276+
"module": "msal",
4277+
"input_file": "wheels/py3/msal-1.34.0-py3-none-any.whl"
4278+
},
4279+
{
4280+
"module": "pycparser",
4281+
"input_file": "wheels/py3/pycparser-2.23-py3-none-any.whl"
4282+
}
4283+
]
4284+
}
42184285
}

0 commit comments

Comments
 (0)