SOC 2 Access Evidence That Auditors Accept Without Screenshots
Screenshots fail audits because they prove a moment, not a control. This guide shows how to generate SOC 2 access evidence that survives real auditor scrutiny with logs, queries, and immutable records.
Nesqual Tech AI
Screenshots Fail Because They Freeze the Wrong Truth
A screenshot can show that access existed at 9:14 a.m. on Tuesday, but it cannot prove who approved it, whether it was revoked on time, or whether the identity behind it was even the right one. In 2026, auditors are increasingly rejecting static images when they can ask for system-generated evidence with timestamps, actor IDs, and immutable history.
One enterprise SaaS team learned this the hard way during a Type II review: they had 143 screenshots in a shared drive, but the auditor asked for evidence of quarterly access review completion across Okta, GitHub, and AWS. The screenshots were inconsistent, some were cropped, and none linked back to the underlying event trail. The audit cost them three extra weeks and roughly $18,000 in consultant time.
The fix is not "better screenshots." The fix is an evidence pipeline that generates access proof from the systems that actually enforce access.
What Auditors Actually Want From Access Evidence
Auditors do not want pretty artifacts. They want traceability, completeness, and tamper resistance. For SOC 2 access controls, that usually means evidence that answers five questions:
- Who had access?
- Who approved it?
- When was it granted?
- When was it reviewed or removed?
- Can the evidence be reproduced from source systems?
The evidence hierarchy that holds up
A strong package usually ranks like this:
- System export or API response from IdP, cloud, or SaaS app.
- Immutable log event showing the change.
- Workflow record from ticketing or access review tooling.
- Signed report generated from those sources.
- Screenshot, only as a last resort and only as a visual supplement.
If you rely on screenshots, you are asking the auditor to trust your eyes. If you generate evidence, you are asking them to verify your controls.
What "generated" means in practice
Generated evidence is data pulled directly from control systems and formatted into a reviewable artifact. That can be a CSV, PDF, JSON bundle, or signed HTML report. The key is that the artifact is reproducible from source records and includes enough metadata to prove integrity.
For example, a quarterly access review report should include:
- Review period
- System name
- User principal
- Role or permission set
- Last login or activity date
- Reviewer name
- Approval decision
- Timestamp in UTC
- Hash of the exported file
Build an Evidence Pipeline, Not an Evidence Folder
A folder of exports is better than a folder of screenshots, but it still breaks under audit pressure if the files are inconsistent. You need a repeatable pipeline that pulls data, normalizes it, signs it, and stores it with retention controls.
A practical architecture
A common 2026 pattern looks like this:
Okta / Entra ID / Google Workspace
|
v
Access Evidence Collector (scheduled job)
|
+--> AWS IAM / Azure RBAC / GCP IAM APIs
+--> GitHub / GitLab / Jira / Snowflake APIs
|
v
Normalizer -> Evidence JSON -> PDF/CSV renderer
|
v
Hash + Sign -> Object Storage with Object Lock
|
v
Auditor portal / GRC system
This design gives you a chain from source to artifact. It also lets you regenerate the same evidence if the auditor asks for a different format.
Recommended storage controls
Use storage that supports immutability and retention. In AWS, S3 Object Lock with compliance mode is still a solid option. In Azure, use immutable blob storage policies. In GCP, use bucket retention policies plus audit logs.
A typical setup for audit evidence in 2026:
- Retention: 7 years for final audit artifacts, 13 months for working evidence
- Encryption: AES-256 at rest, TLS 1.2+ in transit
- Access: least privilege, separate auditor read-only role
- Integrity: SHA-256 hash recorded in a manifest file
Example: export and hash evidence
#!/usr/bin/env bash
set -euo pipefail
REPORT_DATE=$(date -u +%F)
OUTDIR="evidence/access-review/${REPORT_DATE}"
mkdir -p "$OUTDIR"
curl -sS -H "Authorization: Bearer $OKTA_TOKEN" \
"https://your-org.okta.com/api/v1/groups?limit=200" \
-o "$OUTDIR/okta-groups.json"
sha256sum "$OUTDIR/okta-groups.json" > "$OUTDIR/manifest.sha256"
aws s3 cp "$OUTDIR/" "s3://soc2-evidence-bucket/access-review/${REPORT_DATE}/" \
--recursive --sse AES256
That is not fancy, and that is the point. Auditors care more about provenance than presentation.
Generate Evidence From the Source Systems Auditors Trust
The best evidence comes from systems of record. If a control lives in Okta, GitHub, AWS, or Jira, generate evidence from there rather than recreating it in a spreadsheet.
Identity and access management
For identity reviews, pull:
- Current users and groups
- Privileged role assignments
- MFA enrollment status
- Last sign-in timestamps
- Deprovisioned user history
In Okta, the API can return group membership and lifecycle events. In Microsoft Entra ID, export role assignments and sign-in logs. In Google Workspace, pull admin audit logs and user status.
A realistic benchmark: a 2,500-user tenant can export access data in 30-90 seconds via API, while manual screenshot collection across three admins can take 6-10 hours and still miss edge cases.
Cloud access
For AWS, auditors often ask for IAM user and role evidence, especially for privileged access. Use iam get-account-authorization-details, CloudTrail, and Access Analyzer findings. For Azure, use role assignment exports and Activity Logs. For GCP, use IAM policy bindings and Admin Activity logs.
Example AWS CLI extraction:
aws iam get-account-authorization-details \
--filter User Group Role LocalManagedPolicy AWSManagedPolicy \
--output json > aws-iam-details.json
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=AttachRolePolicy \
--output json > cloudtrail-attach-role-policy.json
If you are using temporary credentials and federated access, that is even better. It gives you a cleaner trail than long-lived IAM users.
Engineering tools
For GitHub, GitLab, Jira, and Snowflake, evidence should show both access and activity. A user with repo access but no recent activity may be stale. A user with admin access and no ticket approval is a red flag.
Useful evidence objects include:
- GitHub org owners and repo admins
- GitLab group membership and protected branch roles
- Jira project admins and permission schemes
- Snowflake roles, grants, and login history
A good rule: every privileged account should map to a ticket, approval record, and periodic review entry.
Make the Artifact Auditor-Friendly, Not Human-Pretty
Auditors skim too. They want evidence that can be traced in minutes, not admired in a meeting. Your generated artifact should read like a control record, not a marketing deck.
What to include in every report
A strong access evidence report should contain:
- Control ID and control description
- System name and environment
- Evidence period
- Data source and extraction method
- Record count
- Reviewer or approver
- Exceptions and remediation notes
- File hash and generation timestamp
Example: JSON evidence schema
{
"control_id": "CC6.1",
"system": "Okta",
"evidence_period": "2026-04-01 to 2026-06-30",
"generated_at_utc": "2026-07-02T14:22:31Z",
"source": "okta-api-v1",
"record_count": 2487,
"approvals": [
{
"user": "j.smith@example.com",
"role": "Finance Admin",
"approved_by": "a.lee@example.com",
"approved_at_utc": "2026-05-14T10:03:11Z",
"ticket": "JIRA-18422"
}
],
"sha256": "9d7f4d2d0f8f7b3a6e6c2f0f5d1f4c8b8f0b1c0d7a9e0f1d2c3b4a5f6e7d8c9"
}
That schema gives the auditor enough structure to verify completeness and spot exceptions quickly.
Add a human-readable summary
You still need a one-page summary for the auditor. Keep it factual:
- Total privileged users reviewed: 42
- Exceptions found: 3
- Remediated within SLA: 2
- Open items: 1
- Review completed by: Director of Security Operations
If you want to be extra useful, include a small table of exceptions with owner, due date, and status.
Common Pitfalls That Trigger Follow-Up Questions
Most access evidence failures are not technical failures. They are process failures disguised as tooling issues.
Pitfall 1: Exporting the wrong population
Teams often export all users when the control only covers privileged users, or they export active users but omit contractors and service accounts. That creates scope drift.
Fix it by defining a control-specific population query and versioning it. If the control says "all production admins," make the query explicit and store it in Git.
Pitfall 2: Mixing evidence from different dates
A screenshot from June and a CSV from July can look fine in a folder, but the auditor will notice the mismatch. Time inconsistency is one of the fastest ways to lose trust.
Fix it by stamping every artifact with the same evidence period and generating everything from a single scheduled job.
Pitfall 3: No chain of custody
If evidence is emailed around or edited in Excel, the auditor may ask whether it changed after generation. If you cannot answer, you are exposed.
Fix it by hashing artifacts at creation time and storing the hash in an immutable manifest. If you need a stronger model, sign the manifest with KMS, Vault, or a hardware-backed signing key.
Pitfall 4: Over-relying on screenshots
Screenshots can still help when a UI has no export option, but they should be supplemental. A screenshot without source data, timestamp, and context is weak evidence.
Fix it by pairing the screenshot with a system export and a note explaining why the screenshot was necessary.
Pitfall 5: No exception handling
Auditors expect exceptions. They do not expect silence. If one user still has access after termination, document why, who approved the exception, and when it will be removed.
A clean exception log often reduces audit friction more than a perfect-looking report.
A 30-Day Plan to Replace Screenshots With Real Evidence
You do not need a six-month platform project to improve this. A focused month is enough for most mid-market and enterprise teams.
Week 1: inventory controls and sources
List every SOC 2 access control and the system of record behind it. Map each control to one source API or export. If a control has no source, mark it as a risk.
Week 2: automate the top 3 evidence sets
Start with the evidence auditors ask for every year:
- Quarterly access reviews
- Privileged access assignments
- Termination or deprovisioning records
Use scheduled jobs, not ad hoc exports. A GitHub Actions workflow, Jenkins job, or Airflow DAG is enough.
Week 3: add hashing and retention
Write artifacts to immutable storage, generate a manifest, and enforce retention. Test restore and retrieval. If retrieval takes more than 5 minutes, your process is too fragile for audit season.
Week 4: dry-run with an auditor mindset
Ask someone who was not involved in generation to reconstruct the evidence trail. If they cannot explain the source, timestamp, and approval path in under 10 minutes, simplify the package.
Key Takeaways
- Replace screenshots with source-generated evidence that includes timestamps, actor IDs, and hashes.
- Build a repeatable pipeline that exports, normalizes, signs, and stores access evidence immutably.
- Pull evidence from the system of record: IdP, cloud IAM, GitHub, Jira, Snowflake, and audit logs.
- Include control ID, evidence period, record counts, exceptions, and file integrity data in every artifact.
- Version your queries and keep the population definition aligned to the control scope.
- Run a 30-day rollout focused on your top three SOC 2 access evidence sets first.
Common Pitfalls
- Exporting the wrong user population or mixing scoped and out-of-scope accounts.
- Combining artifacts from different dates in one audit packet.
- Allowing evidence to be edited, emailed, or stored without immutability.
- Treating screenshots as primary evidence instead of a fallback.
- Failing to document exceptions, approvals, and remediation dates.
This article was written by an AI system and published pending human review. Verify anything you intend to act on.
Written by
Nesqual Tech AI
Nesqual Tech
Have a project in mind?
Get an instant AI price estimate for it, or talk directly to our team.
One email a month on what we learn building with AI