Skip to content
Stribog

Compliance

All writing

DPDP Act for Engineers: India's Data Residency Architecture

The engineering read of India's DPDP Act 2023: data fiduciary duties, cross-border transfer, and the Significant Data Fiduciary tier as infrastructure.

Stribog15 min readUpdated 6 Aug 2026

For three years the standard engineering posture toward India's data-protection law was to wait. The Digital Personal Data Protection Act was passed in August 2023, but with no operative rules it had no teeth an architect had to design against. That waiting period is over. On 13 November 2025 the Ministry of Electronics and IT notified the Digital Personal Data Protection Rules, 2025, and with them a phased commencement schedule: the Data Protection Board of India stood up immediately, the consent-manager regime becomes live twelve months out, and the substantive compliance obligations — security safeguards, breach notification, retention limits, Significant Data Fiduciary duties, and cross-border controls — become enforceable on 13 May 2027. Roughly ten months of runway from the time of writing: enough to build correctly, not twice.

This article is the engineering read of that regime — not a legal summary; your counsel will produce a more precise register of obligations than anything here. It is the translation layer between that register and the infrastructure: which clause forces a decision about node topology, which about who signs the encryption keys, which you cannot unwind cheaply later. The theme is the one Stribog holds across every regime, from the EU's NIS2/DORA/AI-Act convergence onward: a compliance guarantee is only as strong as the technical control underneath it, and a control an auditor can verify beats one taken on trust.

The DPDP Act is also distinct from its EU cousins in a way that matters architecturally. Where the GDPR restricts cross-border flow by default and permits it only to adequate jurisdictions, the DPDP Act permits flow by default and restricts it only where the government says so. That permissiveness is a trap: it invites teams to leave data wherever it sits, until a Significant Data Fiduciary designation or a category-specific localization notification makes that placement illegal overnight. The right response is not to localize everything today — it is to build so that localizing any data category tomorrow is a configuration change, not a re-platforming project. Selling into government widens the same requirement further, since MeitY empanelment and the cloud-selection framework fix the substrate before a contract exists.

The Act Is Now a Deadline: What Commences and When

The DPDP Rules 2025 commence in three phases, and the phasing changes what you build first. Phase one, on notification (13 November 2025), stood up the Data Protection Board of India and its procedural machinery. Phase two, twelve months out (13 November 2026), brings the consent-manager regime — Board-registered intermediaries for granting and withdrawing consent across fiduciaries — into force. Phase three, eighteen months out (13 May 2027), governs your architecture: security safeguards, the two-stage breach-notification duty, retention and erasure limits, Significant Data Fiduciary obligations, and cross-border controls all become enforceable together.

The vocabulary maps onto system boundaries. A Data Principal is the individual the data is about — the data subject, in GDPR terms. A Data Fiduciary determines the purpose and means of processing — the controller, almost certainly you. A Data Processor processes on the fiduciary's behalf under contract — your sub-processors, managed services, and third-party APIs. Accountability sits with the Data Fiduciary and does not transfer to a processor: if your payments vendor leaks a Data Principal's records, the regulator's enquiry lands on you. That is why the sub-processor chain must be a first-class artifact in your architecture, not a spreadsheet updated once a year.

DPDP's legal roles are not abstractions — each maps to a concrete control the platform must enforce. Accountability sits with the Data Fiduciary regardless of where a processor runs, which is why the sub-processor chain and residency boundary are platform properties.

Residency Is an Enforcement Problem, Not a Policy Promise

The phrase "our data stays in India" is, in most deployments, a statement about a contract, not about the system. It usually means the primary bucket is region-pinned and the vendor's terms assert residency. Neither fact constrains where a replica, backup, log line, cache, or support engineer's export actually travels. Rule 6 of the DPDP Rules — reasonable security safeguards — requires appropriate technical measures including encryption in transit and at rest, access control, and logging sufficient to detect and investigate a breach. Rule 6 does not itself mandate localization, but it makes the fiduciary responsible for knowing and controlling where protected data flows — control you assert from the platform, not a contract.

