InfraGuard

Security Problem Resolution

A case board that runs security incidents and breaches through an open→investigating→cause→resolved→closed workflow, and auto-tracks critical findings promoted from Security Diagnostics.

Overview — what it does

Security ▸ Problem Resolution manages security incident and breach response as a single case board with a five-stage pipeline:

open → investigating → cause_identified → resolved → closed

Every case carries a 500-report structure (direct cause / root cause / resolution / preventive action) and an auditable timeline. This screen mirrors the Service ▸ Problem Resolution controller: it shares the same infr_incident table but filters on area='security' to keep security cases separate from service incidents.

Cases reach this board through two tracks:

  1. Manual entry — an operator creates the case. Selectable sources: manual · agency · quarantine.
  2. Diagnostics promotion — fail + crit findings from Security Diagnostics are automatically promoted into cases (source=detection). This is a system-only source that operators cannot pick by hand.

This console does not touch remote crontab or firewalls directly. It is a workflow tool that records and tracks the human response process. Actual block/quarantine actions live in Blocklist and Auto-block.


When to use


Layout

KPI strip

KPI Definition
total Total cases where area='security'
active Sum of open + investigating + cause_identified
resolved Sum of resolved + closed
MTTR Mean minutes for cases having both occurred_at and resolved_at
downtime Sum of downtime_min across all cases
uptime target OpsPolicy::slaDefaults()['uptime_target']

Case board

Cases are sorted by:

  1. Status rank — open → investigating → cause_identified → resolved → closed
  2. Severity rank — crit → warn → info
  3. Newest first — id descending

Each card shows the title, severity, status, source badge, linked project/service, occurrence time, downtime, and event count.

Detail modal

Opening a case splits into two panes:

Clicking the status pipeline at the top opens a step-transition dialog that shows "what to do at this stage" guidance and lets you update that stage's report fields inline.


How to use

Create a case (manual)

  1. Click [Add case] at the top.
  2. Enter title (required), severity, and source (manual / agency / quarantine).
  3. Optionally set project, service, URL, occurrence time, impact, downtime (minutes).
  4. [Save] — a new case is created with status=open, area=security, detected_at=now(), and a created event is written to the timeline.

detection is not offered in the source list — it is a system-only source that Security Diagnostics generates automatically.

Status transitions (pipeline)

Click the target status in the detail modal's pipeline. Recommended work per stage:

Stage What to do at this stage
open Reset to intake (before analysis)
investigating Confirm symptoms, scope impact, write the summary
cause_identified Determine and record the direct cause + background (root) cause
resolved Record the recovery method + preventive action
closed Verify actions/prevention are applied, then close the case

Server-side transition rules:

Collaboration notes

Adding a note in the detail modal records a kind=note event on the timeline. There is no separate note table — notes are consolidated into infr_incident_event.

Delete

Deleting a case also deletes its infr_incident_event rows and is written to the audit log. (The original diagnostics scan behind a promoted case is independent and is not deleted.)

Auto-resolution of promoted cases

When Security Diagnostics ingests a probe result, DiagnosticsService::reconcileCases() reconciles cases per host:

Auto-resolution only fires when the diagnostic check passes again. Manually created cases (manual/agency/quarantine) are never auto-resolved — an operator must transition them through the pipeline.


Data sources

Tables

Table Role
infr_incident Case body (filtered area='security'). Status, severity, source, 500-report fields, occurred/resolved/closed times, fingerprint, occurrence_count
infr_incident_event Case timeline (created, note, status change, …)
infr_project Project list for linking
infr_service Service list for linking

Enumerations

STATUSES   = [open, investigating, cause_identified, resolved, closed]
SEVERITIES = [info, warn, crit]
SOURCES    = [manual, pulse, alert, agency, quarantine, detection]   # all
manual-selectable sources = [manual, agency, quarantine]
OPEN_STATUSES (dedup targets) = [open, investigating, cause_identified]
AREAS = [service, security]   # shared-table split axis

Report fields (500 structure)

Field Meaning
summary Symptom / impact summary
direct_cause Immediate cause (e.g. MySQL Too many connections)
root_cause Background / root cause (e.g. script connection leak)
resolution Recovery applied during the incident
action_taken Preventive action for the future
downtime_min Downtime (minutes) — source of the downtime KPI
impact Affected scope

API endpoints

Method · path Purpose
GET /security/resolution Initial board render
GET /security/resolution/live Polling refresh (cases, KPI, timestamp)
POST /security/resolution/save Create / update a case
POST /security/resolution/transition Status transition (+ optional note / report update)
POST /security/resolution/note Add a collaboration note
POST /security/resolution/delete Delete a case

Access


Troubleshooting & FAQ

Q. A case I see on the Service board is missing here. Both boards share the same infr_incident table but split on area. This screen shows area='security' only. Find service incidents in Service ▸ Problem Resolution.

Q. I can't create a case with the detection source. Expected. detection is a system-only source that Security Diagnostics auto-creates from fail+crit findings. Manual entry offers only manual, agency, quarantine.

Q. An auto-promoted case flipped itself to resolved. When the underlying diagnostic check passes on a later scan, reconcileCases() auto-resolves the open case: resolution is filled with the auto-resolved text and a status-change event is added.

Q. MTTR is blank. MTTR is only computed for cases that have both occurred_at and resolved_at. Cases without an occurrence time, or not yet resolved, are excluded.

Q. Can I set a past closed-at time? Yes. Enter a value in the closed-at field of the close dialog (same interface as occurrence time) and it is saved verbatim. Leave it empty and the server fills now() only if no value exists yet.

Q. Does deleting a case remove its diagnostics scan? No. A promoted case and its source diagnostics scan are independent. Deleting a case removes only its linked timeline events.


Related

The security problem-resolution board
The security problem-resolution board