2026-04-16·14 min read·

NIS2 Art.21(2)(c): Business Continuity, Backup Management and Disaster Recovery for SaaS Developers (2026)

Ransomware encrypts your primary database at 03:00 on a Tuesday. Your on-call engineer wakes to alerts. The question is not whether you will lose data — the question is how much, for how long, and whether you can prove to a national competent authority (NCA) that your organisation had documented, tested, and operational procedures to handle exactly this scenario.

NIS2 Art.21(2)(c) requires essential and important entities to implement "business continuity, such as backup management and disaster recovery, and crisis management." This is the third of ten mandatory cybersecurity measures — and the one that determines survivability when the other nine fail.

NCA audits starting June 2026 will scrutinise whether entities can demonstrate tested recovery capabilities, not just policies on paper. This guide builds Art.21(2)(c) compliance from scratch for SaaS development teams.


1. Art.21(2)(c) in the Full NIS2 Context

NIS2 Art.21(2) mandates ten cybersecurity risk-management measures. Art.21(2)(c) is the resilience foundation — the capability that activates when preventive controls fail.

The Ten Mandatory Measures

SubparagraphRequirementPrimary Owner
Art.21(2)(a)Risk analysis and information system security policiesCISO / Management
Art.21(2)(b)Incident handling (see incident handling guide)SOC / DevSecOps
Art.21(2)(c)Business continuity, backup management, disaster recovery, crisis managementOps / SRE / Management
Art.21(2)(d)Supply chain securityProcurement / DevSecOps
Art.21(2)(e)Security in acquisition, development and maintenance (see SDL guide)Engineering
Art.21(2)(f)Policies to assess effectiveness of cybersecurity measuresAudit / GRC
Art.21(2)(g)Basic cyber hygiene and trainingHR / Security Awareness
Art.21(2)(h)Cryptography and encryption policies (see cryptography guide)Architecture
Art.21(2)(i)HR security, access control, asset managementIT / HR
Art.21(2)(j)Multi-factor authentication and continuous authentication (see MFA guide)IT / IAM / Engineering

Art.21(2)(c) is the last-resort capability. Art.21(2)(b) incident handling activates first. When an incident exceeds containment capacity — ransomware spreading across clusters, catastrophic infrastructure failure, sustained DDoS — Art.21(2)(c) BCM and DR take over.

The Exact Regulatory Text

Art.21(2)(c) requires:

"business continuity, such as backup management and disaster recovery, and crisis management"

The Recitals clarify: entities must ensure service continuity during and after security incidents, covering both technical recovery (backup/DR) and organisational response (crisis management).


2. Three Sub-Obligations Under Art.21(2)(c)

Art.21(2)(c) bundles three distinct but interrelated obligations:

2.1 Business Continuity Management (BCM)

BCM is the strategic layer — the documented plan ensuring critical business functions can continue at reduced capacity during a disruption. For SaaS entities, this means:

2.2 Backup Management and Disaster Recovery (DR)

DR is the technical layer — the actual capability to restore systems from backups within the stated RTO/RPO. NCA auditors look for:

2.3 Crisis Management

Crisis management is the governance layer — the organisational structures and communication protocols that activate during a major incident. This includes:


3. Business Impact Analysis — The BIA Template

A BIA is the foundation of Art.21(2)(c) compliance. Without it, your RTO/RPO targets are guesses, not risk-based decisions.

Step 1: Asset Inventory (Service Layer)

List every service that external customers or internal operations depend on:

Critical Services (Tier 1 — MTD ≤ 4h):
├── Authentication service (login, session tokens)
├── Core API (primary product functionality)
├── Payment processing integration
└── Customer data storage (primary DB)

Important Services (Tier 2 — MTD ≤ 24h):
├── Email notification service
├── Admin dashboard
├── Analytics pipeline
└── Audit logging

Non-Critical Services (Tier 3 — MTD ≤ 72h):
├── Marketing site
├── Documentation portal
└── Internal reporting

Step 2: Impact Assessment per Service

For each Tier 1 service, document:

ServiceRTORPOData ClassificationImpact per Hour of Downtime
Auth service1h15minHigh€X revenue + user trust
Core API2h1hHigh€X direct revenue loss
Primary DB4h1hHighAll services dependent
Payment integration2h1hHighDirect revenue loss + SLA penalty

The impact column does not need precise figures for small entities — a qualitative scale (Low/Medium/High/Critical) is acceptable, provided it is documented and reviewed annually.

Step 3: Recovery Targets

From the BIA, derive:

# bcm-targets.yml
services:
  auth_service:
    tier: 1
    rto_hours: 1
    rpo_minutes: 15
    backup_frequency: "every 15 minutes (WAL streaming)"
    dr_strategy: "hot standby in separate AZ"
    
  core_api:
    tier: 1
    rto_hours: 2
    rpo_hours: 1
    backup_frequency: "hourly snapshots"
    dr_strategy: "warm standby, < 15min failover"
    
  primary_db:
    tier: 1
    rto_hours: 4
    rpo_hours: 1
    backup_frequency: "continuous WAL + daily full backup"
    dr_strategy: "replica in separate region"

4. Backup Policy — The 3-2-1-1-0 Rule for NIS2

The classic 3-2-1 backup rule (3 copies, 2 different media, 1 offsite) is the minimum baseline. For NIS2 compliance with ransomware threat models, extend to 3-2-1-1-0:

Backup Encryption Requirements

Under NIS2 Art.21(2)(c) read together with Art.21(2)(h) (cryptography), backups must be encrypted:

# backup-policy.py
# Pseudocode for backup encryption compliance

BACKUP_ENCRYPTION_REQUIREMENTS = {
    "algorithm": "AES-256-GCM",
    "key_management": "separate_kms",  # Keys NOT stored alongside backup data
    "key_rotation": "annual_minimum",
    "tier_1_data": "encrypt_at_rest_AND_in_transit",
    "backup_access_control": "separate_service_account_mfa_required",
    "immutable_backup": "object_lock_worm_30_days_minimum",
}

# NCA audit evidence: encryption configuration export
# Must show: algorithm, key location, access logs, rotation schedule

Critical NIS2 requirement: Backup encryption keys must be stored separately from the backup data itself. An attacker who compromises your S3 bucket should not automatically gain access to your KMS keys.

Backup Retention Schedule

Daily backups:     Retain 30 days
Weekly backups:    Retain 90 days  
Monthly backups:   Retain 12 months
Yearly backups:    Retain 7 years (GDPR Art.5(1)(e) storage limitation applies)

For GDPR alignment: retain backups only as long as the underlying data's legal basis permits. After GDPR deletion requests, verify backup data is also removed within the retention window.


5. Disaster Recovery Runbooks

An NCA auditor at a June 2026 audit will ask for your DR runbook and evidence that you tested it in the past 12 months. A DR runbook must be:

  1. Step-by-step executable — no ambiguity, runnable by the on-call engineer at 03:00 without prior context
  2. Version-controlled — stored in git, not a Google Doc (wiki documents go stale)
  3. Tested and timestamped — test records showing last execution date, duration, result, and any delta from RTO target

DR Runbook Structure (Minimal)

# DR-001: Primary Database Failover to Read Replica

## Trigger Conditions
- Primary DB unreachable for > 5 minutes
- Primary DB master process crashed and auto-recovery failed
- Storage corruption detected by pg_checksums

## Pre-Requisites
- Access to AWS RDS console (MFA required — Art.21(2)(j))
- Access to application config secrets (Vault / SSM Parameter Store)
- Slack #incident channel open

## Step 1: Confirm primary failure (2 minutes)
```bash
# Verify primary endpoint is unreachable
psql -h primary.db.internal -U app -c "SELECT 1;" 
# Expected: connection refused / timeout

Step 2: Promote read replica (5 minutes)

# AWS CLI: promote replica to standalone primary
aws rds promote-read-replica \
  --db-instance-identifier myapp-replica-eu-west-1 \
  --region eu-west-1

Step 3: Update application config (3 minutes)

# Update DB_HOST to new primary endpoint
aws ssm put-parameter \
  --name "/prod/DB_HOST" \
  --value "myapp-replica-eu-west-1.xxxxx.eu-west-1.rds.amazonaws.com" \
  --overwrite

Step 4: Rolling restart application pods (5 minutes)

kubectl rollout restart deployment/myapp-api -n production
kubectl rollout status deployment/myapp-api -n production

Step 5: Verify recovery

# Smoke test
curl -H "Authorization: Bearer $TEST_TOKEN" \
  https://api.myapp.io/health/db
# Expected: {"db": "ok", "latency_ms": < 50}

RTO Target: 15 minutes

Last Tested: [DATE] — Result: [PASS/FAIL] — Actual Duration: [X minutes]


---

## 6. Crisis Management Framework

When an incident escalates beyond technical recovery — ransomware affecting multiple systems, breach affecting >10,000 users, sustained 24h+ outage — crisis management activates.

### Escalation Thresholds

| Condition | Response Level | Activates |
|---|---|---|
| Single service down, RTO < 4h | Incident (P1) | Art.21(2)(b) IR only |
| Multiple Tier 1 services down | Crisis (L1) | BCM + CMT partial |
| Complete service outage > 2h | Crisis (L2) | Full BCM + CMT + NCA assessment |
| Data breach > 1,000 users | Crisis (L2) | BCM + GDPR Art.33 + NIS2 Art.23 |
| Ransomware / destructive attack | Crisis (L3) | Full BCM + NCA notification + board |

### Crisis Management Team (CMT) Roles

Crisis Management Team: ├── Crisis Commander (CEO / CTO): Overall decision authority, external comms sign-off ├── Technical Lead (CTO / Head of Engineering): Technical recovery decisions ├── Communications Lead (Head of Marketing / PR): Customer + press communication ├── Legal/Compliance (DPO / Legal): Regulatory notifications (NCA, supervisory authorities) └── Operations Lead (Head of Ops / SRE): Infrastructure recovery coordination


### Communication Templates

NCA auditors expect pre-approved templates — you should not be drafting crisis communications from scratch during an active incident.

**Customer Communication — Service Disruption (L1 Template):**

Subject: [Service Status] Investigating elevated error rates — [DATE]

We are currently investigating an issue affecting [SERVICE]. Our team is actively working on a resolution.

Current status: [Investigating / Identified / Monitoring / Resolved] Impact: [Describe scope] Next update: [TIME]

We apologise for the inconvenience. Updates at status.yourapp.io.


**Regulatory Notification Trigger (Art.23 Assessment):**
When a crisis reaches L2, the Legal/Compliance CMT member must assess within 24 hours whether the incident meets NIS2 Art.23 significant incident threshold (Early Warning → 24h, Full Notification → 72h).

---

## 7. Python NIS2BCMAssessor

Use this tool to assess your current Art.21(2)(c) compliance posture before an NCA audit:

```python
#!/usr/bin/env python3
"""
NIS2BCMAssessor — Art.21(2)(c) Business Continuity Compliance Gap Analyser
Assesses BCM, backup management, DR, and crisis management maturity.
"""

from dataclasses import dataclass, field
from typing import Optional
from datetime import datetime, timedelta

@dataclass
class BCMControl:
    control_id: str
    description: str
    article_ref: str
    implemented: bool = False
    evidence: Optional[str] = None
    last_tested: Optional[datetime] = None
    test_frequency_days: int = 365

    @property
    def test_overdue(self) -> bool:
        if not self.last_tested:
            return True
        return datetime.now() - self.last_tested > timedelta(days=self.test_frequency_days)

@dataclass
class NIS2BCMAssessor:
    org_name: str
    audit_date: datetime = field(default_factory=datetime.now)
    controls: list[BCMControl] = field(default_factory=list)
    
    def add_control(self, **kwargs):
        self.controls.append(BCMControl(**kwargs))
    
    def load_standard_controls(self):
        standard = [
            ("BCM-01", "Board-approved BCM policy with scope and objectives", "Art.21(2)(c) + Art.20", 365),
            ("BCM-02", "Business Impact Analysis (BIA) completed and reviewed", "Art.21(2)(c)", 365),
            ("BCM-03", "RTO/RPO targets defined per service tier", "Art.21(2)(c)", 365),
            ("BCM-04", "Crisis Management Team (CMT) defined with roles", "Art.21(2)(c)", 180),
            ("BCM-05", "Crisis communication templates pre-approved", "Art.21(2)(c)", 180),
            ("BCM-06", "Escalation thresholds documented (P1→L1→L2→L3)", "Art.21(2)(c)", 180),
            ("BKP-01", "Backup policy documented covering all Tier 1 data", "Art.21(2)(c)", 365),
            ("BKP-02", "3-2-1-1-0 backup rule implemented for Tier 1 services", "Art.21(2)(c)", 90),
            ("BKP-03", "Backup encryption enabled (AES-256, separate key storage)", "Art.21(2)(c+h)", 90),
            ("BKP-04", "Immutable/offline backup copy exists (object lock / air-gap)", "Art.21(2)(c)", 90),
            ("BKP-05", "Backup restore test completed and documented", "Art.21(2)(c)", 90),
            ("BKP-06", "Backup retention schedule defined (daily/weekly/monthly)", "Art.21(2)(c)", 365),
            ("BKP-07", "GDPR deletion requests propagated to backup schedule", "Art.21(2)(c) + GDPR Art.17", 90),
            ("BKP-08", "Backup access logs reviewed quarterly", "Art.21(2)(c)", 90),
            ("DR-01",  "DR runbooks written for all Tier 1 services", "Art.21(2)(c)", 365),
            ("DR-02",  "DR runbooks stored in version control (git)", "Art.21(2)(c)", 90),
            ("DR-03",  "DR runbook tested for each Tier 1 service (tabletop or live)", "Art.21(2)(c)", 180),
            ("DR-04",  "Actual RTO measured and compared to target in last test", "Art.21(2)(c)", 180),
            ("DR-05",  "DR environment provisioned and accessible (hot/warm/cold)", "Art.21(2)(c)", 90),
            ("DR-06",  "DR failover tested under simulated production load", "Art.21(2)(c)", 365),
            ("DR-07",  "Post-DR review (PDR) process documented", "Art.21(2)(c)", 365),
            ("CMT-01", "Crisis Commander and backup defined with contact details", "Art.21(2)(c)", 180),
            ("CMT-02", "Art.23 NCA notification trigger integrated into CMT process", "Art.21(2)(c) + Art.23", 180),
            ("CMT-03", "Annual BCM exercise (tabletop or full drill) completed", "Art.21(2)(c)", 365),
            ("CMT-04", "BCM lessons learned fed back into policy updates", "Art.21(2)(c)", 365),
        ]
        for control_id, desc, ref, freq in standard:
            self.add_control(
                control_id=control_id, description=desc,
                article_ref=ref, test_frequency_days=freq
            )
    
    def assess(self) -> dict:
        total = len(self.controls)
        implemented = sum(1 for c in self.controls if c.implemented)
        overdue = sum(1 for c in self.controls if c.implemented and c.test_overdue)
        not_implemented = [c for c in self.controls if not c.implemented]
        
        score = (implemented / total) * 100 if total > 0 else 0
        
        categories = {
            "BCM Policy": [c for c in not_implemented if c.control_id.startswith("BCM")],
            "Backup Management": [c for c in not_implemented if c.control_id.startswith("BKP")],
            "Disaster Recovery": [c for c in not_implemented if c.control_id.startswith("DR")],
            "Crisis Management": [c for c in not_implemented if c.control_id.startswith("CMT")],
        }
        
        return {
            "org": self.org_name,
            "assessment_date": self.audit_date.isoformat(),
            "total_controls": total,
            "implemented": implemented,
            "compliance_score_pct": round(score, 1),
            "test_overdue": overdue,
            "gaps_by_category": {k: [c.control_id for c in v] for k, v in categories.items()},
            "critical_gaps": [
                c.control_id for c in not_implemented
                if c.control_id in ["BKP-05", "DR-03", "BKP-03", "CMT-02"]  # Highest NCA scrutiny
            ],
        }
    
    def print_report(self):
        result = self.assess()
        print(f"\n{'='*60}")
        print(f"NIS2 Art.21(2)(c) BCM Assessment: {result['org']}")
        print(f"{'='*60}")
        print(f"Compliance Score: {result['compliance_score_pct']}%")
        print(f"Implemented: {result['implemented']}/{result['total_controls']}")
        print(f"Tests Overdue: {result['test_overdue']}")
        
        if result['critical_gaps']:
            print(f"\n⚠ CRITICAL GAPS (highest NCA audit risk):")
            for gap in result['critical_gaps']:
                ctrl = next(c for c in self.controls if c.control_id == gap)
                print(f"  {gap}: {ctrl.description}")
        
        for cat, gaps in result['gaps_by_category'].items():
            if gaps:
                print(f"\nGaps — {cat}: {', '.join(gaps)}")
        print()