Enforced residency is a property of five layers the platform owns. Classification tags personal data and its traffic data at ingress. Placement pins workloads and volumes to nodes physically in India — a Mumbai or Hyderabad colo, or a verified India region. Admission control refuses to schedule anything that violates placement. Egress control removes the network path by which data could cross a border at all. And key custody ensures that anything which does leave — a replicated backup, a mis-routed export — is ciphertext no one outside your jurisdiction can read. Miss one layer and the guarantee has a hole an auditor will find.

Five enforcement layers. A contractual 'data stays in India' clause sits at none of them. Residency is placement, admission, egress, and keys — enforced by the platform and independently verifiable, which is what an audit needs.

The admission layer is where policy-as-code earns its place. On Kubernetes, a Kyverno or OPA admission policy can reject any workload that would land personal data outside the residency boundary — a PVC on a StorageClass not backed by in-India storage, a Pod without the topology pin to an India region, or a workload lacking the data-classification label the pipeline depends on. The policy is the control; the PolicyReport it emits is the audit evidence — both from the same mechanism.

yaml
# Kyverno ClusterPolicy — refuse to place classified personal data outside India.
# Enforced at admission; the PolicyReport it emits is the audit artifact.
# Region allow-list uses real topology.kubernetes.io/region codes, not "in-*".
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: dpdp-data-residency
  annotations:
    dpdp-control: "Rule 6 reasonable security safeguards; residency enforcement"
spec:
  validationFailureAction: Enforce
  background: true
  rules:
    - name: personal-data-must-pin-to-india
      match:
        any:
          - resources:
              kinds: ["Pod"]
      preconditions:
        all:
          - key: "{{ request.object.metadata.labels.\"data-classification\" || '' }}"
            operator: Equals
            value: "personal-data"
      validate:
        message: "Personal-data workloads must pin nodeSelector topology.kubernetes.io/region to an India code."
        deny:
          conditions:
            all:
              - key: "{{ request.object.spec.nodeSelector.\"topology.kubernetes.io/region\" || '' }}"
                operator: AnyNotIn
                value: ["ap-south-1", "ap-south-2", "centralindia", "southindia", "asia-south1", "in-mumbai", "in-hyderabad"]
    - name: personal-data-storageclass-must-be-in-india
      match:
        any:
          - resources:
              kinds: ["PersistentVolumeClaim"]
      validate:
        message: "PVCs holding personal data must use an in-India-backed StorageClass."
        deny:
          conditions:
            all:
              - key: "{{ request.object.metadata.labels.\"data-classification\" || '' }}"
                operator: Equals
                value: "personal-data"
              - key: "{{ request.object.spec.storageClassName }}"
                operator: AnyNotIn
                value: ["ceph-mumbai-block", "ceph-hyderabad-block", "in-south1-ssd"]
A Kyverno ClusterPolicy that turns 'personal data stays in India' into an admission-time invariant. Personal-data Pods are denied unless nodeSelector.topology.kubernetes.io/region is on the India allow-list (ap-south-1/2, centralindia, southindia, asia-south1, and on-prem in-mumbai / in-hyderabad — exact codes, not an in-* glob); volumes need an in-India StorageClass. The PolicyReport is the audit evidence.

Who Holds the Keys Decides Who Holds the Data

Encryption at rest is table stakes under Rule 6, but the property that determines residency is key custody, not ciphertext location. If data sits in India while the keys live in a foreign-parent provider's managed service, the plaintext is reachable by whoever can compel that provider. Hold the keys instead in a hardware security module inside your jurisdiction, and ciphertext that escapes the boundary is inert — crypto-shredding (destroying the key rather than chasing every copy) is residency of last resort: you cannot prove no copy crossed a border, only that no readable copy did.

