Security-as-Code

DORA w praktyce platformy: testowalne strategie wyjścia

W Suwerennym IDP pokazałem, że „exit-by-design” czyni strategię wyjścia funkcją techniczną. Dla sektora finansowego w UE to już nie jest dobra praktyka — to wymóg prawny. DORA (Digital Operational Resilience Act) zamienia odporność operacyjną z deklaracji w coś, co trzeba udowodnić i przetestować. Zobaczmy, jak warstwy platformy — IaC, GitOps, policy-as-code — przekładają się wprost na zgodność.

Teza

DORA nie pyta „czy macie dokument strategii wyjścia?". Pyta „czy potraficie ją wykonać bez przerwania działania?". To czyni z odporności właściwość architektury, nie segregatora.

Uwaga

To analiza techniczna, nie porada prawna. Zakres i interpretacja DORA zależą od podmiotu i nadzorcy — tu patrzymy wyłącznie na konsekwencje dla architektury platformy.

Co DORA wymaga (w skrócie technicznym)

DORA obowiązuje podmioty finansowe i ich dostawców ICT. Z perspektywy platformy liczą się przede wszystkim:

  • Mapowanie zależności ICT — musisz wiedzieć (i umieć wykazać), od jakich dostawców i komponentów zależysz.
  • Ryzyko koncentracji (CTPP) — zakaz nadmiernej zależności od jednego krytycznego dostawcy ICT (critical third-party provider).
  • Testowalne strategie wyjścia — utrzymywane i przetestowane ścieżki migracji bez zakłócenia działania.
  • Odporność operacyjna i testowanie — zdolność do przetrwania i odtworzenia po incydencie.

Kluczowe: nie wystarczy strategię opisać. Trzeba mieć operacyjną zdolność jej wykonania. A tę da się zbudować tylko przez fundamentalne odsprzężenie wytwarzania i dostarczania od konkretnego dostawcy infrastruktury.

Mapowanie wymogów na warstwy platformy

Wymóg DORAMechanizm platformy
Mapowanie zależności ICTwszystko-jako-kod w repo → zależności są jawne i audytowalne
Unikanie koncentracji CTPPmulti-cloud przez abstrakcję IaC + framework-agnostyczna orkiestracja
Testowalna strategia wyjściaGitOps jako odtwarzalny stan → DR = wskazanie kontrolerowi nowego klastra
Dowody zgodnościpolicy-as-code jako bramki + ślad audytowy z Gita
Odporność/odtwarzanieśrodowiska deklaratywne, reprodukowalne z repo

Abstrakcja IaC: warunek unikania koncentracji

Ryzyka koncentracji nie da się ograniczyć, jeśli wdrożenie jest „zapieczone” w API jednego dostawcy. Dlatego infrastrukturę definiujesz w sposób cloud-agnostyczny — przez OpenTofu (lub Terraform) z modułami, które da się skierować na różnych dostawców:

# moduł sieci wołany dla różnych dostawców z tego samego kodu
module "vpc" {
  source   = "git::https://git.eiac.dev/eiac/modules.git//network?ref=v1.4.0"
  provider = var.target          # sovereign-eu | global-aws
  cidr     = "10.0.0.0/16"
}

Ten sam moduł, dwa cele wdrożenia — to techniczny fundament tezy „nie jesteśmy nadmiernie zależni od jednego dostawcy”. Multi-cloud przestaje być hasłem, a staje się weryfikowalną własnością kodu.

GitOps: strategia wyjścia, którą da się wykonać

Skoro cały stan systemu żyje jako kod, „wyjście” przestaje być projektem migracyjnym, a staje się operacją. Kontroler GitOps (Argo CD / Flux) odtwarza środowisko z repozytorium na dowolnym zgodnym klastrze:

katastrofa / nakaz wyjścia provisioning klastra u innego dostawcy Argo CD → reconcile z repo środowisko odtworzone tofu apply
Exit = DR jako operacja: provisioning u innego, suwerennego dostawcy, skierowanie kontrolera GitOps na nowy klaster i odtworzenie środowiska z repo.

To jest sedno „testowalnej strategii wyjścia”: skoro DR i exit to ta sama operacja (re-point kontrolera + reconcile), możesz ją przećwiczyć — a przećwiczona migracja to dokładnie to, czego DORA wymaga. Na Kubernetes (lub lekkim k3s na zapasowej lokacji) odtworzenie jest powtarzalne i mierzalne.

Dowody zgodności jako kod

DORA wymaga wykazywania zgodności. Zamiast ręcznych audytów, czynisz reguły maszynowo egzekwowalne i samodokumentujące — policy-as-code w pipeline (np. OPA). Każde uruchomienie zostawia ślad: co sprawdzono, z jakim wynikiem.

# przykładowa reguła zgodna z wymogiem rezydencji danych
package eiac.dora

deny contains msg if {
  input.resource.type == "database"
  not startswith(input.resource.region, "eu-")
  msg := "dane regulowane muszą pozostać w regionie UE"
}

Reguła egzekwowana w CI (i ślad z Gita) jest jednocześnie kontrolą i dowodem — bez osobnego procesu audytowego.

Granica: czego platforma nie załatwi

Uczciwie: platforma spełnia techniczną część DORA. Reszta — rejestr informacji o dostawcach, raportowanie incydentów do nadzorcy, testy odporności (w tym TLPT dla większych podmiotów), zarządzanie ryzykiem na poziomie organizacji — to procesy i obowiązki wykraczające poza kod. Architektura jest warunkiem koniecznym zgodności, nie wystarczającym.

Podsumowanie

DORA przesuwa ciężar z „opisz strategię wyjścia” na „udowodnij, że ją wykonasz”. Everything-as-code daje mapę zależności, abstrakcja IaC ogranicza koncentrację, GitOps czyni z exitu rutynową operację, a policy-as-code dostarcza dowodów. To nie przypadek, że to ta sama architektura, którą opisałem jako suwerenną — odporność i suwerenność wyrastają z tego samego korzenia. Uczciwie: sam kod nie załatwi zgodności w całości; rejestr dostawców, raportowanie incydentów i procesy to wciąż robota ludzi. Ale bez tej architektury reszta nie ma się na czym oprzeć. W kolejnej części patrzę na drugą wielką regulację: AI Act a agentowy SDLC.