Alle dokumenter

Sikker utvikling

Oppdatert: 28. september 2026

Retningslinjen sier hvordan kode kommer fra en utviklers maskin til produksjon: versjonskontroll, kontroller, avhengigheter, hemmeligheter og personopplysninger. Den beskriver det som gjøres i dag, og det som mangler.

Sist oppdatert: 28.09.2026.


1. Versjonskontroll og utrulling

  • All kode ligger i ett git-repo på GitHub.
  • Vercel bygger fra git. En push til main gir en utrulling i produksjon. Andre grener gir en forhåndsvisning (preview).
  • Endringer skrives som egne commits med en melding som sier hva og hvorfor.
  • Arbeid som tar mer enn én commit, gjøres på en egen gren og slås inn med en pull request.

Gjennomgang av kode. Verid er et lite team. Mye går rett til main uten gjennomgang av en annen person: av de 176 siste commitene på main kom 17 via en pull request. Ingen regel i GitHub krever gjennomgang eller grønn CI før innslåing (ingen slik regel finnes i repoet).

2. Automatiske kontroller

CI kjører på hver push til main og på hver pull request (.github/workflows/ci.yml):

`` pnpm install --frozen-lockfile pnpm turbo typecheck test lint build ``

KontrollVerktøyHvor
TyperTypeScript, tsc --noEmitHver pakke (package.json)
TesterVitest. 67 testfiler per 28.09.2026apps/web, packages/*
LintESLinteslint.config.js i hver pakke
Byggnext buildapps/web
Låste avhengigheter--frozen-lockfile mot pnpm-lock.yamlCI

CI kjører uten databasenøkkel og uten nøkler til kildene. Ingen test i CI snakker med produksjon. Integrasjonstestene mot levende kilder kjører bare med VITEST_NETT satt, lokalt.

Vercel bygger uavhengig av CI. Et bygg som feiler hos Vercel, rulles ikke ut.

3. Avhengigheter

  • Pakkebehandler: pnpm, med låsefil i repoet.
  • Nye avhengigheter legges bare til når det er en klar grunn. Eksempel: Maskinporten-signeringen bruker node:crypto i stedet for et JWT-bibliotek (packages/sources/src/maskinporten/index.ts).
  • Avhengigheter oppdateres for hånd.

4. Hemmeligheter

  • Ingen hemmeligheter i repoet. .env* er utelatt i .gitignore, bortsett fra .env.example, som har navnene og ingen verdier.
  • *.pem er utelatt i .gitignore.
  • I produksjon ligger hemmelighetene som miljøvariabler hos Vercel.
  • Hemmeligheter logges aldri. Maskinporten-klienten gjengir bare HTTP-status og feilkode, aldri granten, tokenet eller nøkkelen (packages/sources/src/maskinporten/index.ts).
  • Access tokens lagres ikke i revisjonssporet. Kildereferanse bærer bare URL, status og tidspunkt (packages/sources/src/kilde.ts).

5. Personopplysninger i utviklingen

  • Fødselsnummer lagres ikke. Ingen kolonne tar imot det (packages/db/src/skjema.ts). Nummeret valideres og fjernes før et resultat lagres (packages/pipeline/src/personvern.ts). En ny kolonne som kan ta imot fødselsnummer, er ikke tillatt.
  • Ingen personopplysninger i loggen. Feil logges med loggbar() som navn: melding, aldri som hele feilobjektet (apps/web/lib/logg.ts). Grunnen: feil fra AI SDK bærer hele ledeteksten, og feil fra Drizzle bærer parameterne. Slettejobben logger saks-id-er, ikke innhold.
  • Ekte saker i repoet er forbudt. .gitignore utelater /saker/, *.sak.json, sak-*.json, kjoring-*.json og proto/.
  • Kildefiler med personopplysninger (aksjonærregisteret) slettes fra maskinen når importen er verifisert, og skal aldri inn i repoet (docs/personvern/behandlingsprotokoll.md, punkt 3).
  • En ny behandling av personopplysninger krever at behandlingsprotokollen oppdateres først.

6. Forhåndsvisninger

  • Hver gren får en forhåndsvisning hos Vercel.
  • Forhåndsvisninger er stengt for søkemotorer (VERCEL_ENV === "preview", testet i apps/web/lib/metadata.test.ts).
  • Hvilken database forhåndsvisningene bruker, og om de er beskyttet med innlogging hos Vercel, er ikke dokumentert i repoet.

7. Sikkerhet i koden

Regler som gjelder hver endring:

  • Tilgang sjekkes på serveren, i hver handling. proxy.ts sjekker bare om en informasjonskapsel finnes, og beskytter ingenting alene (apps/web/lib/sesjon.ts).
  • Foretaket hentes fra sesjonen, aldri fra forespørselen.
  • Saksdata leses alltid via saken, med foretaket i filteret (apps/web/lib/sak/les.ts).
  • Svar fra kilder valideres mot et Zod-skjema før de brukes (packages/sources/src/kilde.ts).
  • Svar fra språkmodellen må passe i et fast skjema (generateObject i apps/web/lib/kjoring/modell.ts).

Gjenstår

MangelRisikoPlan
Ingen regel på main som krever grønn CI eller gjennomgangEn feil kan rulles ut før CI er ferdigBranch protection på main: krev grønn CI. Krev gjennomgang når teamet er to
Ingen automatisk oppdatering eller varsling om sårbare avhengigheter (ingen Dependabot eller Renovate)En kjent sårbarhet kan bli liggendeSlå på Dependabot-varsler og sikkerhetsoppdateringer i GitHub
Ingen pnpm audit eller annen sårbarhetsskanning i CISom overLegg til i ci.yml
Ingen hemmelighetsskanning i CIEn hemmelighet kan bli committet ved en feilSlå på GitHub secret scanning og push protection
Det er ikke dokumentert hvilken database forhåndsvisningene bruker, eller om de er beskyttetEn forhåndsvisning kan vise produksjonsdata til den som har lenkenEgen Neon-gren for preview, og Vercel-innlogging på forhåndsvisninger
Ingen CSP med script-src (apps/web/next.config.ts)Svakere vern mot innsprøytet skriptEgen endring med nonce