The architecture is a self-hosted key layer: HashiCorp Vault Enterprise (HSM module) or OpenBao fronting an HSM physically in India, with envelope encryption so data keys are wrapped by a key-encryption-key that never leaves the module. PKCS#11/HSM auto-unseal is Enterprise-only on Vault; on the community side use OpenBao, whose PKCS#11 seal is not licence-gated. Workloads fetch data keys at runtime through the External Secrets Operator or Vault Agent, never embedding key material in images or manifests. When a category is later localized, enforcement is already in place: delete the category transit key (after setting deletion_allowed=true on its /config), keep successor keys India-resident, and prior offshore ciphertext becomes permanently unreadable. This is the optionality pillar in cryptography — change a whole data class's residency posture without touching the applications that use it.

hcl
# Vault Enterprise or OpenBao transit sealed by India-resident HSM (PKCS#11).
# Community Vault cannot use PKCS#11 seal. KEK never leaves the module;
# crypto-shred a category = delete its transit key (deletion_allowed first).
seal "pkcs11" {
  lib            = "/usr/lib/softhsm/libsofthsm2.so"   # prod: Thales/Utimaco in-IN
  slot           = "0"
  key_label      = "vault-kek-in-mumbai"
  hmac_key_label = "vault-hmac-in-mumbai"
}

# One transit key per DPDP data category — category-scoped crypto-shred.
# $ vault secrets enable transit
# $ vault write -f transit/keys/pd-financial type=aes256-gcm96
# $ vault write -f transit/keys/pd-health    type=aes256-gcm96

# App encrypts via Vault; plaintext keys never touch the pod filesystem.
# $ vault write transit/encrypt/pd-financial plaintext=$(base64 <<< "$RECORD")

# Residency-of-last-resort: enable deletion, then delete the category key to render every
# offshore copy unreadable. Leave deletion_allowed=false until the shred is authorised.
# $ vault write transit/keys/pd-financial/config deletion_allowed=true
# $ vault delete transit/keys/pd-financial
Vault Enterprise or OpenBao transit sealed by an India-resident HSM, one key per DPDP data category. The KEK never leaves the module — delete a category key after deletion_allowed=true and every copy is unreadable. Key custody, not storage location, is the residency control that holds under scrutiny.

The Significant Data Fiduciary Tier and the Localization Lever

The DPDP Act reserves a heavier obligation set for entities the Central Government designates Significant Data Fiduciaries, on volume and sensitivity of data processed, risk to Data Principals, and impact on sovereignty. An SDF must appoint a Data Protection Officer resident in India and answerable to its board — not outsourced or held by a foreign-resident executive — appoint an independent data auditor, and run a Data Protection Impact Assessment and audit every twelve months, reporting significant observations to the Board. These are not paperwork: the DPIA and audit both consume evidence your platform must produce on demand.

This is where the negative-list design becomes an architectural forcing function rather than a convenience. The right posture is a residency boundary that is classification-driven and switchable: every record carries a category label from ingress, and the enforcement layers — placement, admission, egress — read it. Localizing a category then means changing which categories egress permits offshore, not rebuilding the data path. The network layer is where this switch physically lives: default-deny egress with a Cilium egress gateway means no cross-border path exists unless you explicitly create one, per namespace, per category.

yaml
# Default-deny egress, then narrow allow-lists — no cross-border data path
# unless explicitly created. Localizing a category = removing its egress rule.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: deny-cross-border-egress
  namespace: pd-financial            # namespace scoped to one DPDP data category
spec:
  endpointSelector:
    matchLabels:
      data-classification: personal-data
  egressDeny:
    # Block egress to everything outside the in-India CIDR set.
    - toCIDRSet:
        - cidr: 0.0.0.0/0
          except:
            - 10.0.0.0/8             # in-cluster / in-IN colo fabric
            - 100.64.0.0/10          # in-IN private interconnect
  egress:
    # DNS must be allowed explicitly under default-deny egress.
    # Omit rules.dns so port 53 to kube-dns permits all queries. If you add L7
    # DNS filtering later, Cilium treats * as one label (not across "."): real
    # service FQDNs need matchPattern "*.*.svc.cluster.local" (or matchPattern
    # "*" for unrestricted DNS) — see Cilium Layer 7 DNS policy docs.
    - toEndpoints:
        - matchLabels:
            io.kubernetes.pod.namespace: kube-system
            k8s-app: kube-dns
      toPorts:
        - ports:
            - port: "53"
              protocol: ANY
    # Only in-India datastores and the in-India audit sink are reachable.
    - toEndpoints:
        - matchLabels:
            app: postgres-mumbai
    - toEndpoints:
        - matchLabels:
            app: audit-log-store-in
---
# When the SDF localization notice lands for financial data, the offshore
# egress rule for pd-financial is never added (or is removed). The boundary
# was always a switch — nothing to re-architect.
Default-deny egress scoped to one DPDP data category, plus explicit kube-dns allow so name resolution still works. No cross-border path exists by default, so a future category-localization notice is subtraction — a config diff on a control surface.

Cross-Border Transfer: The Negative List and Why It Is Not Reassurance

Section 16 sets a permissive baseline: a Data Fiduciary may transfer personal data to any country except those the Central Government restricts by notification. As of mid-2026 none has been notified, so general cross-border flow is broadly lawful — strikingly liberal next to the GDPR, which forbids transfer unless the destination is adequate or covered by a safeguard. The Rules add that transfers remain subject to conditions the government may impose by order. Accountability does not transfer with the data: the fiduciary remains answerable after it crosses the border.

A permissive rule is not reassurance, because it sits over sectoral localization that already binds and the SDF lever that can bind at any time. India's payments regulator has required payment-system data to be stored only in India since 2018, and the RBI and SEBI cloud instruments layer supervisory-access and exit duties on top of that; insurance and other regulated domains add their own residency constraints. A fintech is therefore already under hard localization for a slice of its data before DPDP's category mechanism even activates. The engineering conclusion matches the cloud-repatriation playbook from the DORA exit-strategy angle: you must demonstrate and exercise keeping a defined data class inside a jurisdiction — not merely assert you could if asked.

The Dual-Clock Breach Reality: CERT-In's Six Hours, DPDP's Seventy-Two

An Indian Data Fiduciary that suffers a breach runs two clocks at once, set to very different times. The DPDP Rules operationalize a two-stage notification to the Board: an initial intimation without delay the moment the fiduciary becomes aware of a breach, then a detailed report within seventy-two hours covering the facts, extent, cause where known, and mitigation. Affected Data Principals must also be notified without delay in plain language — what happened, what data, what they can do, how to reach you. Separately and earlier, the CERT-In Directions of April 2022 require specified cyber incidents to be reported within six hours of noticing them. One incident can trigger both, on clocks that start together but expire hours apart.

The engineering implication is that breach response cannot depend on evidence you must request from a vendor: if your logs live in a third party's managed service, the six-hour CERT-In clock can expire while you are still filing a support ticket. So the forensic evidence has to sit inside your perimeter, in an append-only store you control. CERT-In separately requires a rolling 180 days of security logs — the Directions say maintained within Indian jurisdiction, while CERT-In's own FAQ Q35 asks whether a copy must sit in India *only* and answers that logs may *also* be stored abroad if producible on demand in reasonable time — wording that reads more naturally as an additional-copy allowance than a substitute for the India-based copy, on a document that disclaims being able to amend the Directions in the first place — with Q36 carving out financial-transaction logs, which must sit in Indian jurisdiction regardless — and the DPDP Rules layer two distinct one-year floors on top of that: Rule 6(1)(e), part of the reasonable-security-safeguards duty, requires retaining logs and personal data for one year to enable detection, investigation, and remediation of unauthorised access and continued processing during a compromise; Rule 8(3) separately requires retaining personal data, traffic data, and processing logs generally for a minimum of one year from the date of processing — both retention floors sit against the Rule 8(1)–(2) erasure timeline and must be reconciled per data class. The self-hosted observability and audit stack that keeps telemetry inside your perimeter is, in the Indian context, not a cost choice — it is what makes the six-hour clock survivable.

