Skip to content

SOC 2 Operations Runbook

Day-to-day procedures for maintaining SOC 2 Type II compliance. Evidence is tracked in GitHub Issues, stored in evidence/, and controlled documents live in policies/, procedures/, and guides/.

SystemPurposeAccess
Google Workspace Enterprise StandardIdentity, endpoint management, DLP, Vault, audit logsadmin.google.com
CrowdStrike Falcon EnterpriseNGAV, EDR, endpoint containmentfalcon.crowdstrike.com
GCP Cloud MonitoringUptime checks, alert policies, notification channels, incident alertingconsole.cloud.google.com
1Password BusinessCredential management, breach monitoring1password.com
GitHubCode, change management, workflow tracking, evidence storagegithub.com/Meridian7-io
DopplerApplication secrets managementdoppler.com
SlackCommunication and alert routingmeridian-seven.slack.com
CloudflareWAF, DDoS, CDN, Zero Trustdash.cloudflare.com
SupabaseDatabase, auth, audit_logsupabase.com
GCP Cloud RunWeb app and agent service hostingconsole.cloud.google.com
Backblaze B2 + Cube BackupWorkspace backup and restorecubebackup.com
RoleContact
Primary (CTO)Notified via GCP Cloud Monitoring → Slack #incidents
Escalation Backup (CISO)Notified via Slack DM if no ack in 15 min

Frequency: Every Monday | Owner: CTO | SLA: Friday EOD

The weekly GitHub issue is auto-created by security-cadence.yml and pre-populated with real compliance data by weekly_review.py: compliance state from status.json, incident summary from GCP Cloud Monitoring, Dependabot alert counts, CrowdStrike detection summary, and workflow health.

  1. Open the auto-populated GitHub issue for the current week.
  2. Review pre-populated compliance state, incident summary, Dependabot alerts, CrowdStrike detections, and workflow health.
  3. Investigate any flagged items (FAILs, open incidents, critical alerts).
  4. Add follow-up issues for new findings.
  5. Close issue with summary and linked follow-up issue numbers.

Evidence: Completed GitHub issue; automated artifacts in evidence/logs/<system>/YYYY/MM/.


Frequency: 1st of each month | Owner: CISO | SLA: 5 business days

The monthly GitHub issue is auto-created by security-cadence.yml and pre-populated with access findings by access_review.py. The script pulls the live roster from Google Workspace, maps each user’s orgUnit to expected access via role-access-map.yaml, and cross-references against evidence artifacts to surface discrepancies directly in the issue.

  1. Open the auto-populated monthly access review GitHub issue.
  2. Review pre-populated access findings — stale accounts, over-provisioned access, and unrecognized tokens are flagged by the script.
  3. Validate each finding: confirm whether it is a true positive or approved exception.
  4. Remediate confirmed findings in the relevant system dashboard.
  5. Run verify to confirm no access-related FAILs post-remediation.
  6. Close issue with summary of findings and actions taken.

Evidence: Completed monthly review GitHub issue; automated access evidence in evidence/logs/.


Trigger: GCP Cloud Monitoring alert, CrowdStrike detection, Cloudflare event, or manual discovery | Owner: CISO (triage), CTO (remediation)

SeverityDefinitionResponse Time
SEV-1Active breach / system compromise / complete outage15 minutes
SEV-2Potential exposure / significant vulnerability / degraded service1 hour
SEV-3Security misconfiguration or moderate vulnerability24 hours
SEV-4Informational event / policy question72 hours
  1. GCP Cloud Monitoring fires alert policy, notification channel posts to #incidents with alert details.
  2. Responder acknowledges in Slack #incidents thread.
  3. Triage severity and begin investigation timeline; open GitHub Issue as incident record.
  4. Contain: endpoint (CrowdStrike isolate), account (suspend in Google Workspace), credentials (rotate via Doppler/1Password), active attack (block via Cloudflare WAF).
  5. Investigate with GCP Cloud Logging, CrowdStrike, Google admin logs, platform logs.
  6. Remediate and recover services.
  7. Resolve incident by closing the GitHub Issue.
  8. Complete postmortem within 5 business days (SEV-1/2) via Slack modal for post-mortem capture.

Evidence: GCP Cloud Monitoring alert data (collected nightly to evidence/logs/gcp-monitoring/YYYY/MM/); incident-specific artifacts in evidence/incidents/YYYY/.


Trigger: New team member joining | Owner: CTO | SLA: First day of employment

  1. Submit the New Employee Onboarding form in Linear Asks. This creates a Linear issue in the IT Ops team with the full provisioning checklist.
  2. Follow the checklist in the resulting Linear issue step by step:
    • Create Google Workspace account manually.
    • Run the access-provision.yml workflow for automated provisioning (GitHub, Supabase, Doppler).
    • Complete manual provisioning: GCP IAM, 1Password, Slack, Cloudflare (leadership only), Backblaze (leadership only).
    • Send welcome email with device setup instructions.
  3. Verify security requirements (MFA, CrowdStrike, device compliance).
  4. Run verify to confirm new user appears correctly in system user lists:
    doppler run -p m7-security -c prd -- python3 automation/scripts/runner.py --mode verify --systems google-workspace
  5. Move Linear issue to Done when all checklist items are complete.

Evidence: Completed Linear issue (IT Ops team); access-provision.yml workflow run; nightly evidence collection captures new user in system user lists.


Trigger: Team member departure | Owner: CTO | SLA: 24 hours (1 hour for involuntary)

  1. Submit the Employee Offboarding form in Linear Asks. This creates a Linear issue in the IT Ops team with the full deprovisioning checklist and SLA.
  2. Follow the checklist in the resulting Linear issue step by step:
    • Suspend Google Workspace account immediately (do NOT delete — 90-day data retention).
    • Run the access-provision.yml workflow for automated deprovisioning (GitHub, Supabase, Doppler).
    • Complete manual deprovisioning: GCP IAM, 1Password, Slack, Cloudflare, CrowdStrike, Backblaze.
    • Rotate impacted Doppler secrets and shared credentials.
    • Complete BYOD device offboarding.
  3. Run verify to confirm departed user is absent from all system user lists.
  4. Set issue due date to 90 days from suspension (for Google account deletion) and move to Waiting.
  5. On due date: delete Google account and move issue to Done.

Evidence: Completed Linear issue (IT Ops team); access-provision.yml workflow run; evidence collection confirms user absent from all system user lists.


Trigger: Dependabot alert, CrowdStrike finding, manual discovery | Owner: CTO

SeveritySLA
Critical72 hours
High7 days
Medium30 days
LowNext sprint
  1. Create remediation issue from template; set severity and due date.
  2. Implement fix via PR through standard change process.
  3. Validate closure; attach evidence to evidence/vulnerabilities/YYYY/.
  4. Close issue with verification notes.

Frequency: Quarterly | Owner: CTO

  1. Create quarterly restoration-test issue.
  2. Run Google Workspace restore test (Cube Backup).
  3. Run Supabase PITR restore test (non-production target).
  4. Verify evidence/log presence in evidence/logs/ for recent period.
  5. Document RTO/RPO observations and remediation items.
  6. Close issue with artifacts in evidence/restoration-tests/YYYY/QN/.

Frequency: Quarterly (critical) / annually (standard) | Owner: CISO

  1. Open guides/Vendor-Register.md.
  2. Validate SOC 2 report status, risk tier, renewal dates, and data-handling changes.
  3. Add/remove vendors as needed.
  4. Store review artifacts in evidence/vendor-reviews/YYYY/.
  5. Open follow-up issues for missing reports or unresolved risk findings.

Review these during weekly security review. Failures must be triaged within 24 hours.

ProcessSchedule (UTC)Output
Evidence manifests06:20 dailyevidence/automation/manifests/YYYY/MM/DD/
GitHub control snapshots06:20 dailyevidence/logs/github/YYYY/MM/
GCP Cloud Monitoring evidence06:30 dailyevidence/logs/gcp-monitoring/YYYY/MM/
Cloudflare evidence06:40 dailyevidence/logs/cloudflare/YYYY/MM/
CrowdStrike evidence06:50 dailyevidence/logs/crowdstrike/YYYY/MM/
Google Workspace evidence07:00 dailyevidence/logs/google-workspace/YYYY/MM/
Supabase evidence07:10 dailyevidence/logs/supabase/YYYY/MM/
External systems evidence07:20 dailyevidence/logs/<system>/YYYY/MM/
Compliance verify (system-verify.yml)05:00 nightlyautomation/reports/status.json
Weekly issue scheduler + data populationMondayGitHub Issues (pre-populated via weekly_review.py)
Monthly issue scheduler + access findings1st of monthGitHub Issues (pre-populated via access_review.py)
Incident post-mortem remind (SEV-1/2)NightlySlack modal prompt if open postmortem
Cube BackupNightlyBackblaze B2

evidence/
  automation/manifests/YYYY/MM/DD/
  weekly-security-reviews/YYYY/
  monthly-access-reviews/YYYY/
  incidents/YYYY/
  vulnerabilities/YYYY/
  access/onboarding/YYYY/
  access/offboarding/YYYY/
  logs/github/YYYY/MM/
  logs/gcp-monitoring/YYYY/MM/
  logs/gcp-cloudrun/YYYY/MM/
  logs/cloudflare/YYYY/MM/
  logs/crowdstrike/YYYY/MM/
  logs/google-workspace/YYYY/MM/
  logs/supabase/YYYY/MM/
  logs/1password/YYYY/MM/
  logs/doppler/YYYY/MM/
  logs/slack/YYYY/MM/
  logs/backblaze/YYYY/MM/
  restoration-tests/YYYY/QN/
  vendor-reviews/YYYY/

Provide read-only access to:

  1. Repository (Meridian7-io/m7-security)
  2. GitHub Issues and GitHub Project
  3. evidence/ tree
  4. Latest policy release artifacts
  5. Vendor register and vendor evidence
  6. Incident history and postmortems
  7. Monthly access review evidence
  8. Weekly security review evidence
  9. Backup restoration test evidence

ActivitySLA
SEV-1 response15 minutes
SEV-2 response1 hour
Offboarding completion24 hours (1 hour involuntary)
Critical vulnerability remediation72 hours
Postmortem completion5 business days
Monthly access review5 business days
Weekly security review closureFriday EOD

Meridian Seven — Confidential