# Operativsystem

## Hva det er

Et operativsystem er programvaren som starter først på en datamaskin og blir kjørende
under alt annet. Det fordeler prosessor, minne, lagring og nettverk mellom programmene
og gir dem alle de samme måtene å lese filer, bruke enheter og nå nettverket på. Det
forkortes gjerne OS, etter det engelske operating system. Windows, macOS, Android, iOS
og Linux-distribusjoner som Debian og Ubuntu er operativsystemer.

Ordlisten til NIST har to beskrivelser som utfyller hverandre. Den ene kaller det
hovedkontrollprogrammet som driver datamaskinen: det første programmet som lastes når
maskinen slås på, der hovedkomponenten, kjernen (kernel), ligger i minnet hele tiden, og
som setter standardene for alle applikasjonsprogrammer, f.eks. webserveren. Den andre,
fra NISTs veiledning om sikkerhet i driftsteknologi (operational technology), kaller det
en integrert samling tjenesterutiner som styrer rekkefølgen programmer kjøres i, som kan
stå for styring av inn- og utdata, planlegging av ressurser og databehandling, og som
gir applikasjonsprogrammene de grunnleggende kommandoene for å styre maskinen.

Kjernen er midtpunktet, men et operativsystem er mer enn sin systemkjerne. Rundt den
ligger systembibliotekene programmene kaller, skallet (shell) og de vanlige
kommandolinjeverktøyene, en tilsynsprosess som starter tjenester ved oppstart og starter
dem på nytt, en pakkebehandler som installerer og oppdaterer programvare, og en stor
mengde standardkonfigurasjon som avgjør hva som er slått på, hvor loggene havner, og
hvem som får logge inn. En Linux-distribusjon setter alt dette sammen rundt
Linux-kjernen, og derfor kan to systemer med samme kjerne oppføre seg svært ulikt.

Det meste et operativsystem tilbyr et program, er en kort liste med abstraksjoner som
står i stedet for maskinvaren. POSIX, standarden bak Unix-lignende systemer, definerer
dem presist. En prosess er et adresserom med én eller flere tråder som kjører i det,
pluss de systemressursene trådene trenger. En fil er et objekt som kan skrives til,
leses fra eller begge deler, med tilgangsrettigheter og en type: vanlig fil, katalog,
symbolsk lenke, FIFO, socket, eller en tegn- eller blokkspesialfil som står for en
enhet. En blokkspesialfil gir tilgang til en enhet på en måte som holder
maskinvareegenskapene ute av syne. Selve enheten defineres som en ytre enhet til
datamaskinen, eller et objekt som fremstår som en slik enhet for applikasjonen. POSIX
oppgir som formål å gjøre applikasjoner flyttbare på kildekodenivå, så et program
skrevet mot disse grensesnittene kan kompileres på et annet system som følger
standarden, og kjøres der.

Minnet får samme behandling. Dokumentasjonen for Linux-kjernen tar utgangspunkt i at
fysisk minne er en begrenset ressurs, og beskriver virtuelt minne som laget som skjuler
detaljene for applikasjonsprogramvaren. Hvert program ser et eget adresserom, og
operativsystemet avgjør fra øyeblikk til øyeblikk hvilke deler av hvilke programmer som
holdes i ekte minne, og hvilke som komprimeres, skrives ut til disk eller kastes for å
leses inn igjen senere.

## Hvorfor det er viktig

Valget av operativsystem avgjør mye på én gang: hvilken programvare som vil kjøre,
hvilke verktøy de som drifter det, allerede kan, hvem som leverer sikkerhetsrettinger og
hvor lenge, og hva en eventuell supportavtale vil koste. Å bytte senere betyr å flytte
hvert program og hver vane som er bygd på det, så valget lever som regel lenger enn
maskinvaren det først ble tatt på.

Det er også den viktigste tillitsgrensen inne i én maskin. Brukere, grupper,
filrettigheter og skillet mellom prosesser er alle funksjoner i operativsystemet, og de
avgjør hvor langt en feil i ett program kan nå. På en maskin der hver tjeneste kjører
med fulle rettigheter, gjenstår bare én mur: nettverkskanten.

Standardvalgene er beslutninger noen andre har tatt. En fersk installasjon kommer med
tjenester slått på, filer på avtalte steder og innstillinger som allerede er valgt. De
fleste er fornuftige; noen få passer ikke til arbeidet, og ingen sier fra om hvilke. Å
drifte en maskin godt innebærer å vite hvilke standardvalg du har godtatt.

Og det avgjør hvor langt koden kan reise. Et program som holder seg til de flyttbare
grensesnittene, flyttes til et annet system med en ny kompilering. Et program eller
skript som lener seg på ett systems utvidelser, kommer bare så langt som utvidelsene
gjør.

## Slik ser det ut i praksis

