Dependency risk og open source governance: sådan gør du cra til noget, der virker i drift

Dependency risk og open source governance er gået fra “nice-to-have” til noget, kunder, myndigheder og interne risikofunktioner forventer, at du kan styre og dokumentere. Under CRA er pointen ret simpel: hvis du sælger et digitalt produkt i EU, skal du kunne vise, at du arbejder systematisk med sikkerhed gennem hele produktets livscyklus, inklusive håndtering af sårbarheder.

Det her er den praktiske version: hvad du bør kunne svare på, hvilke processer der typisk mangler, og hvordan du bygger en driftsvenlig tilgang til afhængigheder og open source, uden at det ender som et Excel-ritual ingen tror på.


Hvad CRA reelt “tester” dig på (uden at du drukner i jura)

Du kan tænke CRA som en kombination af tre forventninger:

  1. Security by design: du har tænkt sikkerhed ind i planlægning, udvikling, release og vedligehold.
  2. Vulnerability handling: du kan opdage, prioritere, fixe og kommunikere sårbarheder effektivt i supportperioden.
  3. Dokumenterbarhed: du kan bevise, at du gør det. Ikke “vi plejer at…”, men sporbare beslutninger og artefakter.

Og ja, det bliver mere konkret i takt med at kravene begynder at gælde: CRA trådte i kraft 10. december 2024, rapporteringsforpligtelser gælder fra 11. september 2026, og de brede hovedkrav gælder fra 11. december 2027.

Mini-konklusion: CRA handler mindre om at “have et værktøj” og mere om at kunne dokumentere en stabil proces, der virker under pres.


Dependency risk: det du faktisk skal styre (ikke bare tælle)

Afhængighedsrisiko er ikke kun “CVE’er i et dashboard”. Det er et miks af:

  • Sårbarheder: kendte issues, men også svag crypto, default creds, unsafe parsing, osv.
  • Supply chain: kompromitterede pakker, typosquatting, ondsindede maintainer-skift, maliciøse updates.
  • Vedligeholdelse: projekter der dør, dependencies der bliver “stale”, og opgraderinger der pludselig knækker alt.
  • Licensrisiko: uforenelige vilkår, copyleft-krav, uklare NOTICE-forpligtelser.
  • Driftsrisiko: performance, memory leaks, uventede netværkskald, afhængigheder der trækker mere med sig end du tror.

Hvis du vil lyde moden (og faktisk være det), skal du kunne svare på:

  • Hvilke afhængigheder er kritiske for produktets sikkerhed og funktion?
  • Hvilke ligger i runtime vs kun build-time?
  • Hvilke er internet-eksponerede gennem din arkitektur?
  • Hvad gør I, når en kritisk sårbarhed rammer “fredag 15:47”?
  • Hvordan sikrer I, at opdateringer ikke bliver et sjældent, traumatisk event?

Mini-konklusion: God dependency risk handler om kontekst, eksponering og forretningsimpact, ikke om at jage et lavt antal findings.


Open source governance: din “trafiklov” for komponenter

Open source governance er reglerne for, hvordan teams må introducere, opdatere og håndtere open source. Governance virker kun, hvis den er:

  • Tydelig (alle kan forstå den)
  • Let at følge (automation > møder)
  • Konsekvent (samme beslutningslogik hver gang)
  • Sporbar (hvem godkendte hvad, og hvorfor)

Et pragmatisk minimum (som ikke kræver 40 sider)

  1. Regler for nye dependencies
    • Hvornår må et team tage en dependency ind uden review?
    • Hvornår kræver det security/legal review (fx høj risiko, uklar licens, lav vedligeholdelse)?
  2. Patching- og opdateringspolitik
    • Definér SLA’er: fx “kritisk i eksponeret runtime” = fix/mitigation inden X dage.
    • Definér hvad der tæller som “mitigation” (patch, config, feature flag, WAF, isolation).
  3. Licenspolitik
    • Tilladt / betinget tilladt / forbudt.
    • En enkel undtagelsesproces med owner + udløbsdato.
  4. Versioning discipline
    • Pinning/lockfiles, reproducible builds, og en fast kadence for dependency updates.
  5. Undtagelser der ikke bliver permanente
    • Hver undtagelse skal have: begrundelse, risk owner, kompensation, deadline/expiry.

Mini-konklusion: Governance er ikke et dokument. Det er en beslutningsmotor, der gør det let at gøre det rigtige og besværligt at gøre det farlige.


Tooling: vælg det, der passer til drift, ikke til demoen

Du kan købe dig fattig i “platforme”, der lover ro i sjælen. I praksis er de vigtigste kriterier ret kedelige:

  • Understøtter jeres sprog og build-systemer (ellers får du blind spots)
  • Finder både direkte og transitive dependencies
  • Kan køre i CI/CD og knytte resultater til et konkret release
  • Har policy-as-code (så regler kan versionstyres og reviewes som normal kode)
  • Kan give historik/audit trail (så du kan dokumentere forbedringer og undtagelser)
  • Kan outputte noget, kunder og risikofolk kan forstå uden tolk

Det vigtigste designvalg er ikke “hvilket brand”. Det er: Hvordan får vi signaler, vi faktisk handler på?
Hvis værktøjet skaber 900 findings og ingen handling, har du købt støj.

Mini-konklusion: Tooling er kun nyttigt, hvis det reducerer beslutningstid og gør handling automatisk, ikke hvis det bare producerer rapporter.


Drift: en proces, der kan tåle virkeligheden

Her er en driftsvenlig end-to-end arbejdsgang, der typisk matcher det, CRA i praksis presser dig hen imod: håndtering af risiko gennem livscyklus, med dokumentation og klare roller.

1) Indfør fast cadence for dependency updates

  • Ugentlig eller to-ugentlig “dependency window” (små, hyppige ændringer slår sjældne mega-opgraderinger).
  • Skab rutine i at opdatere uden drama.

2) Scan og evaluér på hver build/release

  • Gør det til en del af pipeline, ikke en manuel øvelse.
  • Stop builds på få, klare “hard fails” (fx kritisk + eksponeret + kendt exploit).

3) Triage efter risiko, ikke efter CVSS alene

Sortér efter:

  • Eksponering (internet/privileged entry points)
  • Runtime vs build-time
  • Exploitability (kendt exploit, aktiv udnyttelse, let at udnytte)
  • Asset-kritikalitet (hvad kan kompromitteres?)

4) Skab “one truth” for beslutninger

  • Når du accepterer risiko eller laver undtagelser: log det.
  • Brug samme skabelon hver gang: hvad, hvorfor, kompensation, owner, udløb.

5) Fix, release, og kommuniker status ensartet

  • Ejer er teamet der kan releasen.
  • Security/platform faciliterer, definerer standarder og følger op.

Mini-konklusion: Det du skal “kunne”, er ikke perfektion. Det er forudsigelighed: at du kan reagere hurtigt og ens hver gang.


Typiske faldgruber (og hvordan du undgår dem)

Faldgrube 1: “Vi scanner, så vi er sikre”

Scanning uden triage, ejerskab og deadlines er bare en dyr måde at finde ud af, at verden er uperfekt.

Gør i stedet: Definér få gates + en triage-model, og mål på remediation tid.

Faldgrube 2: Undtagelser bliver en losseplads

Hvis undtagelser ikke udløber, bliver de til permanent risiko og teknisk gæld.

Gør i stedet: Kræv udløbsdato og risk owner. Ingen owner = ingen undtagelse.

Faldgrube 3: Licenser bliver “det må legal kigge på senere”

Senere bliver til aldrig, og så har du juridisk gæld du ikke kan afvikle.

Gør i stedet: En simpel licenspolitik + automatiske checks + undtagelsesflow.

Faldgrube 4: Opdateringer bliver sjældne og smertefulde

Når du ikke opdaterer løbende, bliver hver opdatering et mini-projekt, og så udsætter folk det.

Gør i stedet: Små, hyppige opdateringer som en normal del af udviklingsarbejdet.

Mini-konklusion: De værste problemer skyldes næsten altid manglende ejerskab og manglende rutiner, ikke “forkert tool”.


Et realistisk “første sprint” mod CRA-klar drift

Hvis du vil skabe værdi hurtigt (og ikke ende i compliance-teater), så gør det her:

  1. Definér en patch-SLA for kritiske sårbarheder (baseret på eksponering og impact).
  2. Indfør faste dependency updates i en cadence, teams kan leve med.
  3. Implementér policy-as-code for nye dependencies + en enkel undtagelsesproces.
  4. Byg sporbarhed: beslutningslog for undtagelser + historik for remediation.
  5. Sæt en simpel KPI: “median tid til remediation” for kritiske issues.

Det er ikke glamourøst. Det virker. Og det er præcis den slags drift, CRA implicit belønner: konsistens, dokumentation og livscyklus-tænkning.