Skip to content

Commit 4d78432

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Add baselineUserLocationsDuration to Impossible Travel rule options (#3555)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent 45ca5b5 commit 4d78432

6 files changed

Lines changed: 156 additions & 1 deletion

.generator/schemas/v2/openapi.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70685,11 +70685,20 @@ components:
7068570685
properties:
7068670686
baselineUserLocations:
7068770687
$ref: "#/components/schemas/SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocations"
70688+
baselineUserLocationsDuration:
70689+
$ref: "#/components/schemas/SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocationsDuration"
7068870690
type: object
7068970691
SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocations:
7069070692
description: "If true, signals are suppressed for the first 24 hours. In that time, Datadog learns the user's regular\naccess locations. This can be helpful to reduce noise and infer VPN usage or credentialed API access."
7069170693
example: true
7069270694
type: boolean
70695+
SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocationsDuration:
70696+
description: The duration in days during which Datadog learns the user's regular access locations. After this period, signals are generated for accesses from unknown locations.
70697+
format: int32
70698+
maximum: 30
70699+
minimum: 1
70700+
nullable: true
70701+
type: integer
7069370702
SecurityMonitoringRuleInstantaneousBaseline:
7069470703
description: When set to true, Datadog uses previous values that fall within the defined learning window to construct the baseline, enabling the system to establish an accurate baseline more rapidly rather than relying solely on gradual learning over time.
7069570704
example: false
@@ -143305,6 +143314,7 @@ paths:
143305143314
hardcodedEvaluatorType: log4shell
143306143315
impossibleTravelOptions:
143307143316
baselineUserLocations: true
143317+
baselineUserLocationsDuration: 7
143308143318
newValueOptions:
143309143319
instantaneousBaseline: false
143310143320
learningMethod: duration
@@ -144061,6 +144071,7 @@ paths:
144061144071
hardcodedEvaluatorType: log4shell
144062144072
impossibleTravelOptions:
144063144073
baselineUserLocations: true
144074+
baselineUserLocationsDuration: 7
144064144075
keepAlive: 3600
144065144076
maxSignalDuration: 86400
144066144077
newValueOptions:
@@ -144162,6 +144173,7 @@ paths:
144162144173
hardcodedEvaluatorType: log4shell
144163144174
impossibleTravelOptions:
144164144175
baselineUserLocations: true
144176+
baselineUserLocationsDuration: 7
144165144177
keepAlive: 0
144166144178
maxSignalDuration: 0
144167144179
newValueOptions:
@@ -144275,6 +144287,7 @@ paths:
144275144287
hardcodedEvaluatorType: log4shell
144276144288
impossibleTravelOptions:
144277144289
baselineUserLocations: true
144290+
baselineUserLocationsDuration: 7
144278144291
keepAlive: 1800
144279144292
maxSignalDuration: 1800
144280144293
newValueOptions:
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
Create a detection rule with type 'impossible_travel' and baselineUserLocationsDuration returns "OK" response
3+
"""
4+
5+
from datadog_api_client import ApiClient, Configuration
6+
from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi
7+
from datadog_api_client.v2.model.security_monitoring_rule_case_create import SecurityMonitoringRuleCaseCreate
8+
from datadog_api_client.v2.model.security_monitoring_rule_detection_method import SecurityMonitoringRuleDetectionMethod
9+
from datadog_api_client.v2.model.security_monitoring_rule_evaluation_window import (
10+
SecurityMonitoringRuleEvaluationWindow,
11+
)
12+
from datadog_api_client.v2.model.security_monitoring_rule_impossible_travel_options import (
13+
SecurityMonitoringRuleImpossibleTravelOptions,
14+
)
15+
from datadog_api_client.v2.model.security_monitoring_rule_keep_alive import SecurityMonitoringRuleKeepAlive
16+
from datadog_api_client.v2.model.security_monitoring_rule_max_signal_duration import (
17+
SecurityMonitoringRuleMaxSignalDuration,
18+
)
19+
from datadog_api_client.v2.model.security_monitoring_rule_options import SecurityMonitoringRuleOptions
20+
from datadog_api_client.v2.model.security_monitoring_rule_query_aggregation import (
21+
SecurityMonitoringRuleQueryAggregation,
22+
)
23+
from datadog_api_client.v2.model.security_monitoring_rule_severity import SecurityMonitoringRuleSeverity
24+
from datadog_api_client.v2.model.security_monitoring_rule_type_create import SecurityMonitoringRuleTypeCreate
25+
from datadog_api_client.v2.model.security_monitoring_standard_rule_create_payload import (
26+
SecurityMonitoringStandardRuleCreatePayload,
27+
)
28+
from datadog_api_client.v2.model.security_monitoring_standard_rule_query import SecurityMonitoringStandardRuleQuery
29+
30+
body = SecurityMonitoringStandardRuleCreatePayload(
31+
queries=[
32+
SecurityMonitoringStandardRuleQuery(
33+
aggregation=SecurityMonitoringRuleQueryAggregation.GEO_DATA,
34+
group_by_fields=[
35+
"@usr.id",
36+
],
37+
distinct_fields=[],
38+
metric="@network.client.geoip",
39+
query="*",
40+
),
41+
],
42+
cases=[
43+
SecurityMonitoringRuleCaseCreate(
44+
name="",
45+
status=SecurityMonitoringRuleSeverity.INFO,
46+
notifications=[],
47+
),
48+
],
49+
has_extended_title=True,
50+
message="test",
51+
is_enabled=True,
52+
options=SecurityMonitoringRuleOptions(
53+
max_signal_duration=SecurityMonitoringRuleMaxSignalDuration.ONE_DAY,
54+
evaluation_window=SecurityMonitoringRuleEvaluationWindow.FIFTEEN_MINUTES,
55+
keep_alive=SecurityMonitoringRuleKeepAlive.ONE_HOUR,
56+
detection_method=SecurityMonitoringRuleDetectionMethod.IMPOSSIBLE_TRAVEL,
57+
impossible_travel_options=SecurityMonitoringRuleImpossibleTravelOptions(
58+
baseline_user_locations=True,
59+
baseline_user_locations_duration=7,
60+
),
61+
),
62+
name="Example-Security-Monitoring",
63+
type=SecurityMonitoringRuleTypeCreate.LOG_DETECTION,
64+
tags=[],
65+
filters=[],
66+
)
67+
68+
configuration = Configuration()
69+
with ApiClient(configuration) as api_client:
70+
api_instance = SecurityMonitoringApi(api_client)
71+
response = api_instance.create_security_monitoring_rule(body=body)
72+
73+
print(response)

src/datadog_api_client/v2/model/security_monitoring_rule_impossible_travel_options.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,50 @@
88
from datadog_api_client.model_utils import (
99
ModelNormal,
1010
cached_property,
11+
none_type,
1112
unset,
1213
UnsetType,
1314
)
1415

1516

1617
class SecurityMonitoringRuleImpossibleTravelOptions(ModelNormal):
18+
validations = {
19+
"baseline_user_locations_duration": {
20+
"inclusive_maximum": 30,
21+
"inclusive_minimum": 1,
22+
},
23+
}
24+
1725
@cached_property
1826
def openapi_types(_):
1927
return {
2028
"baseline_user_locations": (bool,),
29+
"baseline_user_locations_duration": (int,),
2130
}
2231

2332
attribute_map = {
2433
"baseline_user_locations": "baselineUserLocations",
34+
"baseline_user_locations_duration": "baselineUserLocationsDuration",
2535
}
2636

27-
def __init__(self_, baseline_user_locations: Union[bool, UnsetType] = unset, **kwargs):
37+
def __init__(
38+
self_,
39+
baseline_user_locations: Union[bool, UnsetType] = unset,
40+
baseline_user_locations_duration: Union[int, none_type, UnsetType] = unset,
41+
**kwargs,
42+
):
2843
"""
2944
Options on impossible travel detection method.
3045
3146
:param baseline_user_locations: If true, signals are suppressed for the first 24 hours. In that time, Datadog learns the user's regular
3247
access locations. This can be helpful to reduce noise and infer VPN usage or credentialed API access.
3348
:type baseline_user_locations: bool, optional
49+
50+
:param baseline_user_locations_duration: The duration in days during which Datadog learns the user's regular access locations. After this period, signals are generated for accesses from unknown locations.
51+
:type baseline_user_locations_duration: int, none_type, optional
3452
"""
3553
if baseline_user_locations is not unset:
3654
kwargs["baseline_user_locations"] = baseline_user_locations
55+
if baseline_user_locations_duration is not unset:
56+
kwargs["baseline_user_locations_duration"] = baseline_user_locations_duration
3757
super().__init__(kwargs)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2026-05-20T15:12:27.397Z
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
interactions:
2+
- request:
3+
body: '{"cases":[{"name":"","notifications":[],"status":"info"}],"filters":[],"hasExtendedTitle":true,"isEnabled":true,"message":"test","name":"Test-Create_a_detection_rule_with_type_impossible_travel_and_baselineUserLocationsDuration_returns_OK_res-1779289947","options":{"detectionMethod":"impossible_travel","evaluationWindow":900,"impossibleTravelOptions":{"baselineUserLocations":true,"baselineUserLocationsDuration":7},"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"geo_data","distinctFields":[],"groupByFields":["@usr.id"],"metric":"@network.client.geoip","query":"*"}],"tags":[],"type":"log_detection"}'
4+
headers:
5+
accept:
6+
- application/json
7+
content-type:
8+
- application/json
9+
method: POST
10+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules
11+
response:
12+
body:
13+
string: '{"name":"Test-Create_a_detection_rule_with_type_impossible_travel_and_baselineUserLocationsDuration_returns_OK_res-1779289947","createdAt":1779289949181,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"*","groupByFields":["@usr.id"],"hasOptionalGroupByFields":false,"distinctFields":[],"metric":"@network.client.geoip","metrics":["@network.client.geoip"],"aggregation":"geo_data","name":"","dataSource":"logs"}],"options":{"evaluationWindow":900,"detectionMethod":"impossible_travel","maxSignalDuration":86400,"keepAlive":3600,"impossibleTravelOptions":{"baselineUserLocations":true,"baselineUserLocationsDuration":7,"detectIpTransition":false}},"cases":[{"name":"","status":"info","notifications":[]}],"message":"test","tags":[],"hasExtendedTitle":true,"type":"log_detection","filters":[],"version":1,"id":"v2k-viu-svz","blocking":false,"metadata":{"entities":null,"sources":null},"creationAuthorId":2320499,"creator":{"handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","name":"CI
14+
Account"},"updater":{"handle":"","name":""}}'
15+
headers:
16+
content-type:
17+
- application/json
18+
status:
19+
code: 200
20+
message: OK
21+
- request:
22+
body: null
23+
headers:
24+
accept:
25+
- '*/*'
26+
method: DELETE
27+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/v2k-viu-svz
28+
response:
29+
body:
30+
string: ''
31+
headers: {}
32+
status:
33+
code: 204
34+
message: No Content
35+
version: 1

tests/v2/features/security_monitoring.feature

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,19 @@ Feature: Security Monitoring
559559
And the response "type" is equal to "application_security"
560560
And the response "message" is equal to "Test rule"
561561

562+
@skip-validation @team:DataDog/k9-cloud-siem
563+
Scenario: Create a detection rule with type 'impossible_travel' and baselineUserLocationsDuration returns "OK" response
564+
Given new "CreateSecurityMonitoringRule" request
565+
And body with value {"queries":[{"aggregation":"geo_data","groupByFields":["@usr.id"],"distinctFields":[],"metric":"@network.client.geoip","query":"*"}],"cases":[{"name":"","status":"info","notifications":[]}],"hasExtendedTitle":true,"message":"test","isEnabled":true,"options":{"maxSignalDuration":86400,"evaluationWindow":900,"keepAlive":3600,"detectionMethod":"impossible_travel","impossibleTravelOptions":{"baselineUserLocations":true,"baselineUserLocationsDuration":7}},"name":"{{ unique }}","type":"log_detection","tags":[],"filters":[]}
566+
When the request is sent
567+
Then the response status is 200 OK
568+
And the response "name" is equal to "{{ unique }}"
569+
And the response "type" is equal to "log_detection"
570+
And the response "message" is equal to "test"
571+
And the response "options.detectionMethod" is equal to "impossible_travel"
572+
And the response "options.impossibleTravelOptions.baselineUserLocations" is equal to true
573+
And the response "options.impossibleTravelOptions.baselineUserLocationsDuration" is equal to 7
574+
562575
@skip-validation @team:DataDog/k9-cloud-siem
563576
Scenario: Create a detection rule with type 'impossible_travel' returns "OK" response
564577
Given new "CreateSecurityMonitoringRule" request

0 commit comments

Comments
 (0)