Skip to content

SOC baseline

Policy

Conservative alert policy rules. ATT&CK labels and no wildcard queries block; the rest advise.

Add it

In Bifract, open Exchange, find SOC baseline and click Add. Appends its rules to the scope's alert policies, skipping any already there. Needs a fractal admin.

File

exchange/policies/soc-baseline.yaml

soc-baseline.yaml
name: SOC baseline
description: >-
  A starting rule set for a detection team moving CI checks into Bifract. Every rule is
  field/operator/value against the alert definition, so it costs nothing to run and is
  evaluated as an analyst types rather than minutes later in a pipeline.

  Import from Alerts -> Policies. Severities here are deliberately conservative: only
  the rules that catch a genuinely broken detection block, and the rest advise. Tighten
  them once the compliance view shows the backlog is clear.

rules:
  # ATT&CK coverage. The regex accepts attack.t1059 and attack.t1059.001 alike, which is
  # what the Coverage grid reads.
  - field: labels
    operator: any_matches
    value: '^attack\.t\d{4}'
    message: Add an ATT&CK technique label, for example attack.t1059, so this rule appears on the coverage map.
    severity: block

  # A detection nobody can interpret at 3am is a detection that gets ignored.
  - field: description
    operator: min_length
    value: '40'
    message: Describe what this detects and what an analyst should do about it.
    severity: warn

  - field: references
    operator: not_empty
    message: Link the research, ticket or runbook behind this rule.
    severity: warn

  # A bare wildcard matches every event in the fractal on every evaluation.
  - field: query_string
    operator: not_matches
    value: '^\s*\*\s*$'
    message: A bare * matches everything. Narrow the query before saving.
    severity: block

  # Severity drives triage order, so leaving it at the default hides real work.
  - field: severity
    operator: one_of
    value: 'low, medium, high, critical'
    message: Set a severity so this lands in the right place in the queue.
    severity: warn

  # Naming: keep the list scannable.
  - field: name
    operator: min_length
    value: '8'
    message: Give the alert a name that says what it detects.
    severity: warn

  # Tests. A rule with an example of what it catches and an example of what it must
  # ignore is a rule someone can safely edit later.
  - field: tests.match_count
    operator: gte
    value: '1'
    message: Add at least one event this alert should match. Mark it from the results gutter.
    severity: warn

  - field: tests.no_match_count
    operator: gte
    value: '1'
    message: Add at least one event this alert should ignore, so a future edit cannot widen it silently.
    severity: warn

  # Checked when the alert is saved, since it needs the tests to actually run.
  - field: tests.all_passing
    operator: is_true
    message: Tests are failing. Fix the query or the expectations before saving.
    severity: block