Audit Checklist
This checklist helps auditors and compliance officers verify IDPFlare's alignment with ISO 27001 and SOC 2 requirements. Use this during internal audits, pre-assessments, and formal examinations.
Instructions
- Review each control
- Identify evidence sources
- Mark status (☐ Compliant | ✗ Gap | ⚠ Partial | N/A Not Applicable)
- Document gaps for remediation
- Track evidence for auditor requests
Status Legend:
- ☐ Pending - Not yet assessed
- ✓ Compliant - Evidence available
- ✗ Gap - Control not implemented
- ⚠ Partial - Control partially implemented
- N/A Not Applicable - Control doesn't apply
Section 1: Access Control (SOC 2 CC3.1.2, ISO 8.2)
| ID | Control | Status | Evidence Location |
|---|---|---|---|
| AC-001 | Unique user identification for each user | ☐ | D1 users table, audit logs |
| AC-002 | Password policy enforced (min 12 chars) | ☐ | wrangler.toml: PASSWORD_MIN_LENGTH |
| AC-003 | Multi-factor authentication required/available | ☐ | wrangler.toml: MFA_MODE |
| AC-004 | MFA using TOTP (RFC 6238) | ☐ | Source code: src/services/mfa.service.ts |
| AC-005 | Session timeout configured | ☐ | wrangler.toml: SESSION_DURATION_SECONDS |
| AC-006 | Token lifetime limits | ☐ | wrangler.toml: *_DURATION_SECONDS |
| AC-007 | Failed login attempt tracking | ☐ | audit_log table: login_failure events |
| AC-008 | Account lockout after N failed attempts | ☐ | wrangler.toml: RATE_LIMIT_LOGIN_ATTEMPTS |
| AC-009 | Role-based access control (RBAC) | ☐ | API key scopes, user roles |
| AC-010 | Authorization checks on API endpoints | ☐ | Source code: middleware/admin-auth.ts |
| AC-011 | Session revocation capability | ☐ | User sessions, token revocation |
| AC-012 | API key authentication with scopes | ☐ | api_keys table, scope validation |
| AC-013 | Privileged access requires additional auth | ☐ | Admin role, admin JWT required |
| AC-014 | Access rights reviewed quarterly | ☐ | Access review documentation ⚠ |
| AC-015 | Offboarding process for access removal | ☐ | Offboarding documentation ⚠ |
Section 2: Authentication (SOC 2 CC3.1.2)
| ID | Control | Status | Evidence Location |
|---|---|---|---|
| AUTH-001 | Password hashing using secure algorithm | ☐ | crypto.ts: SHA-256 hashing |
| AUTH-002 | Passwords not stored in plaintext | ☐ | Database schema: password_hash field |
| AUTH-003 | JWT signing using RS256 | ☐ | jwt.ts, JWT_PRIVATE_KEY secret |
| AUTH-004 | Authorization codes are short-lived | ☐ | AUTH_CODE_DURATION_SECONDS |
| AUTH-005 | Authorization codes are single-use | ☐ | authorization_codes: used_at field |
| AUTH-006 | Refresh tokens can be revoked | ☐ | refresh_tokens: is_revoked field |
| AUTH-007 | PKCE support for public clients | ☐ | OAuth flow code_challenge |
| AUTH-008 | CSRF protection on state-changing operations | ☐ | middleware/csrf.ts |
| AUTH-009 | Secure cookie attributes (HttpOnly, Secure) | ☐ | security.ts: buildSessionCookie() |
| AUTH-010 | Timing-safe password comparison | ☐ | security.ts: timingSafeEqual() |
Section 3: Encryption (SOC 2 CC3.1.3, ISO 8.5.1)
| ID | Control | Status | Evidence Location |
|---|---|---|---|
| ENC-001 | Data in transit encrypted (TLS 1.2+) | ☐ | HTTPS required by Cloudflare |
| ENC-002 | D1/KV data at rest encrypted | ☐ | Cloudflare docs |
| ENC-003 | MFA secrets encrypted at rest | ☐ | ENCRYPTION_KEY, AES-GCM |
| ENC-004 | Backup codes encrypted | ☐ | Source code: mfa.service.ts |
| ENC-005 | JWT signed with private key | ☐ | JWT_PRIVATE_KEY secret |
| ENC-006 | RSA key pair for JWT signing | ☐ | scripts/generate-keys.js |
| ENC-007 | Cryptographic randomness for tokens | ☐ | crypto.getRandomValues() usage |
| ENC-008 | No weak algorithms used (MD5, SHA1) | ☐ | Code review for crypto usage |
| ENC-009 | Key management procedures | ☐ | Key rotation documentation ⚠ |
Section 4: Logging and Monitoring (SOC 2 CC3.1.6, ISO 8.3.8)
| ID | Control | Status | Evidence Location |
|---|---|---|---|
| LOG-001 | Audit log table exists | ☐ | schema: audit_log table |
| LOG-002 | Authentication events logged | ☐ | login_success, login_failure |
| LOG-003 | Authorization events logged | ☐ | oauth_authorize, token_issued |
| LOG-004 | Admin actions logged | ☐ | admin_* event types |
| LOG-005 | Security events logged | ☐ | rate_limit_exceeded, account_locked |
| LOG-006 | IP address captured | ☐ | audit_log: ip_address field |
| LOG-007 | User agent captured | ☐ | audit_log: user_agent field |
| LOG-008 | Timestamp on all events | ☐ | audit_log: created_at field |
| LOG-009 | Logs retained for minimum 90 days | ☐ | Retention configuration ⚠ |
| LOG-010 | Log export to SIEM | ☐ | Export automation ⚠ |
| LOG-011 | Monitoring/alerting configured | ☐ | Alert configuration ⚠ |
Section 5: Input Validation and Security (SOC 2 CC3.1.6)
| ID | Control | Status | Evidence Location |
|---|---|---|---|
| IN-001 | Email validation | ☐ | security.ts: isValidEmail() |
| IN-002 | Input length limits enforced | ☐ | security.ts: INPUT_LIMITS |
| IN-003 | XSS prevention (HTML escaping) | ☐ | security.ts: escapeHtml() |
| IN-004 | SQL injection prevention | ☐ | Parameterized queries |
| IN-005 | Open redirect prevention | ☐ | security.ts: isValidReturnUrl() |
| IN-006 | SSRF prevention on hook URLs | ☐ | security.ts: isSafeExternalUrl() |
| IN-007 | CSRF token generation/validation | ☐ | middleware/csrf.ts |
| IN-008 | Rate limiting on login | ☐ | wrangler.toml: RATE_LIMIT_* |
| IN-009 | Rate limiting on API endpoints | ☐ | KV-based rate limiting |
Section 6: Data Protection (SOC 2 CC3.1.7, ISO 8.3)
| ID | Control | Status |
|---|---|---|
| DP-001 | User deletion cascades to related data | ☐ |
| DP-002 | Data minimization (only collect necessary data) | ☐ |
| DP-003 | Right to access (user can view data) | ☐ |
| DP-004 | Right to rectification | ☐ |
| DP-005 | Right to erasure | ☐ |
Section 7: Change Management (SOC 2 CC3.1.5)
| ID | Control | Status |
|---|---|---|
| CM-001 | Changes require approval ⚠ | ☐ |
| CM-002 | Changes tracked ⚠ | ☐ |
| CM-003 | Changes tested before production ⚠ | ☐ |
Section 8: Backup and Recovery (SOC 2 CC3.1.6c, ISO 8.3.6)
| ID | Control | Status |
|---|---|---|
| BR-001 | Automated D1 database backups ⚠ | ☐ |
| BR-002 | Backup schedule defined ⚠ | ☐ |
| BR-003 | Backups retained (minimum 30 days) ⚠ | ☐ |
| BR-004 | Off-site backup storage ⚠ | ☐ |
| BR-005 | Restoration procedures documented ⚠ | ☐ |
| BR-006 | Restoration tested quarterly ⚠ | ☐ |
Section 9: Incident Response (SOC 2 CC3.1.14)
| ID | Control | Status |
|---|---|---|
| IR-001 | Incident response plan exists ⚠ | ☐ |
| IR-002 | Incident severity levels defined ⚠ | ☐ |
| IR-003 | Incident detection methods ⚠ | ☐ |
| IR-004 | Incident reporting procedures ⚠ | ☐ |
| IR-005 | Incident response procedures ⚠ | ☐ |
| IR-006 | Post-incident reviews conducted ⚠ | ☐ |
Section 10: Vendor Management (SOC 2 CC3.1.9)
| ID | Control | Status |
|---|---|---|
| VM-001 | Cloudflare risk assessment ⚠ | ☐ |
| VM-002 | IDPFlare vendor review ⚠ | ☐ |
| VM-003 | Cloudflare status monitoring ⚠ | ☐ |
Section 11: Vulnerability Management (SOC 2 CC3.1.6)
| ID | Control | Status |
|---|---|---|
| VMG-001 | Dependency scanning configured ⚠ | ☐ |
| VMG-002 | Vulnerability alerts monitored ⚠ | ☐ |
| VMG-003 | Critical patches applied within SLA ⚠ | ☐ |
| VMG-004 | Annual penetration test ⚠ | ☐ |
Section 12: Training and Awareness (ISO 6.5)
| ID | Control | Status |
|---|---|---|
| TA-001 | Security awareness training exists ⚠ | ☐ |
| TA-002 | Training completed by relevant staff ⚠ | ☐ |
Section 13: Policies and Documentation
| ID | Control | Status |
|---|---|---|
| POL-001 | Information security policy ⚠ | ☐ |
| POL-002 | Access control policy ⚠ | ☐ |
| POL-003 | Change management policy ⚠ | ☐ |
| POL-004 | Incident response policy ⚠ | ☐ |
| POL-005 | Data retention policy ⚠ | ☐ |
Section 14: Cloudflare Platform Controls (Inherited)
| ID | Control | Status |
|---|---|---|
| CF-001 | Physical security of data centers | ☐ |
| CF-002 | Environmental controls | ☐ |
| CF-003 | Network security controls | ☐ |
| CF-004 | DDoS protection | ☐ |
| CF-005 | Web Application Firewall | <☐ |
| CF-006 | Platform monitoring | ☐ |
| CF-007 | Platform availability SLA | ☐ |
| CF-008 | ISO 27001 certification | ☐ |
| CF-009 | SOC 2 Type II report | ☐ |
| CF-010 | Platform encryption at rest | ☐ |
⚠ = Deployer responsibility
Gap Analysis Summary
Critical Gaps (Must Address)
| Control | Gap | Remediation Timeline |
|---|---|---|
| LOG-010 | No log export to SIEM | 2 weeks |
| LOG-011-014 | No monitoring/alerting | 2 weeks |
| BR-001-007 | No backup implementation | 1 week |
| IR-001-008 | No incident response | 2 weeks |
| AC-014-015 | No access review/offboarding | 4 weeks |
| CM-001-006 | No change management | 2 weeks |
| VMG-001-005 | No vulnerability management | 4 weeks |
| POL-001-008 | No security policies | 4 weeks |
Audit Evidence Checklist
Before audit, ensure you can provide:
Technical Evidence
- ✔ wrangler.toml configuration
- ✔ Database schema (migrations/0001_init.sql)
- ✔ Source code excerpts (crypto.ts, security.ts, audit.service.ts)
- ✔ Audit log samples
- ✔ Backup scripts and schedules
- ✔ Monitoring configuration
- ✔ Alert rules
Documentation Evidence
- ✔ Security policies (all 8 policies)
- ✔ Procedures (onboarding, offboarding, backup, etc.)
- ✔ Change tickets (sample)
- ✔ Access reviews (quarterly)
- ✔ Incident reports (if any)
- ✔ Training records
- ✔ Vendor assessments
- ✔ Risk assessment
Cloudflare Evidence
- ✔ Current ISO 27001 certificate
- ✔ Current SOC 2 Type II report
- ✔ D1/KV security documentation
- ✔ Platform compliance documentation
Quick SQL Queries for Audit Evidence
-- Show failed login attempts in last 7 days
SELECT * FROM audit_log
WHERE event_type = 'login_failure'
AND created_at > ((strftime('%s', 'now') - 604800) * 1000)
ORDER BY created_at DESC;
-- Show admin actions
SELECT * FROM audit_log
WHERE event_type LIKE 'admin_%'
ORDER BY created_at DESC
LIMIT 100;
-- Show all unique event types
SELECT DISTINCT event_type, COUNT(*) as count
FROM audit_log
GROUP BY event_type
ORDER BY count DESC;
-- Show user access (last login)
SELECT id, email, last_login_at, created_at
FROM users
WHERE is_active = 1
ORDER BY last_login_at DESC;
-- Show API keys and scopes
SELECT id, name, scopes, created_at
FROM api_keys
WHERE is_active = 1;