bash
# In-India Ceph RGW audit sink. Object Lock must be enabled at create —
# PutObjectLockConfiguration alone fails with InvalidBucketState (409) on
# RGW if the bucket was not created lock-enabled (docs.ceph.com radosgw/s3).
# Versioning is required with Object Lock. A bare ObjectBucketClaim creates
# a normal mutable bucket and does not enable lock. PVCs/annotations enforce nothing.
# CERT-In (>=180d in-IN) + DPDP Rule 6/8 (logs + personal data, >=1 year).
#
# 1) Create the bucket WITH Object Lock enabled (S3: x-amz-bucket-object-lock-enabled):
aws s3api create-bucket \
  --bucket audit-log-store-in \
  --endpoint-url https://rgw.in.example \
  --object-lock-enabled-for-bucket
#
# 2) Then set COMPLIANCE default retention (>=400 days covers 180d + 1y headroom):
aws s3api put-object-lock-configuration \
  --bucket audit-log-store-in \
  --endpoint-url https://rgw.in.example \
  --object-lock-configuration \
  'ObjectLockEnabled=Enabled,Rule={DefaultRetention={Mode=COMPLIANCE,Days=400}}'
#
# Integrity job: --assert-retention=180d --assert-in-region=IN --assert-object-lock
Two required steps on the in-India RGW: create the bucket with Object Lock enabled at creation, then put COMPLIANCE default retention (400 days). Versioning is required with Object Lock — confirm it is Enabled after create. PutObjectLockConfiguration does not turn a normal OBC bucket into WORM; PVC annotations enforce nothing. When CERT-In's six-hour clock starts, evidence is already in your custody.

Deployment Models Against the Requirements

Not every deployment model can satisfy the DPDP and CERT-In control set by design, and the gaps are predictable. A US-parent hyperscaler's India region can pin storage and even hold logs in-country, but its control plane, key management, and sub-processor chain remain partly offshore and opaque — and it carries the same foreign-government-access exposure the EU compliance analysis identifies for the CLOUD Act. An India-incorporated cloud running managed Kubernetes resolves the legal-layer exposure and holds logs and keys in-country, but leaves the control plane with the provider. Self-hosted infrastructure in an Indian colo — your own Kubernetes, HSM, and network — is the only model green on every row, at the cost of the operational burden.

Deployment model decides which DPDP and CERT-In obligations are satisfiable by architecture versus only by contract. The self-hosted-in-India column is the only one green on legal-layer exposure and category localization — the two rows a contract cannot fix.

The gap map is not an argument that every workload belongs on bare metal in Mumbai — it is a decision instrument. Data classes with no localization exposure and low sensitivity can sit on a managed India region with contractual residency and lose little. The classes that fall, or plausibly will, under the SDF localization lever, sectoral localization, or the highest breach-penalty exposure are where green versus amber is the difference between a defensible control and a promise. Place workloads by regulatory exposure, not uniformly; the stateful data layer and the object storage behind it most reward being brought fully in-house.

The Long Game: Build the Boundary Before You Are Told To

The DPDP regime will not stand still: the Rules were three years behind the Act, and the first category-localization notification, the first SDF designations, and the first enforcement orders are all ahead of us. An architecture optimized for the exact text of the Rules as they read in mid-2026 will need rework each time the surface shifts; the one that endures is built on the invariant beneath the clauses — personal data whose placement, encryption, egress, and audit trail are properties of a platform you operate, controls an auditor can verify and an engineer can change with a pull request. That is the long-game posture Stribog brings to every regime: do not chase the regulation, build the sovereignty that makes it a configuration concern. A team that has already made its residency boundary a switch absorbs the next notification as a diff; one that treated residency as a contract clause absorbs it as an incident. The ten months to 13 May 2027 are enough to be the first kind of team — if building starts from the infrastructure, not the policy PDF.

