Skip to main content
Systems Engineering

Continuous Control Monitoring for SOC 2 Audits

How AWS Config, Okta logs and GitHub audit events feed a continuous control monitoring pipeline that replaces manual SOC 2 evidence pulls.

Continuous Control Monitoring for SOC 2 Audits

In this guide

Share

Every audit cycle exposes the same structural failure: control evidence is gathered as a point-in-time snapshot, weeks after the state it describes has changed. A screenshot of an IAM policy taken in March tells an auditor nothing about whether that policy drifted in April. Continuous control monitoring replaces the snapshot model with a standing pipeline that ingests system state changes as they happen, evaluates them against a control catalogue, and produces evidence with a provable freshness SLA. This is not a GRC tooling purchase decision; it is a data engineering problem wearing a compliance hat, and it needs to be architected like one.

#The Bottleneck: Evidence Decay and Manual Pull Cycles

Traditional SOC 2 Type II evidence collection relies on control owners exporting configuration state on a fixed cadence — typically monthly or quarterly — and dropping it into a shared drive for the auditor. Two failure modes emerge immediately. First, evidence decay: a control that passed in month one may silently regress in month two with nobody noticing until the next pull. Second, collection cost: each control owner burns hours per cycle running manual exports from IAM, the identity provider, the CI/CD platform and the ticketing system, and that cost scales linearly with the number of controls and systems in scope.

Continuous control monitoring inverts this by treating every control as a query against a live evidence stream rather than a manually curated artefact. The audit period no longer determines when evidence is collected — it only determines the window over which stored evidence is queried. This shift has direct implications for architectural patterns used elsewhere in the platform: it is the same event-sourcing philosophy applied to compliance state instead of application state.

#Architectural Breakdown

A production-grade continuous control monitoring pipeline has five layers, and conflating any two of them is where most homegrown implementations collapse under audit scrutiny.

#
1. Source Collectors

Each in-scope system — AWS Config, Okta System Log, GitHub audit log, the ticketing system, the MDM console — needs a dedicated collector that polls or subscribes to change events natively. Collectors must be read-only and scoped to the narrowest IAM role possible; a compliance pipeline with write access to production identity systems is itself a control finding waiting to be raised.

#
2. Normalisation Layer

Raw evidence from disparate sources arrives in incompatible shapes. A normalisation layer maps each source event to a common evidence schema before it lands in storage, so downstream control logic never has to know whether a given fact originated from an AWS Config rule or an Okta log line.

#
3. Immutable Evidence Store

Evidence must be append-only. Auditors increasingly ask not just “was the control satisfied” but “can you prove this record wasn’t altered after the fact”. Object storage with versioning and a write-once retention policy, or a ledger-backed table, satisfies this without needing a bespoke blockchain solution.

continuous control monitoring

#
4. Control Evaluation Engine

This is the layer that actually performs continuous control monitoring — a rules engine that evaluates the current evidence state against a declarative control definition and emits a pass/fail/degraded status with a timestamp and the evidence reference that produced the verdict.

#
5. Audit Interface

A dashboard or exportable report layer that lets an auditor query control status across any date range inside the retained evidence window, rather than being handed a single export file.

Rendering diagram...

#Implementation Logic

Building this out follows a strict sequence. Skipping straight to tooling before the catalogue exists is the single most common cause of failed continuous control monitoring rollouts.

  • Step 1 — Build the control catalogue. Map each Trust Services Criteria requirement to a machine-testable assertion, not a narrative description. “Access is reviewed periodically” is not testable; “no IAM principal has an unused credential older than 90 days” is.
  • Step 2 — Instrument collectors per source. Deploy one collector per system, each authenticated with a scoped service principal and short-lived credentials.
  • Step 3 — Normalise into a common evidence schema. Every evidence record carries a source, timestamp, subject, and raw payload reference.
  • Step 4 — Encode control logic as policy-as-code. Use a declarative engine so control definitions are version-controlled and diffable in pull requests.
  • Step 5 — Wire evaluation results to alerting. A control regression should page the control owner within the freshness SLA window, not surface three months later during fieldwork.

#Code and Configurations

The evidence schema needs to be strict enough that the evaluation engine can trust it without defensive parsing on every query. A minimal normalised record looks like this:

1{
2 "evidence_id": "ev-8f21c3",
3 "source_system": "okta_system_log",
4 "control_ref": ["CC6.1", "CC6.3"],
5 "subject": "user:jsmith@corp.example",
6 "event_type": "mfa_factor_removed",
7 "observed_at": "2024-05-14T09:32:11Z",
8 "collected_at": "2024-05-14T09:32:41Z",
9 "raw_ref": "s3://compliance-evidence/okta/2024/05/14/8f21c3.json",
10 "integrity_hash": "sha256:4f2a91b7c8..."
11}

Control logic is expressed declaratively so it can be reviewed like application code. A Rego policy evaluating stale credential exposure for a continuous control monitoring check against CC6.1 might look like:

1package controls.cc6_1
2
3default violation = false
4
5violation {
6 input.credential.type == "iam_access_key"
7 age_days := time.diff_days(time.now_ns(), input.credential.created_at)
8 age_days > 90
9 input.credential.last_used_days > 90
10}
11
12reason = msg {
13 violation
14 msg := sprintf("Access key %s unused for over 90 days", [input.credential.id])
15}

