Why Your SOC 2 Evidence Gets Rejected: The Difference Between a Log and Proof an Auditor Will Accept
Stop SOC 2 evidence rejection. Learn why raw logs fail and how to provide audit-ready proof using completeness, integrity, and cryptographic traceability.
Introduction
For many senior engineers and tech leads, the SOC 2 (System and Organization Controls 2) audit process feels like a recurring tax on productivity. You’ve built a robust infrastructure, implemented rigorous CI/CD pipelines, and ensured that every production change is logged. However, when the audit window opens, a familiar friction arises: you provide a CSV export of your GitHub PRs or a series of CloudWatch logs, only for the auditor to push back, claiming the evidence is "insufficient" or "lacks integrity."
This disconnect stems from a fundamental misunderstanding of what constitutes "evidence" in the eyes of a professional auditor. To an engineer, a log is a record of an event. To an auditor, a log is merely a data point that, without proper context, completeness, and proof of non-tampering, cannot be relied upon to form an opinion on the effectiveness of a control. The gap between "we have a log" and "we have proof" is where most SOC 2 compliance efforts fail, leading to costly delays, "qualified" opinions, or the dreaded "management comment" in the final report.
In this post, we will explore why raw logs often fail auditor scrutiny, the critical importance of proving a "complete population," and how modern engineering teams are moving toward cryptographically verifiable evidence to streamline the audit process. By shifting your mindset from "visibility" to "assurance," you can transform compliance from a manual chore into an automated, high-integrity component of your platform engineering strategy.
The Auditor’s Framework: Completeness, Accuracy, and Integrity (CAI)
When an auditor reviews evidence, they aren't just looking to see if an action happened; they are evaluating the evidence against the CAI framework. If your submission fails any of these three pillars, it will be rejected.
Completeness
Completeness is the most common pitfall for engineering teams. If you are asked for a list of all production access requests for the last six months, and you provide a spreadsheet, the auditor’s first question is: "How do I know this is all of them?" Without a way to reconcile the list against the source of truth (the "population"), the evidence is incomplete. If your system generated 1,000 access logs but your export only shows 950 because of a filter error or a logging failure, your control has failed the completeness test.
Accuracy
Accuracy refers to the correctness of the data within the records. Does the timestamp reflect the actual time of the event in UTC, or is it localized? Does the "User ID" map to a real person in your HR system? If the auditor finds even one discrepancy—such as a log entry showing an action by a user who was supposedly offboarded—the accuracy of the entire evidence set is called into question.
Integrity
Integrity is about the "chain of custody." How can the auditor be sure that an administrator didn't modify the logs before exporting them? Raw text files or CSVs are notoriously easy to edit. To satisfy integrity requirements, you must prove that the evidence has remained unchanged from the moment of creation to the moment of delivery. This is why "read-only" access to logging buckets or immutable audit trails are so critical.
Why Raw Logs and Screenshots Fail the Test
Many teams rely on screenshots as a quick way to "prove" a configuration. However, as discussed in Rectify’s guide on moving beyond screenshots, screenshots are low-fidelity evidence. They represent a single point in time, are easily manipulated with "Inspect Element," and lack the metadata necessary to prove they haven't been tampered with.
Raw logs suffer from a similar problem: they lack context. A log might tell you what happened, but it doesn't necessarily tell you why it was allowed or who authorized it. For example, a log showing a successful ssh login to a production server is meaningless to an auditor unless it is linked to a specific, approved Jira ticket or an ephemeral access request. Without this linkage—this "traceability"—the log is just noise.
Furthermore, raw logs are often missing the "system boundaries." An auditor needs to see the edges of the system. If you provide logs from AWS CloudTrail but forget to include logs from your third-party SaaS providers that have administrative access to your environment, your evidence is architecturally incomplete.
The Population Problem: Why One Log Isn't Enough
In a SOC 2 Type II audit, which covers a period of time (usually 6 to 12 months), auditors use "sampling" to test controls. If your control states that "all production code changes must be peer-reviewed," the auditor won't look at every single PR. Instead, they will ask for the "total population" of PRs for the period.
From that population, they will randomly select a sample (e.g., 25 or 40 items). If even one of those samples fails to show a peer review, the entire control is marked as "failed." This is why providing the population is more important than providing the individual records. If you cannot prove that the list of 1,000 PRs you provided is indeed the entire list of PRs that occurred in that timeframe, the auditor cannot perform valid sampling, and the evidence is rejected.
To solve the population problem, engineers should focus on:
- System Reconciliation: Providing a count of records from the source system (e.g., GitHub API) and matching it to the count in the evidence repository.
- Sequence Checking: If your logs use incrementing IDs, any gap in the sequence suggests missing data.
- Time-Bound Exports: Ensuring exports are strictly bounded by the audit start and end dates with no "leakage."
Technical Implementation: Creating "Audit-Ready" Evidence
To move from logs to proof, we need to wrap our data in a layer of metadata and cryptographic assurance. A modern audit event should be structured, signed, and immutable.
Consider the difference between a standard log entry and an audit-ready JSON object. A standard log might look like this:
2023-10-27 14:00:05 USER_AUTH_SUCCESS user_id=9928
An audit-ready proof, however, looks more like this:
{
"event_id": "8f3d9b2a-7e1b-4c5d-9a3f-123456789abc",
"version": "1.0",
"timestamp": "2023-10-27T14:00:05.123Z",
"actor": {
"id": "user_9928",
"email": "engineer@company.com",
"mfa_verified": true,
"ip_address": "192.168.1.105"
},
"action": "production_database_access",
"resource": "db-cluster-prod-01",
"context": {
"ticket_id": "OPS-452",
"approval_id": "appr_5566",
"session_duration_minutes": 60
},
"integrity": {
"hash_algorithm": "SHA-256",
"signature": "MEYCIQCMzX...[truncated]...",
"signer": "kms-key-arn-12345",
"previous_event_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
}Why this works:
- Traceability: It links the action directly to a business justification (
ticket_id). - Context: It includes MFA verification status and the specific resource.
- Integrity: The
signaturefield allows an auditor (or an automated script) to verify that the record hasn't been altered since it was generated. - Chain of Custody: The
previous_event_hashcreates a hash chain, making it impossible to delete a record without breaking the chain for all subsequent records. This is the "gold standard" for proving completeness.
Building an Evidence-First Architecture
For tech leads, the goal should be to build systems that produce "self-describing" evidence. This reduces the burden on your team during audit season and builds a higher level of trust with external parties.
Key strategies for an evidence-first architecture include:
- Centralized Immutable Storage: Stream all critical logs to an S3 bucket with "Object Lock" enabled. This prevents anyone—including root users—from deleting or modifying logs for a set retention period.
- Automated Population Generation: Use cron jobs or Lambda functions to periodically query your APIs (AWS, GitHub, Okta) and generate "population manifests." These manifests serve as the source of truth for what happened during a specific window.
- Programmatic Verification: Instead of waiting for an auditor to find an error, write scripts that validate your evidence daily. Do all PRs have an associated Jira ticket? Is every production login tied to an on-call schedule?
- Moving Beyond Screenshots: As emphasized in the Rectify Cloud blog, replace manual UI captures with API-driven configuration exports. An API response from
/v1/password_policyis far more reliable and easier to version-control than a screenshot of a settings page.
The Sampling Trap and How to Avoid It
Engineers often think of "99% compliance" as an A-grade. In an audit, 99% is often a failure. If an auditor selects 25 samples and finds one error, they may "expand the sample" to 60 or more. If they find a second error, the control is deemed ineffective.
This binary nature of auditing is why "manual" evidence collection is so risky. If a human is responsible for manually checking a box or saving a PDF, they will eventually miss one. Automation is the only way to ensure the 100% consistency required for a clean SOC 2 report. By treating evidence as code—subject to linting, testing, and versioning—you eliminate the "oops" factor that leads to rejected evidence.
Conclusion
The difference between a log and proof is the difference between data and assurance. Raw logs are a byproduct of system operations; audit-ready proof is a deliberate engineering output designed to withstand hostile scrutiny. To succeed in a SOC 2 audit without losing hundreds of engineering hours, teams must prioritize the integrity, completeness, and traceability of their data.
By implementing structured logging, cryptographically signing critical events, and moving away from manual artifacts like screenshots, you can provide auditors with evidence they can’t reject. This not only speeds up the audit process but also improves your overall security posture. After all, if you can’t prove to an auditor that your controls are working, you probably can’t prove it to yourself during a security incident either. Stop collecting logs and start generating proof. The transition from manual "evidence gathering" to automated "assurance generation" is the hallmark of a mature, high-performing engineering organization.
This content was generated by AI.