A residency clause in a contract tells you where the vendor promises your data is. A residency control in your platform tells an auditor where it provably is. Only one of those survives a government notification that arrives on a Tuesday.
Stribog engineering practice

§FAQ/Common questions

Frequently asked

Does the DPDP Act require data localization in India?

Not as a blanket rule. Section 16 is permissive: personal data may be transferred anywhere except to countries the Central Government restricts by notification, and none has been notified as of mid-2026. Localization enters through two narrower doors. The Rules let the government specify categories of personal data — and the traffic data of their flow — that a Significant Data Fiduciary must not transfer offshore. And sectoral regulators already localize specific data: the payments regulator has required payment-system data to be stored only in India since 2018. Most fiduciaries therefore face selective, category- or sector-scoped localization, which is exactly why a switchable, classification-driven residency boundary beats blanket localization of everything.

When do DPDP compliance obligations actually become enforceable?

The DPDP Rules 2025 were notified on 13 November 2025 with a phased commencement. The Data Protection Board of India took effect on notification. The consent-manager regime becomes effective twelve months out, on 13 November 2026. The substantive obligations an architect designs against — security safeguards, breach notification, retention limits, Significant Data Fiduciary duties, and cross-border controls — become enforceable eighteen months from notification, on 13 May 2027. That last date is the practical compliance deadline for infrastructure work.

What extra obligations does a Significant Data Fiduciary carry, and who decides if we are one?

The Central Government designates SDFs based on factors including the volume and sensitivity of personal data processed, risk to Data Principals, and impact on sovereignty — a designation, not a self-assessment threshold, though high-volume consumer platforms and large financial and health processors are the obvious candidates. An SDF must appoint a Data Protection Officer resident in India and answerable to its board (the role cannot be outsourced or held by a foreign-resident executive), appoint an independent data auditor, and run a Data Protection Impact Assessment plus an audit every twelve months, reporting significant observations to the Board. It is also the tier subject to the category-specific offshore-transfer restriction.

How is the DPDP Act different from the GDPR for someone designing infrastructure?

The sharpest difference is the cross-border default. The GDPR forbids transfer outside the EEA unless the destination is adequate or a safeguard applies — a whitelist, so EU architectures start from restriction. The DPDP Act permits transfer everywhere except restricted countries — a negative list, so Indian architectures start from permissiveness. The trap is that permissiveness invites teams to leave data wherever it lands, then scramble when a category localization or SDF designation reverses the default. DPDP also layers over India-specific rules with no GDPR analogue, notably CERT-In's six-hour incident-reporting window and 180-day log retention. Design for the tighter of the overlapping obligations.

Why does key custody matter more than where the data is stored?

Because storage location is a claim you can rarely prove completely — you cannot demonstrate that no replica, backup, or export ever crossed a border — whereas key custody is a control you can prove and enforce. If encryption keys live in a hardware security module inside your jurisdiction and never leave it, any ciphertext that escapes the residency boundary is unreadable to anyone who cannot compel access to the module. That turns residency from a chase-every-copy problem into a control-one-key problem, and makes crypto-shredding — deleting a category transit key after enabling deletion_allowed — a defensible last-resort measure. For an SDF facing category localization, per-category keys held in India let a whole data class be rendered offshore-unreadable without touching the applications that use it.

dpdp actdpdp act 2023 compliance infrastructuredigital personal data protection act indiadata fiduciary obligations self-hostedsignificant data fiduciary data residencydpdp act cross-border transfer architecture

Executive Briefing

Thirty minutes to clarify your infrastructure risk

Walk us through your vendor footprint and regulatory constraints. We will tell you honestly where sovereignty creates leverage — and where it does not. No pitch deck. No obligation.