diff --git a/salt/elasticsearch/defaults.yaml b/salt/elasticsearch/defaults.yaml index f67a01df9..c8ceab34d 100644 --- a/salt/elasticsearch/defaults.yaml +++ b/salt/elasticsearch/defaults.yaml @@ -3309,6 +3309,7 @@ elasticsearch: composed_of: - event-mappings - logs-system.security@package + - so-fleet_system.security_caseless-1 - logs-system.security@custom - so-fleet_integrations.ip_mappings-1 - so-fleet_globals-1 @@ -4175,6 +4176,7 @@ elasticsearch: index_template: composed_of: - logs-windows.forwarded@package + - so-fleet_process_caseless-1 - logs-windows.forwarded@custom - so-fleet_integrations.ip_mappings-1 - so-fleet_globals-1 @@ -4224,6 +4226,7 @@ elasticsearch: index_template: composed_of: - logs-windows.powershell@package + - so-fleet_process_caseless-1 - logs-windows.powershell@custom - so-fleet_integrations.ip_mappings-1 - so-fleet_globals-1 @@ -4273,6 +4276,7 @@ elasticsearch: index_template: composed_of: - logs-windows.powershell_operational@package + - so-fleet_process_caseless-1 - logs-windows.powershell_operational@custom - so-fleet_integrations.ip_mappings-1 - so-fleet_globals-1 @@ -4322,6 +4326,7 @@ elasticsearch: index_template: composed_of: - logs-windows.sysmon_operational@package + - so-fleet_process_caseless-1 - logs-windows.sysmon_operational@custom - so-fleet_integrations.ip_mappings-1 - so-fleet_globals-1 diff --git a/salt/elasticsearch/templates/component/elastic-agent/so-fleet_process_caseless-1.json b/salt/elasticsearch/templates/component/elastic-agent/so-fleet_process_caseless-1.json new file mode 100644 index 000000000..37b6413e9 --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/so-fleet_process_caseless-1.json @@ -0,0 +1,123 @@ +{ + "_meta": { + "managed_by": "security_onion", + "managed": true, + "description": "Adds .caseless for Lucene queries. Restates each field's package type and .text." + }, + "template": { + "mappings": { + "properties": { + "process": { + "properties": { + "executable": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + }, + "text": { + "type": "match_only_text" + } + } + }, + "name": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + }, + "text": { + "type": "match_only_text" + } + } + }, + "command_line": { + "type": "wildcard", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + }, + "text": { + "type": "match_only_text" + } + } + }, + "parent": { + "properties": { + "executable": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + }, + "text": { + "type": "match_only_text" + } + } + }, + "name": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + }, + "text": { + "type": "match_only_text" + } + } + }, + "command_line": { + "type": "wildcard", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + }, + "text": { + "type": "match_only_text" + } + } + } + } + } + } + }, + "file": { + "properties": { + "path": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + }, + "text": { + "type": "match_only_text" + } + } + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/so-fleet_system.security_caseless-1.json b/salt/elasticsearch/templates/component/elastic-agent/so-fleet_system.security_caseless-1.json new file mode 100644 index 000000000..d320364fb --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/so-fleet_system.security_caseless-1.json @@ -0,0 +1,80 @@ +{ + "_meta": { + "managed_by": "security_onion", + "managed": true, + "description": "Adds .caseless for Lucene queries. Keeps each field's existing keyword type." + }, + "template": { + "mappings": { + "properties": { + "process": { + "properties": { + "command_line": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + } + } + }, + "parent": { + "properties": { + "executable": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + } + } + }, + "name": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + } + } + }, + "command_line": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + } + } + } + } + } + } + }, + "file": { + "properties": { + "path": { + "type": "keyword", + "ignore_above": 1024, + "fields": { + "caseless": { + "type": "keyword", + "ignore_above": 1024, + "normalizer": "lowercase" + } + } + } + } + } + } + } + } +} diff --git a/salt/soc/files/soc/sigma_playbook_pipeline.yaml b/salt/soc/files/soc/sigma_playbook_pipeline.yaml index a779c4dec..6d428d2a8 100644 --- a/salt/soc/files/soc/sigma_playbook_pipeline.yaml +++ b/salt/soc/files/soc/sigma_playbook_pipeline.yaml @@ -2,7 +2,6 @@ name: Security Onion - Playbook Pipeline priority: 97 transformations: # Route to lowercase-normalized .caseless subfields for case-insensitive matching. - # file.path.caseless exists on Defend only (Sysmon file events lack it); # registry.path / dll.path / file.name have no .caseless on any source. - id: case_insensitive_string_fields type: field_name_mapping diff --git a/salt/soc/files/soc/sigma_so_pipeline.yaml b/salt/soc/files/soc/sigma_so_pipeline.yaml index ae867be49..23348860d 100644 --- a/salt/soc/files/soc/sigma_so_pipeline.yaml +++ b/salt/soc/files/soc/sigma_so_pipeline.yaml @@ -26,6 +26,16 @@ transformations: type: set_state key: keep val: "_id, _index, _source" + # Not every source maps .caseless; EQL/ES|QL already match case-insensitively. + - id: caseless_to_parent_fields + type: field_name_mapping + mapping: + process.executable.caseless: process.executable + process.name.caseless: process.name + process.parent.executable.caseless: process.parent.executable + process.parent.name.caseless: process.parent.name + target.process.executable.caseless: target.process.executable + target.process.name.caseless: target.process.name - id: baseline_field_name_mapping type: field_name_mapping mapping: