[Rule Tunings] AWS ESQL keep fields missing (#6014)
* [Tunings] AWS ESQL keep fields missing Adding missing keep fields to 2 ESQL rules. 1 additional field name change as well. * Apply suggestions from @eric Co-authored-by: Eric Forte <119343520+eric-forte-elastic@users.noreply.github.com> --------- Co-authored-by: Eric Forte <119343520+eric-forte-elastic@users.noreply.github.com>
This commit is contained in:
@@ -4,7 +4,7 @@ integration = ["aws"]
|
|||||||
maturity = "production"
|
maturity = "production"
|
||||||
min_stack_comments = "aws.cloudtrail.session_credential_from_console field introduced in AWS integration version 4.6.0"
|
min_stack_comments = "aws.cloudtrail.session_credential_from_console field introduced in AWS integration version 4.6.0"
|
||||||
min_stack_version = "9.2.0"
|
min_stack_version = "9.2.0"
|
||||||
updated_date = "2026/04/10"
|
updated_date = "2026/04/29"
|
||||||
|
|
||||||
[rule]
|
[rule]
|
||||||
author = ["Elastic"]
|
author = ["Elastic"]
|
||||||
@@ -212,6 +212,22 @@ from logs-aws.cloudtrail-* metadata _id, _version, _index
|
|||||||
|
|
||||||
// filter for more than 5 unique API calls per 10s window
|
// filter for more than 5 unique API calls per 10s window
|
||||||
| where Esql.event_action_count_distinct > 5
|
| where Esql.event_action_count_distinct > 5
|
||||||
|
|
||||||
|
| keep
|
||||||
|
aws.cloudtrail.user_identity.arn,
|
||||||
|
Esql.time_window_date_trunc,
|
||||||
|
Esql.event_action_count_distinct,
|
||||||
|
Esql.event_action_values,
|
||||||
|
Esql.event_timestamp_values,
|
||||||
|
Esql.aws_cloudtrail_user_identity_type_values,
|
||||||
|
Esql.aws_cloudtrail_user_identity_access_key_id_values,
|
||||||
|
Esql.source_ip_values,
|
||||||
|
Esql.cloud_account_id_values,
|
||||||
|
Esql.event_provider_values,
|
||||||
|
Esql.user_agent_name_values,
|
||||||
|
Esql.source_as_organization_name_values,
|
||||||
|
Esql.cloud_region_values,
|
||||||
|
Esql.data_stream_namespace_values
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
@@ -254,6 +270,7 @@ field_names = [
|
|||||||
"Esql.source_as_organization_name_values",
|
"Esql.source_as_organization_name_values",
|
||||||
"Esql.event_provider_values",
|
"Esql.event_provider_values",
|
||||||
"Esql.event_action_values",
|
"Esql.event_action_values",
|
||||||
|
"Esql.event_timestamp_values",
|
||||||
"Esql.cloud_account_id_values",
|
"Esql.cloud_account_id_values",
|
||||||
"Esql.cloud_region_values",
|
"Esql.cloud_region_values",
|
||||||
"Esql.data_stream_namespace_values",
|
"Esql.data_stream_namespace_values",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ integration = ["aws"]
|
|||||||
maturity = "production"
|
maturity = "production"
|
||||||
min_stack_comments = "aws.cloudtrail.session_credential_from_console field introduced in AWS integration version 4.6.0"
|
min_stack_comments = "aws.cloudtrail.session_credential_from_console field introduced in AWS integration version 4.6.0"
|
||||||
min_stack_version = "9.2.0"
|
min_stack_version = "9.2.0"
|
||||||
updated_date = "2026/04/10"
|
updated_date = "2026/04/29"
|
||||||
|
|
||||||
[rule]
|
[rule]
|
||||||
author = ["Elastic"]
|
author = ["Elastic"]
|
||||||
@@ -41,7 +41,7 @@ Security scanners, compliance tools, and post-compromise reconnaissance often wa
|
|||||||
- **Access key (`Esql.aws_cloudtrail_user_identity_access_key_id_values`)**: Identify which access key or temporary credential was used. Correlate with IAM last-used metadata for the key or role session.
|
- **Access key (`Esql.aws_cloudtrail_user_identity_access_key_id_values`)**: Identify which access key or temporary credential was used. Correlate with IAM last-used metadata for the key or role session.
|
||||||
|
|
||||||
**Characterize the bucket sweep**
|
**Characterize the bucket sweep**
|
||||||
- **Distinct bucket count (`Esql.bucket_arn_count_distinct`)**: Compare to normal baselines for this identity; values at or just above the threshold may still warrant review for new automation.
|
- **Distinct bucket count (`Esql.aws_cloudtrail_resources_arn_count_distinct`)**: Compare to normal baselines for this identity; values at or just above the threshold may still warrant review for new automation.
|
||||||
- **Bucket ARNs (`Esql.aws_cloudtrail_resources_arn_values`)**: Identify which buckets were touched. Prioritize buckets that store logs, backups, credentials, or regulated data. Search the same time range for write or policy-change APIs (`PutBucket*`, `DeleteBucket*`) on the same buckets.
|
- **Bucket ARNs (`Esql.aws_cloudtrail_resources_arn_values`)**: Identify which buckets were touched. Prioritize buckets that store logs, backups, credentials, or regulated data. Search the same time range for write or policy-change APIs (`PutBucket*`, `DeleteBucket*`) on the same buckets.
|
||||||
|
|
||||||
**Analyze source and client**
|
**Analyze source and client**
|
||||||
@@ -139,7 +139,7 @@ from logs-aws.cloudtrail-* metadata _id, _version, _index
|
|||||||
data_stream.namespace
|
data_stream.namespace
|
||||||
|
|
||||||
| stats
|
| stats
|
||||||
Esql.bucket_arn_count_distinct = count_distinct(aws.cloudtrail.resources.arn),
|
Esql.aws_cloudtrail_resources_arn_count_distinct = count_distinct(aws.cloudtrail.resources.arn),
|
||||||
Esql.aws_cloudtrail_resources_arn_values = VALUES(aws.cloudtrail.resources.arn),
|
Esql.aws_cloudtrail_resources_arn_values = VALUES(aws.cloudtrail.resources.arn),
|
||||||
Esql.event_action_values = VALUES(event.action),
|
Esql.event_action_values = VALUES(event.action),
|
||||||
Esql.timestamp_values = VALUES(@timestamp),
|
Esql.timestamp_values = VALUES(@timestamp),
|
||||||
@@ -152,7 +152,23 @@ from logs-aws.cloudtrail-* metadata _id, _version, _index
|
|||||||
Esql.data_stream_namespace_values = VALUES(data_stream.namespace)
|
Esql.data_stream_namespace_values = VALUES(data_stream.namespace)
|
||||||
by Esql.time_window_date_trunc, aws.cloudtrail.user_identity.arn, source.ip
|
by Esql.time_window_date_trunc, aws.cloudtrail.user_identity.arn, source.ip
|
||||||
|
|
||||||
| where Esql.bucket_arn_count_distinct > 15
|
| where Esql.aws_cloudtrail_resources_arn_count_distinct > 15
|
||||||
|
|
||||||
|
| keep
|
||||||
|
aws.cloudtrail.user_identity.arn,
|
||||||
|
source.ip,
|
||||||
|
Esql.time_window_date_trunc,
|
||||||
|
Esql.aws_cloudtrail_resources_arn_count_distinct,
|
||||||
|
Esql.aws_cloudtrail_resources_arn_values,
|
||||||
|
Esql.event_action_values,
|
||||||
|
Esql.timestamp_values,
|
||||||
|
Esql.aws_cloudtrail_user_identity_type_values,
|
||||||
|
Esql.aws_cloudtrail_user_identity_access_key_id_values,
|
||||||
|
Esql.cloud_account_id_values,
|
||||||
|
Esql.cloud_region_values,
|
||||||
|
Esql.user_agent_original_values,
|
||||||
|
Esql.source_as_organization_name_values,
|
||||||
|
Esql.data_stream_namespace_values
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
@@ -193,12 +209,13 @@ reference = "https://attack.mitre.org/tactics/TA0009/"
|
|||||||
|
|
||||||
[rule.investigation_fields]
|
[rule.investigation_fields]
|
||||||
field_names = [
|
field_names = [
|
||||||
"Esql.bucket_arn_count_distinct",
|
"Esql.aws_cloudtrail_resources_arn_count_distinct",
|
||||||
"Esql.time_window_date_trunc",
|
"Esql.time_window_date_trunc",
|
||||||
"aws.cloudtrail.user_identity.arn",
|
"aws.cloudtrail.user_identity.arn",
|
||||||
"source.ip",
|
"source.ip",
|
||||||
"Esql.aws_cloudtrail_resources_arn_values",
|
"Esql.aws_cloudtrail_resources_arn_values",
|
||||||
"Esql.event_action_values",
|
"Esql.event_action_values",
|
||||||
|
"Esql.timestamp_values",
|
||||||
"Esql.aws_cloudtrail_user_identity_type_values",
|
"Esql.aws_cloudtrail_user_identity_type_values",
|
||||||
"Esql.aws_cloudtrail_user_identity_access_key_id_values",
|
"Esql.aws_cloudtrail_user_identity_access_key_id_values",
|
||||||
"Esql.cloud_account_id_values",
|
"Esql.cloud_account_id_values",
|
||||||
|
|||||||
Reference in New Issue
Block a user