Så driftar vi OrbGIS, från servrar till säkerhetskopior

·Av Hannes Samskog

Var er data finns, vad som händer med den om något går sönder, vem som kan nå den och hur vi får reda på när något går fel. Infrastrukturen bakom OrbGIS.

Vi brukar säga att OrbGIS driftas i Sverige och att vi sköter driften själva. Här beskriver vi vad det betyder för er data i praktiken: var den lagras, hur den säkerhetskopieras, vem som kan nå den och hur vi märker när något går sönder. Allt som beskrivs nedan finns på riktigt, står i vår driftdokumentation och har i de flesta fall prövats i en verklig återställning.

Var er data finns#

Produktionen körs hos en svensk molnleverantör, tillsammans med en utvecklingsmiljö som varje ändring passerar innan den når er. Säkerhetskopiorna går till ett andra datacenter på en annan ort, och en tredje kopia hämtas till hårdvara vi äger själva, helt utanför molnleverantören. Systemen är fördelade på flera fysiskt åtskilda platser inom EU, så två kopior av er data finns aldrig i samma byggnad, på samma strömförsörjning eller i samma nät.

PlatsVarVad som finns där
ProduktionEU/SverigePlattformen, er databas, era filer, era kartrutor
Lagring av säkerhetskopiorEtt andra datacenter, på annan ortVarje säkerhetskopia, i ett annat datacenter än det den skyddar
Vår egen hårdvaraEn tredje plats, utanför molnleverantörenEn tredje kopia av varje säkerhetskopia, samt övervakningen som bevakar servrarna

Alla leverantörer i den kedjan är europeiska, och inget av bolagen är amerikanskt. Varför det spelar roll för jurisdiktionen har vi skrivit om i artikeln om moln- och geodatasäkerhet för kommuner. Den här artikeln handlar om vad som händer innanför de gränserna.

Tekniken bakom#

Hela plattformen bygger på beprövad öppen källkod, och varje server kör hela uppsättningen i containrar:

  • PostgreSQL med PostGIS är kärnan. All er data finns här: varje lager ni laddar upp blir en geografisk tabell i databasen, och även behörighetsreglerna ligger i själva databasen.
  • Martin serverar era lager som vektortiles direkt ur PostGIS, per förfrågan och med era behörigheter tillämpade. Det finns alltså ingen separat kopia av er data som behöver hållas i synk.
  • TiTiler serverar uppladdade bakgrundskartor i rasterformat, och GDAL gör grovjobbet när ni importerar filer, oavsett vilket format de kommer i.
  • Supabases komponenter i öppen källkod sköter inloggning, REST-API och fillagring ovanpå samma databas.
  • Caddy sitter längst fram som omvänd proxy och sköter TLS, och OpenLayers ritar kartan i er webbläsare.

Eftersom allt är öppen källkod och allt finns på ett ställe finns det inga låsta format mellan er och er data. Den ligger i en PostGIS-databas och kan exporteras i öppna format när ni vill.

Om något går sönder: säkerhetskopiorna#

En säkerhetskopia ska kunna svara på två olika frågor. ”Ge mig databasen som den såg ut i natt” är den ena. ”Ge mig databasen som den såg ut klockan 14.32 i dag, två minuter före den misslyckade importen” är den andra. Vi har båda sorterna, och var och en finns på två platser utöver servern den skyddar.

Varje natt skrivs en fullständig kopia av databasen och en spegling av era uppladdade filer till versionshanterad lagring i det andra datacentret. Kontinuerligt skickas databasens ändringslogg till samma plats varannan minut, med en fullständig baskopia en gång per natt, så att databasen kan spolas tillbaka till vilket ögonblick som helst inom lagringsfönstret. Varje timme hämtar hårdvara vi äger själva en kopia av alltihop. Till den kopian kan bara nya filer läggas till, ingenting kan raderas. En daglig ögonblicksbild av disken gör att även en överskriven fil går att få tillbaka, och disken är krypterad med en nyckel som bara finns offline.

I siffror:

MåttVärde
Största möjliga dataförlust i värsta fallungefär 7 minuter
Dataförlust när inget ändrasingen
Fönster för återställning i lagringen14 dagar, till valfri tidpunkt
Garanterad historik enligt serviceavtalet90 dagar
Återställningstid enligt serviceavtaletinom 4 timmar

En grundregel styr allt det här: ingen enskild maskin och ingen enskild uppsättning nycklar ska kunna förstöra arkivet. Datorn med den tredje kopian har en behörighet som kan läsa säkerhetskopiorna och inget annat. Vi kontrollerade det genom att försöka: uppladdningar nekas, raderingar nekas. Servrarna har i sin tur ingen behörighet alls till den hårdvaran. Ett intrång på en enskild maskin lämnar de andra kopiorna orörda.

Tips

Lagringstiden gallrar ut säkerhetskopiefiler, aldrig data. Varje nattlig kopia är fullständig, så ett lager ni laddade upp för ett år sedan finns med i nattens kopia och i varje kopia därefter. Det fönstret begränsar är hur långt tillbaka ni kan gå, vilket i praktiken är hur lång tid ni har på er att upptäcka ett misstag. Raderade objekt ligger dessutom kvar i appens papperskorg i 30 dagar innan något tas bort fysiskt.

Säkerhetskopior vi faktiskt har återställt. Den nattliga kopian har återställts i sin helhet, med radantal som stämts av tabell för tabell. Tidpunktskopian har återställts i produktion, spelats upp till ett valt ögonblick och jämförts rad för rad med den levande databasen. Och varje återställning avslutas med en automatisk integritetskontroll som går igenom varje kartlager och bekräftar att datan verkligen finns där. En säkerhetskopia som aldrig har provåterställts är i praktiken bara ett antagande.

Vem som kan nå er data#

Från internet: en server svarar på exakt tre portar, för webbtrafik och SSH med enbart nyckelinloggning. Allt annat, databasen inräknad, går inte att nå utifrån. Administrationsverktyg, övervakningspaneler och loggsökning nås bara genom en krypterad VPN-tunnel, aldrig från det publika internet.

Mellan kunder: isoleringen upprätthålls inne i själva databasen, inte i applikationskoden. Varje tabell har radnivåsäkerhet, och vilken organisation en förfrågan tillhör kommer från den signerade sessionen, så ingen del av koden kan råka hoppa över filtreringen. Kartrutor renderas per förfrågan med användarens behörigheter tillämpade, och det är därför vi kör tileservern utan cache: en kartruta som ritats för en användare lämnas aldrig vidare till en annan. Uppladdade bilder och filer går genom samma behörighetslager. Tar ni bort någon ur er organisation slår det igenom omedelbart, oavsett vilken session personen fortfarande har kvar.

Vår egen åtkomst: verktygen vi använder för att felsöka i produktion körs under en databasroll som bara kan läsa. Den begränsningen upprätthålls av databasen, inte av en inställning i ett verktyg, så en bugg eller ett manipulerat verktyg kan inte skriva till er data.

Ändringar i plattformen: varje ändring testas och driftsätts i utvecklingsmiljön först, och produktion tar bara emot exakt den programvara som redan har körts där. Databasändringar provkörs och rullas tillbaka innan de tillämpas på riktigt, tillämpas i ett enda steg där allt eller inget går igenom, och föregås av en färsk säkerhetskopia. Provkörningen lade vi till efter att en release en gång lämnade vår egen miljö halvuppdaterad. Det kan inte hända på det sättet igen.

Hur vi märker när något går fel#

Det vi är mest rädda för är inte att något kraschar högljutt, utan att ett säkerhetskopieringsjobb tyst slutade köra för tre veckor sedan utan att någon märkte det. Därför är övervakningen till stor del byggd för att upptäcka tystnad.

Tillgänglighetskontroller bevakar appen, kartrutorna och inloggningstjänsten för båda miljöerna, och inloggningskontrollen pratar med den riktiga autentiseringstjänsten i stället för gatewayen framför den. Varje certifikat har ett utgångslarm flera veckor i förväg. Databasen och säkerhetskopieringsjobben skickar regelbundna livstecken, och larmet utlöses när livstecknen uteblir, inte först när något rapporterar ett fel. Övervakningsdatorn och servrarna bevakar dessutom varandra, så ett avbrott på endera sidan upptäcks inom ungefär en kvart. Larmen för att säkerhetskopiorna är färska körs på servrarna själva, så de fungerar även om det är övervakningsdatorn som har gått ner. Loggar från båda servrarna sparas i 30 dagar och går bara att söka i över VPN, med larmregler för felskurar och för loggströmmar som helt enkelt tystnar. Alla larm hamnar i en kanal som en person faktiskt läser.

Hur vi håller allt uppdaterat#

Operativsystemets säkerhetsuppdateringar installeras automatiskt på varje maskin, och kärnuppdateringar startar om servrarna i ett schemalagt nattfönster. Varje programvaruavbild som plattformen kör är låst till en exakt version, och en daglig skanning kontrollerar dem alla, även dem vi bygger själva, mot sårbarhetsdatabaserna. Nya allvarliga fynd går till en särskild säkerhetskanal. Paket från tredje part hålls tillbaka under en karenstid innan de får komma in i ett bygge, så ett skadligt paket som publicerades i går kan inte följa med in i OrbGIS i dag.

Det vi medvetet låter bli#

  • Ingen amerikansk leverantör någonstans i driftkedjan. Varken för drift, säkerhetskopior, övervakning eller AI-funktioner.
  • Ingen enskild behörighet som når alla kopior av er data. Den egenskap vi skulle behålla om vi tvingades släppa allt annat.

← Alla artiklar

Få nya artiklar direkt till din inkorg

Vi hör av oss när vi publicerar något nytt, inget annat.