Skip to content

Disaster Recovery Plan — Phoenix Protocol


MetricTargetMaximum Tolerable
RTO (Recovery Time Objective)< 4 hours8 hours
RPO (Recovery Point Objective)< 1 hour4 hours
Chamber Fleet Restore< 2 hours4 hours
Evidence Store Restore< 1 hour2 hours
Attestation Service< 30 minutes1 hour

Trigger: Attestation failure, unexpected behavior, IOC match Impact: Single sample analysis lost Response: runbooks/incident-response-runbook.md → Contain → Eradicate → Reprovision

Trigger: Hardware failure, kernel panic, network partition Impact: Reduced capacity, in-flight detonations interrupted Response:

  1. Drain node (cordon + evict pods)
  2. Replace hardware / reprovision VM
  3. Rejoin pool via scripts/provision-node.sh
  4. Verify attestation before accepting workloads

Trigger: Kubernetes API server down, etcd corruption, network split Impact: No new detonations, existing chambers continue Response:

  1. Activate backup control plane (cross-region)
  2. Restore etcd from snapshot (< 1h old)
  3. Verify chamber attestations still valid
  4. Resume scheduling

Scenario 4: Evidence Store Corruption/Loss

Section titled “Scenario 4: Evidence Store Corruption/Loss”

Trigger: S3/MinIO corruption, ransomware, credential theft Impact: Loss of forensic artifacts, attestations, PCAPs Response:

  1. Verify backup integrity (Glacier Vault Lock)
  2. Restore from cross-region replica
  3. Re-verify all attestation signatures
  4. Rotate all storage credentials

Trigger: Datacenter fire, flood, prolonged power loss Impact: Complete Alter unavailability Response: Failover to DR region (see procedures below)

Trigger: Malicious dependency, compromised base image, signing key theft Impact: All chambers potentially compromised Response:

  1. Immediate fleet quarantine (network isolate)
  2. Revoke compromised cosign keys
  3. Rebuild all images from pinned digests
  4. Full fleet reprovisioning
  5. Rotate all secrets

Primary Region (us-east-1) DR Region (us-west-2)
┌─────────────────────────┐ ┌─────────────────────────┐
│ Control Plane (3 AZs) │ ────► │ Warm Standby (1 AZ) │
│ Chamber Pool (N nodes) │ Async │ Chamber Pool (N/2 nodes)│
│ Evidence Store (S3) │ Repl. │ Evidence Store (S3 CRR)│
│ Vault (HA) │ Sync │ Vault (Perf. Standby) │
│ Monitoring (Prom/GM) │ │ Monitoring (Read-only) │
└─────────────────────────┘ └─────────────────────────┘
  • Kubernetes cluster deployed (min 3 control plane, 2 worker)
  • Chamber pool nodes pre-provisioned (scaled to 0)
  • Cross-region replication (CRR) enabled on all S3 buckets
  • Vault performance standby configured
  • WireGuard mesh extended to DR region
  • DNS failover configured (Route53 health checks)
  • Quarterly DR drill scheduled

Phase 1: Detection & Declaration (0–15 min)

Section titled “Phase 1: Detection & Declaration (0–15 min)”
Terminal window
# Automated: Alertmanager fires "AlterControlPlaneDown" or "AlterRegionUnreachable"
# Manual: Alter Keeper declares disaster via Slack #alter-dr
# Checklist:
# □ Confirm primary region unreachable (multi-source)
# □ Verify not transient network issue
# □ Notify stakeholders (Slack, PagerDuty, email)
# □ Start incident timer
# □ Assign DR Commander
Terminal window
# 1. Promote DR Vault to primary
vault operator raft promote -dr-token=<token>
# 2. Scale DR chamber pool
kubectl --context=dr scale deployment chamber-pool --replicas=FULL_CAPACITY
# 3. Verify DR evidence store accessible
aws s3 ls s3://alter-evidence-dr --region us-west-2
# 4. Update DNS to DR endpoints
# Route53 failover: automatic via health checks
# Manual override if needed:
aws route53 change-resource-record-sets --hosted-zone-id=Z123 --change-batch file://dr-failover.json
# 5. Verify chamber attestation service
curl -sf https://attestation-dr.alter.syn-os/health
Terminal window
# 1. Test chamber provisioning
./scripts/provision-node.sh --chamber-type=static --verify-only --context=dr
# 2. Test sample detonation (benign sample)
./scripts/detonate.sh --sample=benign-<hash> --profile=smoke --context=dr
# 3. Verify attestation generation
./scripts/verify-attestation.sh --chamber-id=<test-id> --context=dr
# 4. Confirm evidence collection
./scripts/collect-evidence.sh --chamber-id=<test-id> --context=dr
# 5. Validate monitoring/alerting
# Check Prometheus targets up, Alertmanager routing

Phase 4: Operations Resumption (2–4 hours)

Section titled “Phase 4: Operations Resumption (2–4 hours)”
Terminal window
# 1. Announce DR operational
# Slack #alter-ops: "DR region active. Accepting detonation requests."
# 2. Redirect inbound API traffic
# API Gateway / Load Balancer already pointing to DR
# 3. Resume scheduled detonations
# Re-queue any interrupted jobs
# 4. Begin primary region recovery (parallel)
# See "Failback Procedures" below

  • Primary region infrastructure healthy
  • etcd restored and verified
  • All chamber nodes reprovisioned and attested
  • Evidence store synced (verify CRR caught up)
  • DNS TTL expired / manual cutover planned
Terminal window
# 1. Pause new detonations in DR
kubectl --context=dr scale deployment api-gateway --replicas=0
# 2. Drain DR chambers (wait for in-flight to complete)
kubectl --context=dr drain chamber-pool --ignore-daemonsets --delete-emptydir-data
# 3. Sync final evidence to primary
aws s3 sync s3://alter-evidence-dr s3://alter-evidence-primary --region us-west-2 --source-region us-east-1
# 4. Demote DR Vault
vault operator raft demote -dr-token=<token>
# 5. Promote primary Vault
vault operator raft promote
# 6. Scale primary chamber pool
kubectl --context=primary scale deployment chamber-pool --replicas=FULL_CAPACITY
# 7. Verify primary attestation service
curl -sf https://attestation.alter.syn-os/health
# 8. Cut DNS back to primary
aws route53 change-resource-record-sets --hosted-zone-id=Z123 --change-batch file://primary-failback.json
# 9. Scale down DR pool
kubectl --context=dr scale deployment chamber-pool --replicas=0
# 10. Declare failback complete
# Slack #alter-ops: "Failback complete. Primary region operational."

Terminal window
# Automated: Daily at 03:00 UTC via CronJob
# Manual:
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-$(date +%F).db \
--endpoints=https://etcd-0:2379,https://etcd-1:2379,https://etcd-2:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# Verify:
ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-$(date +%F).db
# Restore (on new cluster):
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-<date>.db \
--name=etcd-0 \
--initial-cluster=etcd-0=https://10.0.0.1:2380,etcd-1=https://10.0.0.2:2380,etcd-2=https://10.0.0.3:2380 \
--initial-cluster-token=alter-etcd \
--initial-advertise-peer-urls=https://10.0.0.1:2380
Terminal window
# Automated: Raft snapshots every 6 hours
# Manual:
vault operator raft snapshot save /backup/vault-$(date +%F).snap
# Restore:
vault operator raft snapshot restore /backup/vault-<date>.snap
  • Primary: S3 Standard + Cross-Region Replication (CRR) to DR
  • Archive: S3 Glacier Deep Archive (WORM, Vault Lock) - 7 year retention
  • Verification: Monthly integrity check via aws s3api head-object + checksum comparison
  • All images signed with cosign (keyless via Fulcio)
  • Stored in GHCR + mirrored to ECR (primary) and ECR (DR)
  • SBOMs generated and stored with each image

AudienceChannelFrequencyTemplate
Alter KeepersSlack #alter-dr + PagerDutyImmediate, then 30 mintemplates/dr-alert.md
Red Team LeadsSlack #red-team-ops + Email15 min, then hourlytemplates/dr-status.md
ManagementEmail + Phone (critical)30 min, then 2 hourstemplates/dr-exec-summary.md
Auditors/ComplianceEmail (encrypted)At declaration + resolutiontemplates/dr-compliance-notice.md

Drill TypeFrequencyScopeSuccess Criteria
TabletopQuarterlyAll scenariosDecision trees validated, contacts current
Partial FailoverSemi-annualControl plane + 1 chamberRTO < 2h, RPO < 30m
Full FailoverAnnualComplete region failoverRTO < 4h, RPO < 1h, all attestations valid
FailbackAnnualDR → PrimaryZero data loss, < 2h
# DR Drill Record - <DATE>
## Drill Type: [Tabletop | Partial | Full | Failback]
## Scenario: <Scenario ID from above>
## Participants: @alter-keeper, @infra-lead, @red-team-lead, ...
## Timeline
- T+0: Drill initiated
- T+X: Detection
- T+Y: DR activation started
- T+Z: DR operational
- T+W: Validation complete
## Results
- RTO Achieved: <time>
- RPO Achieved: <time>
- Attestations Valid: Y/N
- Evidence Integrity: Y/N
- Issues Found: [list]
- Action Items: [GitHub issues]
## Sign-off
- DR Commander: @<user>
- Alter Keeper: @<user>

This DR plan integrates with:

RunbookIntegration Point
incident-response-runbook.mdScenario 1, 6 response
node-provisioning-runbook.mdPhase 2, 3 chamber scaling
credential-rotation-runbook.mdScenario 4, 6 secret rotation

VersionDateAuthorChanges
1.02026-08-31Syn_OS Research DivisionInitial DR plan

This plan is a living document. Update after every drill and incident.