Audit and Logging for Compliance
Compliance Reporting
Read aloud is unavailable in this browser.
When the Audit Request Arrives
The email from external auditors arrives: 'For our SOC 2 examination, please provide evidence demonstrating your access controls operated effectively throughout Q3.'
This request can trigger two very different responses:
Organization A scrambles. Engineers are pulled from product work. Weeks are spent manually querying databases, exporting logs, redacting sensitive data, and compiling spreadsheets. By the time evidence is delivered, it's incomplete, inconsistent, and the team is exhausted.
Organization B clicks a button. An automated system generates the required reports within minutes—access control summaries, privileged action logs, authentication patterns, and anomaly reports—all formatted per auditor requirements, with integrity verification included.
The difference isn't resources or budget. It's compliance reporting architecture: systems designed from the start to transform raw audit data into the evidence that auditors need. This is the final piece of audit and logging infrastructure—making compliance demonstrable, not just achievable.
By the end of this page, you'll understand how to build automated compliance reporting systems. You'll learn which reports each framework requires, how to generate evidence programmatically, how to build compliance dashboards for continuous monitoring, and how to respond efficiently to audit requests.
Compliance Reporting Fundamentals
Compliance reporting transforms raw audit logs into structured evidence that demonstrates control effectiveness. This isn't just about having logs—it's about presenting those logs in formats that auditors expect, with the completeness and integrity they require.
The Compliance Evidence Hierarchy
Auditors evaluate compliance through a hierarchy of evidence:
- Policies and Procedures — Written documentation of what controls should exist
- Configuration Evidence — Proof that controls are technically implemented
- Operational Evidence — Proof that controls operated effectively throughout the period
- Exception Evidence — Documentation of any control failures and remediation
- Management Attestation — Executive certification of compliance posture
Audit logs provide the raw material for operational evidence—but that raw material must be processed, summarized, and presented appropriately.
| Framework | Key Evidence Requirements | Reporting Frequency | Presentation Format |
|---|---|---|---|
| SOC 2 Type II | Access logs, change management, incident response, availability metrics | Annual (3-12 month period) | Narrative + supporting screenshots/exports |
| PCI DSS | Access to cardholder data, security events, vulnerability scans, configuration standards | Annual + quarterly scans | Structured templates, evidence matrix |
| HIPAA | PHI access logs, authorization records, security incidents, risk assessments | On-demand for investigations | Per-request exports, breach notifications |
| GDPR | Data processing records, consent logs, access requests, breach notifications | Continuous + 72-hour breach reporting | Supervisory authority formats |
| SOX | Financial system access, change authorization, segregation of duties | Annual | Auditor-defined formats |
| FedRAMP | Continuous monitoring data, incident reports, vulnerability status | Monthly, annually | ConMon templates, FedRAMP formats |
The easiest time to collect compliance evidence is when controls operate—not afterward. When implementing any control, simultaneously implement the evidence collection. If you deploy access controls, deploy access logging. If you implement change management, capture approval workflows. Evidence collection should be inseparable from control operation.
Standard Compliance Report Types
While specific requirements vary by framework, certain report types recur across nearly all compliance regimes. Implementing these as first-class reporting capabilities covers the majority of audit needs.
- •Access Control Summary — Who has access to what systems and data. Shows current permissions, role assignments, and privileged accounts. Essential for access reviews and segregation of duties.
- •Authentication Activity Report — Login patterns, MFA usage, failed authentication attempts, password changes. Demonstrates authentication controls operate correctly.
- •Privileged Access Report — All actions by administrative accounts. Must capture every use of elevated privileges with business justification where required.
- •Data Access Report — Access to sensitive data categories (PII, PHI, financial). Broken down by user, time period, and access type.
- •Change Management Report — All configuration and code changes with approval workflows. Proves changes follow documented procedures.
- •Security Event Summary — Policy violations, anomaly detections, threat alerts. Demonstrates monitoring controls detect issues.
- •Incident Response Report — Security incidents with timeline, response actions, and resolution. Proves incident handling procedures function.
- •User Lifecycle Report — Account provisioning, modification, and deprovisioning. Proves access is granted and revoked appropriately.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
interface ComplianceReport { // Report metadata reportId: string; reportType: ComplianceReportType; generatedAt: string; generatedBy: string; // Scope scope: { timeRange: { start: string; end: string }; systems: string[]; dataClassifications?: string[]; }; // Report content summary: ReportSummary; details: ReportDetails; exceptions: Exception[]; // Integrity integrity: { checksum: string; signedBy?: string; chainOfCustody: CustodyRecord[]; };} type ComplianceReportType = | 'ACCESS_CONTROL_SUMMARY' | 'AUTHENTICATION_ACTIVITY' | 'PRIVILEGED_ACCESS' | 'DATA_ACCESS' | 'CHANGE_MANAGEMENT' | 'SECURITY_EVENTS' | 'INCIDENT_RESPONSE' | 'USER_LIFECYCLE'; class ComplianceReportGenerator { private auditLogStore: AuditLogStore; private accessLogStore: AccessLogStore; async generateReport( type: ComplianceReportType, options: ReportOptions ): Promise<ComplianceReport> { // Validate access - generating compliance reports is audited await this.auditReportGeneration(type, options); const report = await this.buildReport(type, options); // Add integrity verification report.integrity = { checksum: this.computeChecksum(report), chainOfCustody: [{ action: 'GENERATED', timestamp: new Date().toISOString(), actor: options.requestedBy, system: 'ComplianceReportGenerator', }], }; // Store report as audit artifact await this.storeReportArtifact(report); return report; } private async buildReport( type: ComplianceReportType, options: ReportOptions ): Promise<ComplianceReport> { switch (type) { case 'ACCESS_CONTROL_SUMMARY': return this.buildAccessControlReport(options); case 'PRIVILEGED_ACCESS': return this.buildPrivilegedAccessReport(options); case 'DATA_ACCESS': return this.buildDataAccessReport(options); // ... other report types } } private async buildPrivilegedAccessReport( options: ReportOptions ): Promise<ComplianceReport> { // Query privileged access logs const privilegedEvents = await this.auditLogStore.query({ timeRange: options.timeRange, filters: [ { field: 'actor.roles', contains: ['admin', 'superuser', 'root'] }, ], sort: { field: 'timestamp', order: 'desc' }, }); // Build summary const summary: ReportSummary = { totalEvents: privilegedEvents.length, uniqueUsers: new Set(privilegedEvents.map(e => e.actor.id)).size, byCategory: this.categorizeEvents(privilegedEvents), riskScore: this.calculateRiskScore(privilegedEvents), findings: this.generateFindings(privilegedEvents), }; // Build details const details: ReportDetails = { events: privilegedEvents.map(e => this.formatForReport(e)), userBreakdown: this.buildUserBreakdown(privilegedEvents), timelineChart: this.buildTimeline(privilegedEvents), }; // Identify exceptions (e.g., after-hours access, missing justifications) const exceptions = this.identifyExceptions(privilegedEvents, options.policies); return { reportId: generateUUID(), reportType: 'PRIVILEGED_ACCESS', generatedAt: new Date().toISOString(), generatedBy: options.requestedBy, scope: { timeRange: options.timeRange, systems: options.systems, }, summary, details, exceptions, integrity: {} as any, // Filled by caller }; }}Real-Time Compliance Dashboards
Point-in-time audits are being replaced by continuous compliance monitoring. Regulators and auditors increasingly expect real-time visibility into control effectiveness—not just annual snapshots. Compliance dashboards provide this visibility, enabling proactive issue detection and demonstrating ongoing control operation.
12345678910111213141516171819202122232425262728293031323334353637383940414243
┌─────────────────────────────────────────────────────────────────────────────────┐│ COMPLIANCE MONITORING DASHBOARD │└─────────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────────┐│ CONTROL STATUS PANEL │├─────────────────┬─────────────────┬─────────────────┬────────────────────────── ││ ACCESS CONTROL │ CHANGE MGMT │ MONITORING │ INCIDENT RESPONSE ││ │ │ │ ││ ● 228 active │ ● All changes │ ● Logs │ ● 0 open incidents ││ users │ approved │ flowing │ ││ ● 12 admins │ ● 4 pending │ ● Alerts │ ◐ 1 under review ││ (expected) │ review │ active │ ││ ⚠ 2 stale │ ● 0 emergency │ ● No gaps │ ● MTTR: 45 min ││ accounts │ changes │ detected │ (target: 60 min) │├─────────────────┴─────────────────┴─────────────────┴───────────────────────────┤│ COMPLIANCE METRICS │├──────────────────────────────────────────────────────────────────────────────────┤│ ││ Access Reviews ████████████████████████░░ 92% On Track ││ MFA Adoption ██████████████████████████ 100% ✓ Compliant ││ Log Retention ██████████████████████████ 100% ✓ Compliant ││ Vuln Remediation ████████████████████░░░░░░ 78% ⚠ Action Needed ││ Training Completion ███████████████████████░░░ 89% On Track ││ Config Compliance ██████████████████████████ 99% ✓ Compliant ││ │├──────────────────────────────────────────────────────────────────────────────────┤│ RECENT SECURITY EVENTS │├──────────────────────────────────────────────────────────────────────────────────┤│ TIME EVENT SEVERITY STATUS ││ 14:22 Failed login (3x) - user@co.com MEDIUM Auto-blocked ││ 13:45 Config change - prod.firewall INFO Approved, deployed ││ 12:30 Bulk export - 10k records HIGH Justified, logged ││ 11:15 New admin account created HIGH Approved workflow ││ 09:00 Scheduled maintenance window INFO Started, monitoring │├──────────────────────────────────────────────────────────────────────────────────┤│ COMPLIANCE CALENDAR │├──────────────────────────────────────────────────────────────────────────────────┤│ Jan 15 • Quarterly access review due (12 days) ││ Jan 31 • PCI ASV scan scheduled ││ Feb 15 • SOC 2 auditor arriving ││ Mar 01 • Annual penetration test due │└──────────────────────────────────────────────────────────────────────────────────┘- •Control Health Indicators — Real-time status of each control category. Green/yellow/red status with drill-down capability to specific issues.
- •Compliance Metrics — Quantitative measures of control performance against targets. Trend lines showing improvement or degradation.
- •Event Timeline — Recent security-relevant events requiring attention. Filtered to actionable items, not raw log volume.
- •Exception Tracker — Open compliance issues with age, owner, and remediation status. SLA tracking for issue resolution.
- •Audit Calendar — Upcoming compliance deadlines, scheduled assessments, and certification renewals.
- •Attestation Status — Management sign-offs and their currency. Tracking who has certified what, when.
Screenshots of compliance dashboards serve as point-in-time evidence of control status. Implement dashboard snapshotting—automated capture of dashboard state at regular intervals—to create a continuous evidence trail. Include timestamp and integrity verification in snapshots.
Automated Evidence Collection
Manual evidence collection doesn't scale. As organizations grow and compliance requirements multiply, the only sustainable approach is automation: systems that continuously collect, organize, and preserve evidence without human intervention.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
interface EvidenceCollectionTask { taskId: string; name: string; description: string; // Schedule schedule: { type: 'CONTINUOUS' | 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'ON_DEMAND'; cronExpression?: string; timezone?: string; }; // Collection collector: EvidenceCollector; // Storage storage: { location: string; // Evidence repository path retention: number; // Days to retain immutable: boolean; // Apply WORM storage }; // Mapping to controls controls: ControlMapping[];} interface ControlMapping { framework: 'SOC2' | 'PCI_DSS' | 'HIPAA' | 'GDPR' | 'SOX'; controlId: string; controlName: string; evidenceType: 'PRIMARY' | 'SUPPORTING' | 'CORROBORATING';} class EvidenceAutomationEngine { private tasks: Map<string, EvidenceCollectionTask> = new Map(); private scheduler: TaskScheduler; private evidenceStore: EvidenceRepository; /** * Register all standard evidence collection tasks */ async initializeStandardTasks(): Promise<void> { // Access Control Evidence this.registerTask({ taskId: 'access-control-snapshot', name: 'Access Control Configuration Snapshot', description: 'Capture current access control configuration across all systems', schedule: { type: 'DAILY', cronExpression: '0 0 2 * * *' }, collector: new AccessControlSnapshotCollector(), storage: { location: 'evidence/access-control/snapshots', retention: 365, immutable: true, }, controls: [ { framework: 'SOC2', controlId: 'CC6.1', controlName: 'Logical Access Security', evidenceType: 'PRIMARY' }, { framework: 'PCI_DSS', controlId: '7.1', controlName: 'Limit Access', evidenceType: 'PRIMARY' }, ], }); // Authentication Metrics this.registerTask({ taskId: 'auth-metrics-hourly', name: 'Authentication Metrics Collection', description: 'Aggregate authentication success/failure metrics', schedule: { type: 'CONTINUOUS', cronExpression: '0 0 * * * *' }, collector: new AuthenticationMetricsCollector(), storage: { location: 'evidence/authentication/metrics', retention: 365, immutable: false, }, controls: [ { framework: 'SOC2', controlId: 'CC6.1', controlName: 'Logical Access Security', evidenceType: 'SUPPORTING' }, ], }); // Privileged Access Report this.registerTask({ taskId: 'privileged-access-weekly', name: 'Privileged Access Activity Report', description: 'Weekly summary of all privileged account usage', schedule: { type: 'WEEKLY', cronExpression: '0 0 8 * * 1' }, collector: new PrivilegedAccessReportCollector(), storage: { location: 'evidence/privileged-access/reports', retention: 2557, // 7 years immutable: true, }, controls: [ { framework: 'SOC2', controlId: 'CC6.2', controlName: 'Privileged Access', evidenceType: 'PRIMARY' }, { framework: 'SOX', controlId: 'IT-AC-1', controlName: 'Access Control', evidenceType: 'PRIMARY' }, ], }); // Configuration Compliance Scan this.registerTask({ taskId: 'config-compliance-scan', name: 'Configuration Compliance Scan', description: 'Verify system configurations match security baselines', schedule: { type: 'DAILY', cronExpression: '0 0 3 * * *' }, collector: new ConfigurationComplianceScanner(), storage: { location: 'evidence/configuration/compliance-scans', retention: 365, immutable: true, }, controls: [ { framework: 'PCI_DSS', controlId: '2.2', controlName: 'Configuration Standards', evidenceType: 'PRIMARY' }, { framework: 'SOC2', controlId: 'CC7.1', controlName: 'System Operations', evidenceType: 'SUPPORTING' }, ], }); } /** * Generate evidence package for specific audit */ async generateAuditPackage( request: AuditPackageRequest ): Promise<AuditEvidencePackage> { const package_: AuditEvidencePackage = { packageId: generateUUID(), generatedAt: new Date().toISOString(), generatedFor: request.auditorName, scope: { framework: request.framework, controls: request.controls, period: request.auditPeriod, }, evidence: [], }; // Collect all relevant evidence for requested controls for (const controlId of request.controls) { const evidence = await this.collectEvidenceForControl( request.framework, controlId, request.auditPeriod ); package_.evidence.push({ controlId, artifacts: evidence, summary: this.summarizeEvidence(evidence), }); } // Generate table of contents package_.tableOfContents = this.generateTableOfContents(package_); // Add integrity verification package_.integrity = { checksum: this.computePackageChecksum(package_), createdBy: request.requestedBy, approvedBy: null, // Pending approval }; return package_; }}Audit Response Workflow
When auditors request evidence—whether for annual SOC 2 examinations, regulatory inquiries, or ad-hoc requests—having a structured response workflow minimizes disruption and ensures complete, accurate deliverables.
- •Request Intake — Log the audit request with unique identifier. Capture scope, requester, deadline, and specific items requested. Assign owner.
- •Scope Clarification — Review request with auditors to ensure mutual understanding. Clarify any ambiguous requirements before collection begins.
- •Evidence Collection — Generate required reports and artifacts. Use automated tools where possible. Document manual collection steps.
- •Quality Review — Internal review of evidence before delivery. Verify completeness, accuracy, and appropriate redaction of non-relevant sensitive data.
- •Management Approval — Appropriate stakeholder sign-off on evidence package. Required for significant disclosures.
- •Secure Delivery — Transmit evidence through secure channels with integrity verification. Log delivery confirmation.
- •Follow-Up Management — Track auditor questions and supplemental requests. Maintain response SLAs.
- •Request Closure — Document resolution. Archive complete request with all evidence and communications.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
interface AuditRequest { requestId: string; // Request details requestType: 'SOC2_EXAMINATION' | 'REGULATORY_INQUIRY' | 'CUSTOMER_AUDIT' | 'INTERNAL_AUDIT' | 'LEGAL_DISCOVERY'; requester: { organization: string; contact: string; email: string; }; // Scope scope: { framework?: string; period: { start: string; end: string }; systems: string[]; dataSubjects?: string[]; // For GDPR/privacy requests }; // Items requested items: RequestedItem[]; // Timeline receivedAt: string; deadlineAt: string; // Status tracking status: AuditRequestStatus; assignedTo: string; history: StatusChange[];} interface RequestedItem { itemId: string; description: string; controlMapping?: string; status: 'PENDING' | 'COLLECTING' | 'REVIEWING' | 'DELIVERED'; evidence?: EvidenceArtifact[]; notes?: string;} type AuditRequestStatus = | 'RECEIVED' | 'SCOPING' | 'COLLECTING' | 'REVIEWING' | 'PENDING_APPROVAL' | 'DELIVERED' | 'FOLLOW_UP' | 'CLOSED'; class AuditRequestManager { private requestStore: AuditRequestStore; private evidenceEngine: EvidenceAutomationEngine; private notificationService: NotificationService; async processRequest(request: AuditRequest): Promise<void> { // Store and acknowledge await this.requestStore.create(request); await this.notificationService.notify('AUDIT_REQUEST_RECEIVED', { requestId: request.requestId, deadline: request.deadlineAt, assignee: request.assignedTo, }); // Auto-collect available evidence for (const item of request.items) { try { const autoCollected = await this.attemptAutoCollection(item, request.scope); if (autoCollected) { item.status = 'REVIEWING'; item.evidence = autoCollected; } } catch (error) { // Log but continue - some items may need manual collection this.logCollectionFailure(item, error); } } await this.requestStore.update(request); } private async attemptAutoCollection( item: RequestedItem, scope: AuditRequest['scope'] ): Promise<EvidenceArtifact[] | null> { // Map request description to known report types const reportType = this.mapToReportType(item.description); if (!reportType) { return null; // Requires manual collection } const report = await this.evidenceEngine.generateReport( reportType, { timeRange: scope.period, systems: scope.systems } ); return [{ artifactId: generateUUID(), type: 'GENERATED_REPORT', name: `${reportType}-${scope.period.start}-${scope.period.end}.pdf`, generatedAt: new Date().toISOString(), checksum: report.integrity.checksum, location: await this.storeArtifact(report), }]; } /** * Generate status report for audit request */ async getRequestStatus(requestId: string): Promise<RequestStatusReport> { const request = await this.requestStore.get(requestId); const totalItems = request.items.length; const deliveredItems = request.items.filter(i => i.status === 'DELIVERED').length; const pendingItems = request.items.filter(i => i.status === 'PENDING').length; const daysRemaining = this.calculateDaysRemaining(request.deadlineAt); return { requestId, status: request.status, progress: { total: totalItems, delivered: deliveredItems, pending: pendingItems, percentComplete: Math.round((deliveredItems / totalItems) * 100), }, timeline: { received: request.receivedAt, deadline: request.deadlineAt, daysRemaining, onTrack: daysRemaining > 0 && pendingItems === 0, }, itemBreakdown: request.items.map(i => ({ itemId: i.itemId, description: i.description.substring(0, 100), status: i.status, })), }; }}GRC Platform Integration
Most enterprises use Governance, Risk, and Compliance (GRC) platforms to centralize compliance management. Integrating audit logging and evidence generation with these platforms creates unified compliance visibility and streamlines audit workflows.
- •ServiceNow GRC — Integrated risk and compliance with IT service management. REST APIs for evidence upload and control attestation.
- •OneTrust — Privacy and GRC platform with strong GDPR support. APIs for automated evidence collection and privacy impact assessments.
- •Archer (RSA) — Enterprise GRC with extensive customization. Data feeds for control monitoring and exception tracking.
- •Drata / Vanta / Secureframe — Cloud-native compliance automation platforms. Direct integrations with cloud providers and SaaS applications.
- •AuditBoard — Audit management platform with evidence request workflow. APIs for automated evidence delivery.
- •LogicGate — Flexible GRC platform with strong API support. Can model any compliance framework.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
interface GRCIntegration { /** * Push evidence to GRC platform */ pushEvidence( controlId: string, evidence: EvidenceArtifact[] ): Promise<void>; /** * Update control status */ updateControlStatus( controlId: string, status: ControlStatus ): Promise<void>; /** * Report exception/finding */ reportException( controlId: string, exception: ComplianceException ): Promise<string>;} class DrataIntegration implements GRCIntegration { private drataClient: DrataAPIClient; async pushEvidence( controlId: string, evidence: EvidenceArtifact[] ): Promise<void> { for (const artifact of evidence) { await this.drataClient.uploadEvidence({ controlId, fileName: artifact.name, fileType: artifact.mimeType, fileContent: await this.readArtifact(artifact), collectedAt: artifact.generatedAt, metadata: { source: 'AUTOMATED_COLLECTION', checksum: artifact.checksum, }, }); } } async updateControlStatus( controlId: string, status: ControlStatus ): Promise<void> { await this.drataClient.updateControl({ controlId, status: this.mapStatusToDrata(status), lastTestedAt: new Date().toISOString(), testResult: status.passing ? 'PASS' : 'FAIL', notes: status.notes, }); } async reportException( controlId: string, exception: ComplianceException ): Promise<string> { const finding = await this.drataClient.createFinding({ controlId, title: exception.title, description: exception.description, severity: this.mapSeverity(exception.severity), dueDate: exception.remediationDueDate, assignee: exception.owner, }); return finding.findingId; }} /** * Unified compliance reporting across frameworks */class UnifiedComplianceReporter { private integrations: Map<string, GRCIntegration>; private controlMappings: ControlMappingService; /** * Automatically update all relevant GRC platforms * when evidence is collected */ async onEvidenceCollected( evidence: CollectedEvidence ): Promise<void> { // Find all controls this evidence satisfies const controls = await this.controlMappings.findControlsForEvidence( evidence.evidenceType ); for (const control of controls) { const integration = this.integrations.get(control.platform); if (integration) { await integration.pushEvidence(control.controlId, [evidence]); // Update control status based on evidence const status = await this.evaluateControlStatus(control, evidence); await integration.updateControlStatus(control.controlId, status); } } }}Attestation and Certification
Many compliance frameworks require formal attestations—management statements certifying that controls are in place and operating effectively. These statements carry legal weight and must be based on documented evidence.
- •Evidence-Based Attestation — Never sign attestations without reviewing supporting evidence. 'I certify controls are effective because the evidence shows...' not 'because I assume...'
- •Clear Scope — Attestations must clearly state their scope: which systems, which time period, which controls. Unbounded attestations create unmanaged liability.
- •Exception Disclosure — Known exceptions or compensating controls must be documented in or alongside attestations. Hidden exceptions discovered later create legal and reputational risk.
- •Retention — Signed attestations are audit artifacts requiring long-term retention. Store with associated evidence for full context.
- •Role Separation — Those operating controls shouldn't attest to their own effectiveness. Attestation requires management or independent review.
- •Regular Cadence — Don't attestation once annually then forget. Quarterly or continuous attestation through dashboards provides ongoing assurance.
Management Assertions for SOC 2
SOC 2 reports contain specific management assertions—statements that auditors test. Understanding these assertions helps focus evidence collection:
| Assertion Category | What Management Asserts | Evidence Required |
|---|---|---|
| Description Accuracy | System description is accurate | Architecture docs, config evidence |
| Control Suitability | Controls meet Trust Services Criteria | Control mapping, design evidence |
| Control Operating Effectiveness | Controls operated effectively throughout period | Logs, reports, sample testing |
| No Material Misstatements | No omissions that would mislead users | Complete, accurate disclosure |
Each assertion must be supportable with evidence. Compliance reporting systems should map directly to these assertion requirements.
KEEP LEARNING
There’s more to understand.
You’re reading the introduction. Create a free account to read the complete lesson, save notes and keep track of your progress.