# Example usage:
if __name__ == "__main__":
    assessor = NIS2BCMAssessor(org_name="MyApp GmbH")
    assessor.load_standard_controls()
    
    # Mark implemented controls with evidence
    for ctrl in assessor.controls:
        if ctrl.control_id in ["BCM-01", "BCM-02", "BCM-03", "BKP-01", "BKP-06"]:
            ctrl.implemented = True
            ctrl.evidence = "policy_v2.pdf"
            ctrl.last_tested = datetime(2026, 1, 15)
    
    assessor.print_report()

8. NIS2 Art.21(2)(c) — 25-Item Compliance Checklist

Use this checklist as pre-audit preparation. NCAs expect documentation, evidence, and test records for each item.

BCM Policy (6 items)

Backup Management (7 items)

Disaster Recovery (7 items)

Crisis Management (5 items)


9. Cross-Article Dependencies

Art.21(2)(c) does not operate in isolation. NCA auditors assess the system of controls:

Art.21(2)(c) ElementDepends OnWhy
Backup encryptionArt.21(2)(h) CryptographyEncryption algorithm + key management policy
Backup access controlArt.21(2)(j) MFABackup service accounts require MFA
DR runbook testingArt.21(2)(b) Incident HandlingIR process triggers DR activation
CMT escalation thresholdsArt.21(2)(b) Incident HandlingIR-to-BCM handoff criteria
CMT Art.23 interfaceArt.23 NotificationSignificant incident assessment triggers NCA report
BIAArt.21(2)(a) Risk AnalysisAsset criticality informs RTO/RPO

An entity that has excellent DR runbooks but no backup encryption fails Art.21(2)(h) and weakens the Art.21(2)(c) posture simultaneously. NCAs assess the entire Art.21(2) system.


10. Implementation Timeline — 12 Weeks to June 2026 NCA Audit Readiness

WeekFocusKey Deliverables
1–2BIA and scopeBIA document, Tier 1/2/3 service list, RTO/RPO targets
3–4BCM policy and backup policyBoard-signed BCM policy, backup policy v1, encryption audit
5–6Backup hardeningImmutable backups configured, separate key storage, restore test #1
7–8DR runbooksRunbooks for all Tier 1 services in git, DR environment verified
9–10DR testingLive DR test #1, RTO measurement, post-DR review
11Crisis managementCMT defined, escalation criteria, communication templates
12Full BCM tabletopAnnual BCM exercise, NIS2BCMAssessor run, evidence package

11. Hosting Infrastructure and Art.21(2)(c)

Your hosting platform directly determines how achievable your Art.21(2)(c) targets are.

Key questions to ask your infrastructure provider:

European SaaS entities increasingly specify EU-native infrastructure to avoid jurisdictional risk on backup data. A ransomware scenario where recovery depends on backup data held under US Cloud Act jurisdiction creates regulatory and operational complexity that a fully EU-based stack avoids.


Conclusion

NIS2 Art.21(2)(c) is simultaneously the most overlooked and most audited of the ten mandatory measures. Policy documents without tested DR runbooks, backup configs without restore evidence, and crisis plans that have never been exercised are the three fastest paths to an NCA finding in June 2026.

The 25-item checklist above maps directly to what NCA auditors inspect. The NIS2BCMAssessor Python tool gives you a gap score before the audit finds it. And the 12-week timeline leaves exactly enough runway if you start today.

The next article in the NIS2 Art.21(2) series covers Art.21(2)(f): Policies to Assess the Effectiveness of Cybersecurity Risk Management Measures — the measurement and audit obligation that closes the loop on the entire Art.21(2) framework.


See also: