Public Beta. Reference implementation only — not a compliance certification, attestation, or audit outcome. Read the full beta disclaimer →

Control template: GDPR Article 32 (security of processing)

Status: Public Beta · Version: gdpr/v0.1.0-beta

A bundle of CALM control snippets covering the architecturally enforceable subset of GDPR Article 32 (security of processing of personal data). You copy these into your *.calm.json files on the nodes that process personal data of EU/UK data subjects.

Who GDPR applies to

Any organization that processes personal data of EU/UK data subjects, regardless of the organization's location (extraterritorial scope under Art. 3). Common categories: - EU/UK established controllers and processors - Non-EU companies offering goods/services to EU/UK residents - Non-EU companies monitoring behavior of EU/UK residents - Public-sector bodies processing personal data - Cloud providers acting as processors for EU controllers

Brexit note: UK GDPR (the onshored regime) is substantially aligned with EU GDPR; this template uses EU naming conventions but the architectural surface is the same. The Data Protection Act 2018 + UK GDPR is the UK authoritative source.

What this template covers

GDPR Art. 32 lists technical and organizational measures, including: - pseudonymisation and encryption (Art. 32(1)(a)) - ongoing confidentiality, integrity, availability, and resilience (Art. 32(1)(b)) - ability to restore data after an incident (Art. 32(1)(c)) - regular testing of measures (Art. 32(1)(d))

The architectural slice maps to ~10 controls. Plus related obligations from Art. 30 (RoPA), Art. 33 (breach notification), Art. 25 (data protection by design), and Art. 28 (processor contracts) where they have an architectural surface.

GDPR citation Architectural surface Control alias
Art. 30 Record of Processing Activities gdpr-record-of-processing
Art. 25 Data protection by design + default gdpr-privacy-by-design
Art. 32(1)(a) Pseudonymisation / encryption at rest gdpr-encryption-at-rest
Art. 32(1)(a) Encryption in transit gdpr-encryption-in-transit
Art. 32(1)(b) Access restriction (need-to-know) gdpr-access-restriction
Art. 32(1)(b) Audit logging on personal-data access gdpr-access-logging
Art. 32(1)(c) Backup + restoration gdpr-backup-restoration
Art. 32(1)(d) Periodic testing of measures gdpr-measures-testing
Art. 33 Breach notification pipeline gdpr-breach-notification
Art. 28 + Chapter V Processor + international-transfer mapping gdpr-processor-transfer-mapping
Art. 17 + Art. 5(1)(e) Data retention + erasure gdpr-retention-and-erasure

11 architectural controls covering the GDPR surfaces that have implementation-shaped requirements. GDPR is heavy on process and contractual obligations (DPIA, DSAR handling, controller-processor agreements, etc.) that are NOT architectural — document those in your firm's privacy program, not your CALM.

The "personal-data-scope" pattern

A node is in GDPR scope if it processes personal data of EU/UK data subjects. Tag those nodes:

{
  "unique-id": "customer-records-service",
  "node-type": "service",
  "name": "Customer Records Service",
  "metadata": {
    "gdpr-in-scope": true,
    "data-categories": ["contact-data", "transaction-history"],
    "special-categories-processed": false,
    "data-classification": "personal-data"
  }
}

If you process special categories (Art. 9 — health, biometric, political opinion, religious belief, sex life, etc.) flip special-categories-processed: true; stricter expectations apply.


Control snippets

Copy each block under the controls key of the node it applies to.

Art. 30 — Record of Processing Activities (gdpr-record-of-processing)

Graph-level. Every controller and processor maintains a RoPA. This control declares that the firm's RoPA is maintained and includes this node's processing activities.

"metadata": {
  "controls": {
    "gdpr-record-of-processing": {
      "description": "GDPR Art. 30 — Record of Processing Activities. The firm maintains a comprehensive RoPA covering all processing activities, including those performed by this node.",
      "requirements": [
        {
          "requirement-url": "https://archrails.io/catalog/req/gdpr/record-of-processing",
          "config": {
            "control-id": "gdpr-record-of-processing",
            "ropa-document-url": "https://internal.example.com/gdpr/ropa",
            "responsible-role": "dpo",
            "review-frequency": "annual-and-on-significant-change",
            "ropa-entry-id": "ROPA-2025-CUSTOMER-RECORDS"
          }
        }
      ]
    }
  }
}

Art. 25 — Privacy by design + default (gdpr-privacy-by-design)

Per-node.

"gdpr-privacy-by-design": {
  "description": "GDPR Art. 25 — data protection by design and by default. Privacy-preserving defaults; only the personal data necessary for the specific purpose is processed.",
  "requirements": [
    {
      "requirement-url": "https://archrails.io/catalog/req/gdpr/privacy-by-design",
      "config": {
        "control-id": "gdpr-privacy-by-design",
        "data-minimization-applied": true,
        "pseudonymization-where-possible": true,
        "opt-in-defaults-for-non-essential": true,
        "purpose-limitation-enforced": true,
        "design-review-document-url": "https://internal.example.com/gdpr/design-reviews"
      }
    }
  ]
}

Art. 32(1)(a) — Encryption at rest (gdpr-encryption-at-rest)

Per-node.

"gdpr-encryption-at-rest": {
  "description": "GDPR Art. 32(1)(a) — pseudonymisation and encryption of personal data at rest as a measure proportionate to the risk.",
  "requirements": [
    {
      "requirement-url": "https://archrails.io/catalog/req/gdpr/encryption-at-rest",
      "config": {
        "control-id": "gdpr-encryption-at-rest",
        "algorithm": "AES-256-GCM",
        "key-management": "hsm-or-kms-cmk",
        "key-rotation-days": 365,
        "pseudonymization-tokens-for-direct-identifiers": true
      }
    }
  ]
}

Art. 32(1)(a) — Encryption in transit (gdpr-encryption-in-transit)

Relationship-level.

"controls": {
  "gdpr-encryption-in-transit": {
    "description": "GDPR Art. 32(1)(a) — encryption of personal data in transit.",
    "requirements": [
      {
        "requirement-url": "https://archrails.io/catalog/req/gdpr/encryption-in-transit",
        "config": {
          "control-id": "gdpr-encryption-in-transit",
          "minimum-tls-version": ["1.2", "1.3"],
          "forbidden-protocols": ["http", "ftp", "telnet", "smtp-plain", "ws"]
        }
      }
    ]
  }
}

Art. 32(1)(b) — Access restriction (gdpr-access-restriction)

Per-node.

"gdpr-access-restriction": {
  "description": "GDPR Art. 32(1)(b) — ongoing confidentiality of personal-data processing. Access restricted to authorized personnel on a need-to-know basis.",
  "requirements": [
    {
      "requirement-url": "https://archrails.io/catalog/req/gdpr/access-restriction",
      "config": {
        "control-id": "gdpr-access-restriction",
        "authentication": "saml-sso-plus-mfa",
        "authorization": "rbac-need-to-know",
        "allowed-roles": ["customer-success-read", "support-escalation", "data-analyst-aggregated-only"],
        "review-frequency": "quarterly"
      }
    }
  ]
}

Art. 32(1)(b) — Access logging (gdpr-access-logging)

Per-node.

"gdpr-access-logging": {
  "description": "GDPR Art. 32(1)(b) — logging of access to personal data sufficient to detect anomalies and support DSAR / breach investigation.",
  "requirements": [
    {
      "requirement-url": "https://archrails.io/catalog/req/gdpr/access-logging",
      "config": {
        "control-id": "gdpr-access-logging",
        "events": ["read", "write", "export", "deletion", "auth-success", "auth-failure"],
        "destination": "centralized-siem",
        "immutable": true,
        "retention-days": 730
      }
    }
  ]
}

Art. 32(1)(c) — Backup + restoration (gdpr-backup-restoration)

Per-node.

"gdpr-backup-restoration": {
  "description": "GDPR Art. 32(1)(c) — ability to restore the availability and access to personal data in a timely manner in the event of a physical or technical incident.",
  "requirements": [
    {
      "requirement-url": "https://archrails.io/catalog/req/gdpr/backup-restoration",
      "config": {
        "control-id": "gdpr-backup-restoration",
        "rpo-minutes": 60,
        "rto-minutes": 240,
        "backup-encryption-at-rest": true,
        "restoration-test-frequency": "semi-annual",
        "last-restoration-test-date": "2025-04-12"
      }
    }
  ]
}

Art. 32(1)(d) — Periodic testing (gdpr-measures-testing)

Graph-level.

"metadata": {
  "controls": {
    "gdpr-measures-testing": {
      "description": "GDPR Art. 32(1)(d) — process for regularly testing, assessing and evaluating the effectiveness of technical and organizational measures.",
      "requirements": [
        {
          "requirement-url": "https://archrails.io/catalog/req/gdpr/measures-testing",
          "config": {
            "control-id": "gdpr-measures-testing",
            "frequency": "annual",
            "scope": ["encryption-effectiveness", "access-control-review", "logging-completeness", "backup-restoration"],
            "evidence-document-url": "https://internal.example.com/gdpr/measures-testing"
          }
        }
      ]
    }
  }
}

Art. 33 — Breach notification (gdpr-breach-notification)

Graph-level. Pipeline + responsibilities for the 72-hour breach notification to the supervisory authority.

"metadata": {
  "controls": {
    "gdpr-breach-notification": {
      "description": "GDPR Art. 33 — personal-data breaches notified to the supervisory authority within 72 hours of becoming aware, with documented criteria for what constitutes a notifiable breach.",
      "requirements": [
        {
          "requirement-url": "https://archrails.io/catalog/req/gdpr/breach-notification",
          "config": {
            "control-id": "gdpr-breach-notification",
            "supervisory-authority": "ICO",
            "notification-deadline-hours": 72,
            "internal-detection-process-url": "https://internal.example.com/gdpr/breach-detection",
            "notification-template-url": "https://internal.example.com/gdpr/breach-template",
            "data-subject-notification-criteria-url": "https://internal.example.com/gdpr/data-subject-notification",
            "tested-annually": true,
            "last-test-date": "2025-03-18"
          }
        }
      ]
    }
  }
}

Art. 28 + Chapter V — Processor + transfer mapping (gdpr-processor-transfer-mapping)

Per-relationship. Attach to edges that send personal data to a third party (processor) or to a non-EU jurisdiction.

"controls": {
  "gdpr-processor-transfer-mapping": {
    "description": "GDPR Art. 28 (controller-processor) + Chapter V (international transfers). This data flow is governed by a Data Processing Agreement and (when applicable) appropriate transfer safeguards (SCCs, adequacy decision, BCRs).",
    "requirements": [
      {
        "requirement-url": "https://archrails.io/catalog/req/gdpr/processor-transfer-mapping",
        "config": {
          "control-id": "gdpr-processor-transfer-mapping",
          "counterparty-name": "Acme Cloud Services GmbH",
          "counterparty-role": "processor",
          "dpa-signed": true,
          "dpa-document-url": "https://internal.example.com/gdpr/dpas/acme-cloud",
          "international-transfer": false,
          "transfer-safeguard": "n/a",
          "data-categories-transferred": ["contact-data", "transaction-history"]
        }
      }
    ]
  }
}

For non-EU transfers, populate international-transfer: true and transfer-safeguard with one of: adequacy-decision, standard-contractual-clauses-2021, binding-corporate-rules, or derogation-art-49.

Art. 17 + Art. 5(1)(e) — Retention + erasure (gdpr-retention-and-erasure)

Per-node.

"gdpr-retention-and-erasure": {
  "description": "GDPR Art. 5(1)(e) storage-limitation principle + Art. 17 right to erasure. Documented retention period + automated erasure path for personal data at end of retention OR on a valid erasure request.",
  "requirements": [
    {
      "requirement-url": "https://archrails.io/catalog/req/gdpr/retention-and-erasure",
      "config": {
        "control-id": "gdpr-retention-and-erasure",
        "retention-policy-url": "https://internal.example.com/gdpr/retention-policy",
        "max-retention-days": 1095,
        "automated-erasure-on-policy-expiry": true,
        "erasure-on-request-sla-days": 30,
        "erasure-evidence-logged": true
      }
    }
  ]
}

What the engine enforces

Same constraint engine that handles PCI / DORA / SOX / HIPAA / SOC 2 / MiFID / your own controls. Per-rule behavior:

All deterministic — pure function over your CALM JSON.

Auto-include during bootstrap (coming)

A future release will let archrails bootstrap detect EU-touching repos and offer to auto-include this template.

Versioning

This is gdpr/v0.1.0-beta. Pre-1.0 = beta. Bumps to v1.0.0 per the GA criteria above. Updates as EDPB guidelines or DPA enforcement priorities materially shift expectations.

Out of scope for this template

For those surfaces, pair this template with your privacy program documentation and engage a qualified DPO or privacy law firm.