På en bærbar maskin
[fylte en applikasjon minnet til operativsystemet drepte den](/nb/portfolio/stopped-an-application-filling-memory-at-41mb-a-second-155/).
Tallene viser hvor langt et operativsystem strekker minnet før det griper inn: med en
stigning på rundt 41 MB i sekundet kom hendelsen som ble registrert, opp i 111 GB
komprimerte sider, og maskinen hadde 36 GB. Siden legger til at prosessen drepes først
etter at swappingen allerede har fått alt annet på skrivebordet til å slutte å svare.
Rettingen skjedde i applikasjonen og ikke i operativsystemet: hendelsesstrømmene fikk
grenser, lytterne abonnerer per hendelsestype, loggingen fikk et budsjett for hvor ofte
den skriver, og 610 996 logglinjer fra én økt ble til 1 411.

På selskapets vert hadde en automatiseringsrolle skrevet SSH-innstillingene sine ved
hver kjøring i månedsvis, da en tilgangsrapport leste daemonens egne effektive
innstillinger og fant at to av dem ikke stemte. Beretningen om
[herding av SSH med validering i tre trinn](/nb/portfolio/hardened-ssh-with-three-stage-validation-111/)
forklarer årsaken: operativsystemet leverer sine egne standardverdier ukommentert, over
stedet der en drop-in-fil havner, og for de to innstillingene er det den første
forekomsten som vinner. Løsningen var et filnavnprefiks som sorteres foran
leverandørens, og nå kontrolleres 24 direktiver mot det daemonen selv melder tilbake.

Den samme verten møtte enda et av systemets valg da tjenesten som stenger ute
inntrengere, ble satt opp.
[Loggkilden er satt til automatisk gjenkjenning](/nb/portfolio/proved-the-intrusion-banning-path-on-every-converge-112/),
fordi operativsystemet ikke leverer noen tradisjonell autentiseringslogg, og et feil
valg svikter i det stille ved å overvåke en fil som aldri dukker opp.

## Hvor det går galt

**Et skript bærer med seg vanene fra systemet det ble skrevet på.** Et skallskript
skrevet på en Mac og kjørt på en Linux-server, eller omvendt, møter de samme
kommandonavnene med andre flagg. POSIX-versjonen av `sed` godtar `-E` og `-n`; å
redigere en fil på stedet med `-i` er en utvidelse, og de to vanlige versjonene tar imot
den på hver sin måte:

```sh
sed -i 's/old/new/' notes.txt     # GNU sed, på de fleste Linux-systemer
sed -i '' 's/old/new/' notes.txt  # BSD sed, på macOS
```

Hver form feiler på det andre systemet. Hold dere til det POSIX definerer der det er
nok, kjør skriptet på det systemet som skal kjøre det i produksjon, og installer det
samme verktøyet på begge når en utvidelse er verdt å ha.

**To maskiner med samme operativsystem er ulike.** «Debian» er navnet på en familie av
utgivelser, og to verter som begge sies å kjøre det, kan ligge år fra hverandre i
utgivelse, kjerne og pakkeversjoner, med ulike pakker installert og ulike lokale
endringer. Les hva hver maskin faktisk er, før dere sammenligner dem:

```sh
cat /etc/os-release
uname -srm
```

Den første skriver ut distribusjonens navn og utgivelse, den andre kjernens navn og
utgivelse og maskinvarearkitekturen. Bygg hver vert fra den samme skriftlige
beskrivelsen, og før utgivelsen inn i inventaret.

**Tjenestene kjører som administrator.** En tjeneste som kjører som root på et
Unix-lignende system, kan lese hver fil og endre hver innstilling, så enhver feil i den
er en feil i hele maskinen. Gi hver tjeneste sin egen bruker uten privilegier, med
skrivetilgang bare der den skriver, og gi flere rettigheter én om gangen når tjenesten
viser at den trenger dem.

**En utgivelse lever lenger enn sikkerhetsstøtten.** Hver utgivelse slutter å få
rettinger etter en publisert plan. Debians sikkerhetsteam støtter f.eks. en stabil
distribusjon i tre år etter at den ble utgitt. En vert som blir stående på en gammel
utgivelse, fortsetter å virke, og nettopp derfor blir den glemt. Før opp datoen da
støtten tar slutt for hver vert, ved siden av de andre fornyelsesdatoene, og planlegg
oppgraderingen i god tid før.

## Les mer

- [operating system — NIST CSRC Glossary](https://csrc.nist.gov/glossary/term/operating_system)
  — begge definisjonene, fra hovedkontrollprogrammet til samlingen av tjenesterutiner.
- [POSIX.1-2024, Base Definitions: Definitions](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap03.html)
  — den nøyaktige ordlyden for prosess, fil, enhet og de andre ordene et operativsystem
  er bygd av.
- [POSIX.1-2024: sed](https://pubs.opengroup.org/onlinepubs/9799919799/utilities/sed.html)
  — flaggene hver `sed` som følger standarden, godtar, som et mål på hva et flyttbart
  skript kan bruke.
- [Linux kernel documentation: Concepts overview](https://docs.kernel.org/admin-guide/mm/concepts.html)
  — virtuelt minne, sidecachen og gjenvinning av minne, slik kjernen selv beskriver dem.
- [Debian security FAQ](https://www.debian.org/security/faq) — hvordan Debian håndterer
  sikkerhetsrettinger, og hvor lenge en stabil utgivelse får dem.

<https://engineer.company/nb/glossary/operating-system/>
