Skip to content

Commit 61c9344

Browse files
[Rule Tuning] M365 OneDrive Excessive File Downloads with OAuth Token (#5365)
* [Rule Tuning] M365 OneDrive Excessive File Downloads with OAuth Token Fixes #5361 * adding keep operation * updating non-ecs
1 parent 9b26cd2 commit 61c9344

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

detection_rules/etc/non-ecs-schema.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@
145145
"kibana.alert.rule.threat.tactic.id": "keyword",
146146
"kibana.alert.workflow_status": "keyword",
147147
"kibana.alert.rule.rule_id": "keyword",
148-
"kibana.alert.rule.name": "keyword",
148+
"kibana.alert.rule.name": "keyword",
149149
"kibana.alert.risk_score": "long",
150150
"kibana.alert.rule.type": "keyword",
151151
"kibana.alert.rule.threat.tactic.name": "keyword"
@@ -237,7 +237,8 @@
237237
"o365.audit.ExtendedProperties.ResultStatusDetail": "keyword",
238238
"o365.audit.OperationProperties.Name": "keyword",
239239
"o365.audit.OperationProperties.Value": "keyword",
240-
"o365.audit.OperationCount": "long"
240+
"o365.audit.OperationCount": "long",
241+
"o365.audit.AppAccessContext.AADSessionId": "keyword"
241242
},
242243
"logs-okta*": {
243244
"okta.debug_context.debug_data.flattened.requestedScopes": "keyword",

rules/integrations/o365/collection_onedrive_excessive_file_downloads.toml

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
creation_date = "2025/02/19"
33
integration = ["o365"]
44
maturity = "production"
5-
updated_date = "2025/09/26"
5+
updated_date = "2025/11/25"
66

77
[rule]
88
author = ["Elastic"]
@@ -83,28 +83,38 @@ type = "esql"
8383
query = '''
8484
from logs-o365.audit-*
8585
| where
86-
@timestamp > now() - 14d and
8786
event.dataset == "o365.audit" and
8887
event.provider == "OneDrive" and
8988
event.action == "FileDownloaded" and
9089
o365.audit.AuthenticationType == "OAuth" and
9190
event.outcome == "success"
92-
| eval
93-
Esql.time_window_date_trunc = date_trunc(1 minutes, @timestamp)
94-
| keep
95-
Esql.time_window_date_trunc,
96-
o365.audit.UserId,
97-
file.name,
98-
source.ip
91+
and (user.id is not null and o365.audit.ApplicationId is not null)
92+
| eval session.id = coalesce(o365.audit.AppAccessContext.AADSessionId, session.id, null)
93+
| where session.id is not null
94+
| eval Esql.time_window_date_trunc = date_trunc(1 minutes, @timestamp)
9995
| stats
96+
Esql.file_directory_values = values(file.directory),
97+
Esql.file_extension_values = values(file.extension),
98+
Esql.application_name_values = values(application.name),
10099
Esql.file_name_count_distinct = count_distinct(file.name),
100+
Esql.o365_audit_Site_values = values(o365.audit.Site),
101+
Esql.o365_audit_SiteUrl_values = values(o365.audit.SiteUrl),
102+
Esql.user_domain_values = values(user.domain),
103+
Esql.token_id_values = values(token.id),
101104
Esql.event_count = count(*)
102-
by
105+
by
103106
Esql.time_window_date_trunc,
104-
o365.audit.UserId,
105-
source.ip
106-
| where
107-
Esql.file_name_count_distinct >= 25
107+
user.id,
108+
session.id,
109+
source.ip,
110+
o365.audit.ApplicationId
111+
| where Esql.file_name_count_distinct >= 25
112+
| keep
113+
Esql.*,
114+
user.id,
115+
source.ip,
116+
o365.audit.ApplicationId,
117+
session.id
108118
'''
109119

110120

0 commit comments

Comments
 (0)