Querying the evidence store for a specific control window over an audit period is a straightforward analytical query once the schema is consistent — here against an Athena table backed by the S3 evidence lake:

1SELECT control_ref, source_system, COUNT(*) AS violations
2FROM compliance_evidence.control_evaluations
3WHERE evaluation_status = 'fail'
4 AND observed_at BETWEEN DATE '2024-01-01' AND DATE '2024-06-30'
5GROUP BY control_ref, source_system
6ORDER BY violations DESC;

#Failure Modes and Edge Cases

Continuous control monitoring pipelines fail quietly rather than loudly, which is worse than an outright crash because the audit trail looks intact even when it isn’t.

Continuous Control Monitoring for SOC 2 Audits architecture diagram 2

Collector rate-limiting. Okta and GitHub both throttle API polling under load. A collector that silently drops events on a 429 rather than backing off and re-queuing produces an evidence gap that looks identical to “nothing happened” — indistinguishable from a genuinely clean period until an auditor cross-references a ticket that has no corresponding evidence record.

Clock skew and timestamp trust. If observed_at is taken from the source system and collected_at from the collector, a drifted NTP source on either side introduces ordering ambiguity in control evaluations that depend on sequence, such as “MFA removed before offboarding ticket closed”.

Schema drift on source APIs. Vendors change log field names without a major version bump (Okta has done this on System Log event payloads). Normalisation code that assumes a stable schema will either throw and halt ingestion, or worse, silently null out a field the control logic depends on, producing a false pass.

Credential expiry on the collectors themselves. A compliance pipeline is, ironically, one of the least-monitored pieces of internal infrastructure. If the service principal reading AWS Config expires and nobody rotates it, the evaluation engine keeps running against stale cached evidence and reports green controls that are actually unverified.

Failure ModeRoot CauseDetection MethodMitigation
Evidence gapAPI rate-limit dropHeartbeat monitor per collectorExponential backoff with dead-letter queue
False passSchema drift on source fieldSchema contract tests in CIVersioned normalisation adapters per source
Ordering errorClock skew between systemsNTP drift alertingUse collector-side monotonic sequence, not wall clock
Silent stalenessExpired collector credentialCredential TTL alert 14 days outAutomated rotation via secrets manager
Tamper riskMutable evidence storePeriodic hash chain auditObject Lock / append-only ledger table

#Scaling and Security Trade-offs

Deciding how to scale continuous control monitoring across an expanding source-system estate involves genuine architectural trade-offs, not a single correct answer.

  • Centralised vs federated collectors: A single collection service simplifies credential management but becomes a blast-radius risk — compromise it and every downstream system’s read access is exposed in one place. Federated, per-system collectors with independently scoped roles reduce blast radius at the cost of operational overhead across dozens of small services.
  • Batch vs streaming ingestion: Batch polling every 15 minutes is cheaper and simpler to reason about but widens the detection window for control regressions. Streaming via webhooks or EventBridge reduces the window to seconds but requires the normalisation and evaluation layers to be horizontally scalable under bursty load, particularly during mass offboarding events.
  • Retention cost vs audit defensibility: Storing raw evidence payloads indefinitely increases both storage cost and the surface area for a data-handling finding of its own; a defined retention window aligned to the audit period plus a buffer (typically 13–18 months) balances defensibility against cost.
  • Real-time alerting vs alert fatigue: Paging on every control evaluation failure produces noise that trains control owners to ignore alerts entirely. Tiering severity by control criticality — access control violations page immediately, change-management documentation gaps batch into a weekly digest — keeps signal usable.
  • Policy-as-code review rigour vs delivery speed: Treating control definitions as code under pull request review adds friction to onboarding new controls but prevents an unreviewed logic change from silently weakening what the pipeline actually enforces.

None of these trade-offs are settled once and left alone. As the control catalogue grows past the first few dozen entries and the source-system count climbs into double digits, the evaluation engine’s query load and the alerting tier boundaries both need periodic re-tuning against the same operational telemetry the pipeline itself produces — which is, appropriately, the strongest argument for building continuous control monitoring as production infrastructure rather than a compliance side project. Formal guidance on control mapping and evidence sufficiency for SOC 2 engagements is documented in the AICPA SOC suite reference material, and it is worth cross-checking any internal control catalogue against it before an auditor does it for you.

Evidence trail

Sources and verification

Primary documentation and external technical references used in this article.

  1. 01AICPA SOC suite reference materialaicpa-cima.com
Marcus Thorne

Marcus Thorne

Systems Engineering Editor

Marcus Thorne is a pragmatic software architect focused on highly concurrent, distributed transactional systems.

Published Last changed
View Profile
Reader Interaction

Comments

Add a thoughtful note on Continuous Control Monitoring for SOC 2 Audits. Comments are checked for spam and held for moderation before appearing.

Loading comments...
Comment submission is disabled until Cloudflare Turnstile keys are configured.

Learn More About KBY

Was this useful?

Engineering insights, direct to you.

Receive the latest Systems Engineering tutorials, production guides, Engineering Labs and operational best practices.