mipo

Port State Changes

The Port State Changes page tracks port state transitions between consecutive scans. The ledger is populated automatically after every completed scan — each scan is diffed against the previous completed scan of the same template, per scanner vantage, and only the opened/closed transitions are recorded (unchanged ports are not re-listed). This is a core GRC feature for compliance tracking, providing evidence of network changes over time for SOC2 and ISO 27001 reporting.

Fields & columns

NameDescription
TimeTimestamp when the state change was detected
IPIP address of the host where the port state changed
HostnameReverse-DNS name(s) for this row's IP, decorated from the SAME scan execution the row belongs to — never from the baseline scan being diffed against. Not filterable or sortable. "—" can mean no reverse-DNS evidence exists for that execution's host (not requested, still pending, the read failed, or the evidence was removed by retention — change rows are kept forever, while DNS evidence is kept for 90 days after the enrichment closes), or, for a reconciler-derived row with no scan id, that there is nothing to decorate from at all — the column does not distinguish these.
ScannerThe scanner (vantage point) that observed the change. Each scanner is compared with its own previous run of the template, so the same port can appear once per vantage point.
PortPort number that changed state
ProtocolTransport protocol (TCP or UDP)
Previous StatePort state before the change (open, closed, or filtered)
Current StatePort state after the change (open, closed, or filtered)
ServiceDetected service running on the port, if identified
VersionDetected service version, if identified
ScanName of the scan that detected the state change
ReceiptFor a scanner-reported change, a link (by job id) to the execution receipt of the job that produced it. Empty for a row the server-side reconciler derived, which has no single owning job.
EvidenceThe linked receipt's result hash — a value to cross-check against the receipt once you open it, not a lookup key.

How to

Track port state changes for compliance

  1. Navigate to Audit > Port State Changes.
  2. Filter by subnet or port range.
  3. Review opened and closed port events.
  4. Export the filtered view for compliance documentation.

Gotchas

  • State changes are stored in TimescaleDB for efficient time-series queries and automatic compression.
  • Scanner groups scanning from different vantage points may report different states for the same port, since network path or firewall rules may differ per location.
  • A port transitioning from "filtered" to "closed" or vice versa may indicate firewall rule changes rather than service changes.
  • State changes are only detected between consecutive scans of the same target. A port must have been seen in a prior scan to generate a change record.
  • Only state CHANGES are recorded — a port that stays open across scans is not re-listed (storage compaction). Absence of rows for a scan can mean "no changes" (it had a baseline) or "baseline scan" (no prior scan); the scan results page distinguishes these.
  • A change row that came from a scanner-reported (compacted) run links to the execution receipt for the job that produced it (its job id → the job receipt detail). The receipt is the proof the change is grounded in a real, fully-attempted run. Rows derived by the server-side reconciler have no single owning job, so they show no receipt link.
  • Each scanner is compared with the last completed scan of the same template it actually took part in, and a scanner that reported deltas last time is compared with the open set its receipt vouched for — so a scanner that missed a scan, or switched between delta and full reporting, does not re-report every open port as a change. The scan summary's "since scan #N" names the template's latest completed scan; a scanner that sat that one out is compared with an earlier scan of its own.
  • The evidence hash on a change row is the receipt result hash — a verification REDUNDANCY you can cross-check against the linked receipt, not the lookup key. The job id is the link; the evidence hash is the anchor you compare once you arrive.
  • Hostname is always the name from the execution the row belongs to (its own scan id), never the baseline scan it is being compared against — a change row and its baseline can show different hostnames if the reverse-DNS answer changed between the two scans.

API calls (1)

MethodPathDescription
GET /api/audit/states List port state changes with filtering

Related

  • Changes — Tracks configuration changes rather than network state changes
  • Views — Tracks read access to resources rather than port state transitions
  • Auth — Tracks authentication events rather than network state changes
  • Execution Proof — The per-job receipts a compacted change row links to via job id — proof the change came from a real run
  • Job Receipt — The single receipt a change row opens; its result hash is the row's evidence anchor