Compare commits

...
Author SHA1 Message Date
Josh Brower 466e959340 Merge pull request #16335 from Security-Onion-Solutions/esql-default-query
Refactor correlation template
2026-10-19 13:05:55 -04:00
defensivedepth d2251d0cbc Refactor correlation template 2026-10-19 12:55:51 -04:00
coreyogburn 78013aa5bc Merge pull request #16333 from Security-Onion-Solutions/cogburn/automation-turn-timeout
Automation Turn Timeout
2026-10-15 15:12:52 -06:00
Corey Ogburn 69b2cb2b02 Automation Turn Timeout
Simplified to turnTimeoutSeconds as it sits on automationSettings and doesn't need to stutter.
2026-10-15 13:06:09 -06:00
Mike Reeves c13085ba71 Merge pull request #16332 from Security-Onion-Solutions/TOoSmOotH-patch-6
Change readonly to readonlyUi in YAML configuration
2026-10-15 11:44:49 -04:00
Mike Reeves da25083837 Change readonly to readonlyUi in YAML configuration 2026-10-15 11:39:59 -04:00
Mike Reeves 76fb1cc479 Merge pull request #16331 from Security-Onion-Solutions/TOoSmOotH-patch-5
Add readonly attribute to earliest alert time field
2026-10-15 11:19:58 -04:00
Mike Reeves cfb8992a92 Add readonly attribute to earliest alert time field 2026-10-15 11:16:48 -04:00
Josh Patterson 7121531336 Merge pull request #16328 from Security-Onion-Solutions/fix/socqeurymerge
combine default and alerts queries added via pillar
2026-10-14 11:13:39 -04:00
Josh Patterson ff2b46b73e combine default and alerts queries added via pillar
pillar.get replaces lists, so once alerts queries are saved to pillar
from the SOC config UI, queries added to defaults later (e.g. the
licensed Group By Assessment, Name) never reach soc.json. Merge them by
name the same way availableModels are merged by id: pillar order and
edits are kept, and default queries missing from pillar are appended.
2026-10-14 09:19:16 -04:00
Mike Reeves b158a38099 Merge pull request #16323 from Security-Onion-Solutions/mreeves/alert-triage-notify-skill
Remove the Notifier agent mapping
2026-10-13 17:45:22 -04:00
3 changed files with 50 additions and 21 deletions

No files matched your search

+24 -20
View File
@@ -1571,6 +1571,7 @@ soc:
tickIntervalSeconds: 60 tickIntervalSeconds: 60
maxConcurrentItems: 4 maxConcurrentItems: 4
maxQueuedItems: 0 maxQueuedItems: 0
turnTimeoutSeconds: 300
alertTriageEpoch: "2026-09-24T00:00:00Z" alertTriageEpoch: "2026-09-24T00:00:00Z"
tools: tools:
filterEventFields: filterEventFields:
@@ -2808,6 +2809,10 @@ soc:
# Sigma correlation rule; requires ES|QL (useEsql). # Sigma correlation rule; requires ES|QL (useEsql).
# First document: the correlation. Following documents: the rules it references. # First document: the correlation. Following documents: the rules it references.
# #
# This example mirrors the shipped rule c448c9f6 (Repeated SOC Login Failures For One Account).
# Change it before enabling, or you will get two alerts for the same activity.
# To test: log out of SOC and enter a wrong password 5 times for one username.
#
# Types: event_count, value_count, temporal, value_sum, value_avg, value_median, value_percentile. # Types: event_count, value_count, temporal, value_sum, value_avg, value_median, value_percentile.
# Correlation Guide: https://sigmahq.io/docs/meta/correlations.html # Correlation Guide: https://sigmahq.io/docs/meta/correlations.html
# Logsources: https://sigmahq.io/docs/basics/log-sources.html # Logsources: https://sigmahq.io/docs/basics/log-sources.html
@@ -2816,46 +2821,45 @@ soc:
id: [publicId] id: [publicId]
status: 'experimental' status: 'experimental'
description: | description: |
Describe what the correlation finds and, importantly, why relating these Describe what the correlation finds and why relating these events is more
events is more meaningful than either of them alone. meaningful than any one of them alone.
Example: 5 or more failed SOC logins for one username in 10 minutes.
references: references:
- 'https://local.invalid' - 'https://attack.mitre.org/techniques/T1110/001/'
author: '@SecurityOnion' author: '@SecurityOnion'
date: '[today]' date: '[today]'
tags: tags:
- detection.threat_hunting - attack.credential-access
- attack.technique_id - attack.t1110.001
correlation: correlation:
type: value_count type: event_count # count the base rule's events...
rules: rules:
- example_base_rule # the 'name' of the rule below - example_base_rule # ...by the 'name' of the rule below
group-by: group-by:
- source.ip - user.name # ...separately for each username
# Xs, Xm, Xh, Xd or Xw. timespan: 10m # Xs, Xm, Xh
timespan: 10m
condition: condition:
field: dns.query.name gte: 5
gte: 40
falsepositives: falsepositives:
- 'Describe the benign activity that also produces this pattern' - 'A user entering an old password after a password change'
# Placeholders: %count%, %start%, %end%, %duration%, or any field. # Placeholders: %count%, %start%, %end%, %duration%, or any field.
summary: '%count% distinct names queried by %source.ip% in %duration%' summary: '%count% failed SOC logins for %user.name% in %duration%, from %http.request.headers.x-real-ip%'
level: 'medium' # info | low | medium | high | critical level: 'medium' # info | low | medium | high | critical
--- ---
title: 'Base Event' title: 'SOC Login Failure'
# referenced by 'name' (or 'id') # referenced by 'name' (or 'id')
name: example_base_rule name: example_base_rule
description: 'The single event that the correlation aggregates.' description: 'One failed SOC login. Put filters here, not in the correlation.'
logsource: logsource:
category: network product: kratos
service: dns service: application
detection: detection:
selection: selection:
dns.query.name|exists: true msg: 'Encountered self-service login error.'
condition: selection condition: selection
# Carried into the alert. # Carried into the alert.
fields: fields:
- dns.query.name - http.request.headers.x-real-ip
assistant: assistant:
enabled: false enabled: false
investigationPrompt: Investigate Alert ID {socId} investigationPrompt: Investigate Alert ID {socId}
+19 -1
View File
@@ -22,7 +22,7 @@
{% do SOCMERGED.config.server.update({'additionalCA': MANAGERMERGED.additionalCA}) %} {% do SOCMERGED.config.server.update({'additionalCA': MANAGERMERGED.additionalCA}) %}
{% do SOCMERGED.config.server.update({'insecureSkipVerify': MANAGERMERGED.insecureSkipVerify}) %} {% do SOCMERGED.config.server.update({'insecureSkipVerify': MANAGERMERGED.insecureSkipVerify}) %}
{# pillar.get replaces lists instead of merging them, so combine availableModels by id #} {# pillar.get replaces lists instead of merging them, so combine availableModels by id and alerts queries by name #}
{% set default_models = {} %} {% set default_models = {} %}
{% for m in SOCDEFAULTS.config.server.client.assistant.availableModels %} {% for m in SOCDEFAULTS.config.server.client.assistant.availableModels %}
{% do default_models.setdefault(m.id, m) %} {% do default_models.setdefault(m.id, m) %}
@@ -41,6 +41,24 @@
{% endfor %} {% endfor %}
{% do SOCMERGED.config.server.client.assistant.update({'availableModels': merged_models}) %} {% do SOCMERGED.config.server.client.assistant.update({'availableModels': merged_models}) %}
{% set default_queries = {} %}
{% for q in SOCDEFAULTS.config.server.client.alerts.queries %}
{% do default_queries.setdefault(q.name, q) %}
{% endfor %}
{% set merged_queries = [] %}
{% set merged_names = [] %}
{% for q in SOCMERGED.config.server.client.alerts.queries or [] %}
{% set query = {} %}
{% do query.update(default_queries.get(q.get('name'), {})) %}
{% do query.update(q) %}
{% do merged_queries.append(query) %}
{% do merged_names.append(q.get('name')) %}
{% endfor %}
{% for name, q in default_queries.items() if name not in merged_names %}
{% do merged_queries.append(q) %}
{% endfor %}
{% do SOCMERGED.config.server.client.alerts.update({'queries': merged_queries}) %}
{% if not SOCMERGED.config.server.modules.postgres.host %} {% if not SOCMERGED.config.server.modules.postgres.host %}
{% do SOCMERGED.config.server.modules.postgres.update({'host': GLOBALS.manager}) %} {% do SOCMERGED.config.server.modules.postgres.update({'host': GLOBALS.manager}) %}
{% endif %} {% endif %}
+7
View File
@@ -1058,11 +1058,18 @@ soc:
global: True global: True
advanced: True advanced: True
forcedType: int forcedType: int
turnTimeoutSeconds:
description: Maximum number of seconds a single model turn of an automation's agent session may run, even while the model is still producing output. A turn that exceeds this limit is abandoned and the session is recorded as failed. Set to 0 to disable the timeout. Edit this setting via the Agent Studio.
global: True
advanced: True
forcedType: int
readonlyUi: True
alertTriageEpoch: alertTriageEpoch:
description: The earliest alert time the Alert Triage automation will consider. Alerts before this time are never triaged, which keeps a first run on an existing deployment from working through old history. Must be in UTC format (2026-09-24T00:00:00Z). description: The earliest alert time the Alert Triage automation will consider. Alerts before this time are never triaged, which keeps a first run on an existing deployment from working through old history. Must be in UTC format (2026-09-24T00:00:00Z).
regex: '^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z)?$' regex: '^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z)?$'
regexFailureMessage: Expecting date in RFC3339 format (2026-09-24T00:00:00Z) regexFailureMessage: Expecting date in RFC3339 format (2026-09-24T00:00:00Z)
global: True global: True
readonlyUi: True
advanced: True advanced: True
tools: tools:
filterEventFields: filterEventFields: