Compare commits

...
Author SHA1 Message Date
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
Mike Reeves 26f5d07435 Remove the Notifier agent mapping
AlertTriage now sends its own notification through the Notify skill, so the
Notifier agent no longer exists in SOC.
2026-10-13 17:35:22 -04:00
Mike Reeves 747abeed79 Merge pull request #16302 from Security-Onion-Solutions/mreeves/alert-assessment-groupby
Add a licensed Group By Assessment, Name alerts query
2026-10-13 17:16:48 -04:00
Mike Reeves 1bcf80dd10 Group by assessment without a missing bucket
The assessment is a number, and SOC's missing bucket only works on keyword
fields, so the * made Elasticsearch fail parsing "__missing__" as a long.
Untriaged alerts now drop out of this view.
2026-10-13 17:11:49 -04:00
Josh Patterson e7d7676a90 Merge pull request #16322 from Security-Onion-Solutions/fix/socmerge
combine default and availableModels added via pillar
2026-10-13 16:27:57 -04:00
Josh Patterson 2b6566d33b combine default and availableModels added via pillar 2026-10-13 13:52:30 -04:00
Jorge Reyes f5641647ab Merge pull request #16319 from Security-Onion-Solutions/reyesj2-patch-1
remap enterprisesearch integration components
2026-10-13 09:17:30 -05:00
Mike Reeves 3304aff62b Note that an oai query also needs the agentic assistant
SOC (securityonion-soc#1363) now hides a query licensed for oai unless the
assistant is enabled and agentic, so the query editor's license help says so.

Claude-Session: https://claude.ai/code/session_01SZLcwj68A2wLo3F8TGKsLP
2026-10-07 08:56:44 -04:00
Mike Reeves 7469d833d1 Add a licensed Group By Assessment, Name alerts query
Groups alerts by the AI triage assessment, keeping untriaged alerts as a
missing bucket. Query entries take an optional license feature, which SOC uses
to hide this one on grids without OnionAI, and the query editor now shows it.
2026-10-06 21:14:25 -04:00
3 changed files with 74 additions and 25 deletions

No files matched your search

+27 -21
View File
@@ -1545,7 +1545,6 @@ soc:
Investigator: haiku@SOAI
DetectionEngineer: haiku@SOAI
AlertTriage: haiku@SOAI
Notifier: haiku@SOAI
useMemory: false
useMemoryScanner: false
dontScanBefore: ""
@@ -1572,6 +1571,7 @@ soc:
tickIntervalSeconds: 60
maxConcurrentItems: 4
maxQueuedItems: 0
turnTimeoutSeconds: 300
alertTriageEpoch: "2026-09-24T00:00:00Z"
tools:
filterEventFields:
@@ -2527,6 +2527,9 @@ soc:
queries:
- name: 'Group By Name, Module'
query: '* | groupby rule.name event.module* event.severity_label rule.uuid'
- name: 'Group By Assessment, Name'
query: '* | groupby event.so_alerttriage.assessment rule.name event.severity_label rule.uuid'
license: oai
- name: 'Group By Sensor, Source IP/Port, Destination IP/Port, Name'
query: '* | groupby observer.name source.ip source.port destination.ip destination.port rule.name network.community_id event.severity_label rule.uuid'
- name: 'Group By Source IP, Name'
@@ -2806,6 +2809,10 @@ soc:
# Sigma correlation rule; requires ES|QL (useEsql).
# 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.
# Correlation Guide: https://sigmahq.io/docs/meta/correlations.html
# Logsources: https://sigmahq.io/docs/basics/log-sources.html
@@ -2814,46 +2821,45 @@ soc:
id: [publicId]
status: 'experimental'
description: |
Describe what the correlation finds and, importantly, why relating these
events is more meaningful than either of them alone.
Describe what the correlation finds and why relating these events is more
meaningful than any one of them alone.
Example: 5 or more failed SOC logins for one username in 10 minutes.
references:
- 'https://local.invalid'
- 'https://attack.mitre.org/techniques/T1110/001/'
author: '@SecurityOnion'
date: '[today]'
tags:
- detection.threat_hunting
- attack.technique_id
- attack.credential-access
- attack.t1110.001
correlation:
type: value_count
type: event_count # count the base rule's events...
rules:
- example_base_rule # the 'name' of the rule below
- example_base_rule # ...by the 'name' of the rule below
group-by:
- source.ip
# Xs, Xm, Xh, Xd or Xw.
timespan: 10m
- user.name # ...separately for each username
timespan: 10m # Xs, Xm, Xh
condition:
field: dns.query.name
gte: 40
gte: 5
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.
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
---
title: 'Base Event'
title: 'SOC Login Failure'
# referenced by 'name' (or 'id')
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:
category: network
service: dns
product: kratos
service: application
detection:
selection:
dns.query.name|exists: true
msg: 'Encountered self-service login error.'
condition: selection
# Carried into the alert.
fields:
- dns.query.name
- http.request.headers.x-real-ip
assistant:
enabled: false
investigationPrompt: Investigate Alert ID {socId}
+37
View File
@@ -22,6 +22,43 @@
{% do SOCMERGED.config.server.update({'additionalCA': MANAGERMERGED.additionalCA}) %}
{% do SOCMERGED.config.server.update({'insecureSkipVerify': MANAGERMERGED.insecureSkipVerify}) %}
{# pillar.get replaces lists instead of merging them, so combine availableModels by id and alerts queries by name #}
{% set default_models = {} %}
{% for m in SOCDEFAULTS.config.server.client.assistant.availableModels %}
{% do default_models.setdefault(m.id, m) %}
{% endfor %}
{% set merged_models = [] %}
{% set merged_ids = [] %}
{% for m in SOCMERGED.config.server.client.assistant.availableModels or [] %}
{% set model = {} %}
{% do model.update(default_models.get(m.get('id'), {})) %}
{% do model.update(m) %}
{% do merged_models.append(model) %}
{% do merged_ids.append(m.get('id')) %}
{% endfor %}
{% for id, m in default_models.items() if id not in merged_ids %}
{% do merged_models.append(m) %}
{% endfor %}
{% 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 %}
{% do SOCMERGED.config.server.modules.postgres.update({'host': GLOBALS.manager}) %}
{% endif %}
+10 -4
View File
@@ -954,10 +954,7 @@ soc:
description: This agent manages detections and their overrides, including tuning noisy rules and authoring rule content.
global: True
AlertTriage:
description: This agent triages alerts autonomously for the Alert Triage automation, ending each run with a report and an assessment of the alert. It can notify through the Notifier but cannot acknowledge alerts or escalate to cases.
global: True
Notifier:
description: This agent sends a single notification on behalf of another agent, such as AlertTriage, and takes no other action.
description: This agent triages alerts autonomously for the Alert Triage automation, ending each run with a report and an assessment of the alert. It can send a notification but cannot acknowledge alerts or escalate to cases.
global: True
useMemory:
description: Enables the Memory system for OnionAI
@@ -1061,11 +1058,18 @@ soc:
global: True
advanced: True
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:
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)?$'
regexFailureMessage: Expecting date in RFC3339 format (2026-09-24T00:00:00Z)
global: True
readonlyUi: True
advanced: True
tools:
filterEventFields:
@@ -1229,6 +1233,8 @@ soc:
- field: showSubtitle
label: Show Query in Dropdown.
forcedType: bool
- field: license
label: Only show on grids licensed for this feature, e.g. oai. An oai query also needs the assistant enabled and agentic. Leave blank to show everywhere.
queryToggleFilters:
description: Customize togglable query filters that apply to all queries. Exclusive toggles will invert the filter if toggled off rather than omitting the filter from the query.
global: True