OpenBSD: extreem in security

Security staat vaak op gespannen voet met functionaliteit voor de gebruiker van een computersysteem. Linux biedt voor een breed scala aan toepassingen een oplossing die daar goed tussenin zit. Maar wil je extreme security, dan wordt OpenBSD opeens interessant.

Dit artikel verscheen eerder in Linux Magazine, aflevering 4 van 2002.

OpenBSD is een uitvloeisel van NetBSD, en dat is net als Linux een open source besturingssysteem. De BSD systemen worden echter veel conservatiever ontwikkeld, namelijk door beperkte teams van vrijwilligers of (van origine) universiteitsmedewerkers die onderzoek doen aan besturingssystemen. Vergeleken met Linux, waar ieder zijn steentje mag bijdragen en waar meerdere distributies bestaan, is dat dus een strakker regime. Zulke strakke regimes zijn betrouwbaarder als het om security gaat.

Pro-active security

BSD unix-smaken worden heel algemeen gebruikt, en hoewel security belangrijk is, overheerst het niet alles van het systeem. Dus creëerde de Theo de Raadt het OpenBSD systeem, waar security allesoverheersend is, als afsplitsing van NetBSD. Hij vulde zijn security-eisen in met `pro-active security', wat er op neer komt dat het ontwikkelteam van OpenBSD constant de code zit te lezen, lezen en nog eens lezen, op zoek naar lekken in de veiligheid. Pro-actief betekent zoveel als zelf het heft in handen nemen. Immers, dit code-scannen is wat potentiële inbrekers ook doen. En aangezien het repareren van een lek gemakkelijker is dan het uitbuiten ervan, kun je dus wel aannemen dat OpenBSD extreem veilig is.

Het dichten van `security holes' blijft altijd een touwtrekspel tussen donkere machten enerzijds en nobele ridders anderzijds, gewoon omdat programmeren mensenwerk is. Ook het correct bewijzen van software met behulp van invarianten en dergelijke mathematische gereedschappen biedt geen soelaas, want daar zijn het de bewijsvoerenden en de modelmakers die de menselijke component vertegenwoordigen. Alas, touwtrekken dus, en OpenBSD trekt in dat spel wel heel hard aan hun eind van het touw.

De open source community gaat er prat op dat het beschikbaar stellen van broncode bijdraagt aan de veiligheid --- immers, achterdeurtjes en programmeerfouten zijn niet verborgen te houden, en doorgaans zijn er meer `goopd guys' aan het werk met de code dan `bad guys'. Hoop je. Met het pro-actieve security beleid van OpenBSD wordt hier een hele sterke impuls aan gegeven. Niet omdat de mogelijkheid er is, maar omdat het ook daadwerkelijk gebeurt!

De basisdistributie

Als je de installatiehandleiding van OpenBSD bestudeert, dan wordt je verteld dat er een `fully functional textual installer' bij komt. Met andere woorden, je moet niet gaan zeuren om een grafische installatietool, want ze hebben bij het maken van de distributie wel wat anders om zich zorgen over te maken. OpenBSD is dan ook niet geschikt voor Unix-beginners. De ervaren systeembeheerder zal er echter probleemloos mee kunnen werken.

Het idee van de basisdistributie is dat alles in principe veilig is, dat alles wat mogelijk problemen kan geven is uitgeschakeld, en dat programmatuur zo is geconfigureerd dat het meteen na de installatie veilig is. Vervolgens valt het onder de verantwoording van de systeembeheerder om die dingen open te zetten die hij durft. Overigens prettig te weten: OpenBSD zal nooit een configuratie-file overschrijven als je later een upgrade doet.

De meest belangrijke software van OpenBSD staat geïnstalleerd in de root partitie, namelijk in /bin en /sbin. Het is even wennen dat er geen /lib is, maar dat is eigenlijk heel goed. Op Linux vind je daar immers kernel modules en shared libraries --- beide worden vermeden voor de basis van OpenBSD, omdat ze kansen bieden om de systeembeheerder te bedotten. Wanneer je op Linux

ldd /bin/ls
doet, dan krijg je een reeks libraries te zien die apart worden ingeladen uit een pad dat door de environment variable LD_LIBRARY_PATH wordt beïnvloed, en dat biedt een stuk of drie alternatieve mogelijkheden voor de inbreker om binnen te komen. Kernel modules zijn nog enger dan gewone commando's. Bij OpenBSD wordt deze dynamiek daarom verholpen door library-code en modules statisch aan te linken. Bovenstaand commando op een OpenBSD systeem vertelt je dan ook iets als
/bin/ls is not a dynamic binary

Net als de andere BSD's kent OpenBSD een `ports' collectie die software bevat die van buiten de gecontroleerde cirkel van software komt. Deze ports zijn dus niet gecontroleerd op de genoemde pro-active wijze. Om dit duidelijk te maken wordt al die software is /usr/local geïnstalleerd. Die betekenis is afwijkend van die in Linux, waar /usr/local vooral is voor software die niet onder het beheer van de package manager (zoals RPM) vallen.

OpenSSH en IPsec

Als onderdeel van OpenBSD krijg je een aantal slimme cryptografische hulpmiddelen, die ook in andere distributies vaak worden gebruikt, namelijk OpenSSH en IPsec. De eerste ken je vermoedelijk wel, want de SSH software die bij Linux wordt geleverd is van die in OpenBSD afgeleid.

OpenSSH is een protocol om in te kunnen loggen in systemen op afstand, waarbij de verbinding gecodeerd is, zodat niemand anders dan zender en ontvanger het kunnen aftappen, en bovendien wordt met digitale handtekeningen zekergesteld dat het systeem op afstand dezelfde is als voorheen. Als je dus eenmaal goed bent ingelogd dan kun je er zonder tegenbericht van OpenSSH van uit gaan dat je daarna telkens hetzelfde systeem aanspreekt. En wil je bijvoorbeeld vanaf thuis inloggen op een werksysteem dan kun je zelfs de eerste keer al veilig inloggen wanneer je de `fingerprint' van dat systeem opvraagt bij de systeembeheerder op het werk. Bij de eerste verbinding geeft OpenSSH je namelijk de kans die te vergelijken.

IPsec doet iets soortgelijks, maar op een ander niveau. Het laagste niveau van Internet bestaat uit losse netwerkpakketjes, ofwel kleine brokjes gegevens van hooguit een paar kilobyte, die worden verzonden van zender naar ontvanger(s). Dat heet het IP-verkeer. Alle verbindingen, bijvoorbeeld voor web, mail of inloggen met SSH, worden opgebouwd uit zulke pakketjes. IPsec begeeft zich op dat laagste niveau van het Internet, waar het de mogelijkheid biedt om de gegevens te versleutelen, en om zeker te stellen dat je met de juiste computer spreekt.

Doordat IPsec zich op het laagste niveau bevindt, is het dus algemeen inzetbaar voor alles op het Internet. Het zal dan ook niet verbazen dat er veel aanhangers zijn van dit protocol, en uiteraard maken de OpenBSD ontwikkelaars deel uit van die aanhang. OpenBSD ondersteunt IPsec dan ook prima. Overigens is IPsec ook voor Linux beschikbaar, in de vorm van het pakket FreeS/WAN.

Encrypted swap

Wanneer je een programma draait, dan slaat dat programma tussenresultaten op in het geheugen. Bijvoorbeeld een mailtool die een boodschap afbeeldt op het scherm. Als die boodschap gecodeerd was verzonden dan heb je dus een geheime boodschap in je geheugen staan. Op zich is dat niet erg, want dat geheugen zit veilig in een (metalen) behuizing.

Een probleem kan optreden wanneer Linux geheugentekort heeft, want dan worden ongebruikte pagina's weggeschreven naar de harddisk, om later opgeroepen te worden als ze weer nodig zijn. Dit zorgt voor een soepel lopend systeem dat best even een poosje uit de voegen mag kraken qua geheugengebruik, maar het betekent ook dat geheime boodschappen weggeschreven kunnen worden naar de harde schijf.

Stel je nu voor dat je geheime boodschap net op de harde schijf is geschreven, en dat op dat moment iemand de spanning uitschakelt. Dan kan het systeem opnieuw gestart worden vanaf een floppy, en daarna kan de harde schijf met gemak worden nagelezen, inclusief de swap. Je systeem kan nog zo veilig zijn, maar als het niet draait heb je daar niet veel aan!

OpenBSD lost dit probleem op door de swap te coderen. Een raar idee, maar bij nadere beschouwing waterdicht. Bij het opstarten van het systeem wordt een symmetrische sleutel geprikt voor het coderen en decoderen van de swap, en die sleutel geldt alleen voor die ene run van het systeem. De swap van vorige keer is niet meer nodig na een reboot. En als die swap-sleutel wordt onthouden in het kernel geheugen dan weet je ook dat het nooit op de swap terecht komt, want alleen gebruikers-programma's kunnen naar de swap worden weggeschreven.

Tripwire en Aide

Inbrekers stellen er vaak prijs op om een programma op de achtergrond te draaien, dat dan kan worden gebruikt wanneer ze maar willen. Om zo'n programma voor de systeembeheerder verborgen te houden worden programma's zoals ps, top en netstat soms aangepast.

Als dit kwaad ondanks alle maatregelen toch geschiedt, dan wil je dat liefst zo snel mogelijk detecteren. Dat kun je doen door een programma als tripwire, of in de open source variant, aide. Deze programma's draaien af en toe tests op een selectie van de installatie, en vergelijken ze met vermeldingen in een database. Deze vermeldingen bevatten de secure hash van programma's zoals /bin/ps, en elke afwijking wordt gerapporteerd aan de systeembeheerder.

Natuurlijk houd je het probleem dat de tripwire database veilig moet zijn. Maar zulke dingen kun je oplossen door het op te slaan op een andere computer, of door het op te slaan op een read-only device zoals een cdrom, een harddisk waarin de schrijf-functionaliteit ongedaan is gemaakt, of een floppy met de schrijfbeveiliging er op. Of op een immutable file!

Immutable files

Soms wil je files zo opslaan dat je er niets meer aan mag veranderen. Bijvoorbeeld de file waarin de sleutels staan waarmee een computer zich identificeert voor SSH en IPsec. Of de tripwire-database. Of de PGP public keys van systeembeheerder en gebruikers.

OpenBSD kent, net als de andere BSD's overigens, de mogelijkheid om een file `immutable' te maken. Dat is de software-oplossing voor onbeschrijfbare files. Je maakt een file immutable met het chflags commando, dat een beetje vergelijkbaar is met chmod. Wanneer een file eenmaal immutable is kan niemand, ook de systeembeheerder (of een inbreker die zich de rechten van de systeembeheerder heeft toegeëigend) meer tornen aan de inhoud van die file. Ook renamen en deleten kan natuurlijk niet, anders zou het alsnog lek zijn.

Er zijn wat verfijningen op immutable files, zoals append-only files. Die zijn bijvoorbeeld heel geschikt voor log-files, om te voorkomen dat een inbreker die kan wissen nadat ze op oneigenlijke wijze zijn binnengekomen. Want een ervaren inbreker die zichzelf tot root heeft weten op te hemelen zal die rechten gebruiken om zijn moddersporen te wissen uit de log-files. Immers, anders zou de systeembeheerder zijn stiekeme achtergrondprogramma op het spoor kunnen komen en de nek omdraaien!

Security level

De kernel van OpenBSD, en ook die van de andere BSD's, opereert altijd op een bepaald `securelevel'. Per veiligheidsniveau is vastgelegd wat er mogelijk is, en hoe hoger het niveau, hoe minder manipulatie er op het systeem mogelijk is. Zo kan een gewone file op elk niveau worden veranderd in een immutable file, maar het omgekeerde mag niet meer op security levels vanaf 1.

Wanneer een systeem opstart, dan is het security level 0, en dan kun je dus nog relatief veel veranderen. Op elk gewenst moment mag het security level omhoog worden gebracht, maar daarna mag het nooit meer omlaag worden gebracht. Die functionaliteit zit domweg niet in de kernel! Een veilig systeem zal het security level eerst op 3 zetten, want dat is het maximum, voor open te gaan voor netwerkverkeer.

De enige manier om daarna nog aan immutable files te tornen is door het systeem te herstarten. En laat een draaiend achtergrondprogramma daar nou net door verdwijnen, het systeem weer in de begintoestand worden gebracht, en daarmee dus heel erg veel inbraakscenario's de das om gedaan worden! Laat bovendien een reboot heel erg gemakkelijk te detecteren zijn voor een systeembeheerder. Met andere woorden, het security level mechanisme biedt een heel simpel, maar ook heel krachtig stuk gereedschap om allerlei zaken grondig dicht te spijkeren. Het is een soort basis-bouwblok voor de paranoïde systeembeheerder.

Volstrekte willekeur

Willekeurige getallen zijn ook de vriend van iemand die streeft naar security, omdat het patronen helpt doorbreken, en daarmee de voorspelbaarheid van een systeem terugbrengt. OpenBSD past dat idee op diverse plekken toe.

Een normaal Unix- of Linux-systeem maakt nieuwe processen aan met oplopende nummers. Als je op Linux een aantal programma's opstart dan zie je dit duidelijk:

xclock & xclock & xclock & xclock & xclock &
ps | grep xclock
Op Linux laat zien dat de procesnummering gestaag oploopt. Dit patroon kan bruikbaar zijn voor inbreker-wonnabe's, dus OpenBSD gebruikt er willekeurige getallen voor. De eerste keer dat je dat ziet kijk je raar op!

Andere plekken waar deze denkgang wordt gevolgd is bij het openen van Internet-poorten voor andere zaken dan de services die op standaardplekken horen te staan, en ook de volgorde-nummering van IP-pakketjes in een verbinding begint op een willekeurige plek.

Firewall

Het zal niet verbazen dat OpenBSD wordt uitgebracht met een zeer complete firewall. Om precies te zijn, het gaat hier om een connection-aware firewall. Zo'n type firewall kan niet alleen pakketjes filteren op basis van hun oorsprong en bestemming, maar bovendien kan worden meegewogen om welke verbinding het gaat.

Zo kun je bijvoorbeeld verkeer op bepaalde inkomende verbindingen verbieden, terwijl je hetzelfde wel toestaat als uitgaand verkeer. Je kunt dus een systeem ontwerpen dat zelf naar willekeur contact opneemt met andere systemen, zonder dat er verbindingen van buitenaf worden getollereerd. Dit is bijna zo veilig als een systeem dat helemaal niet aan een netwerk hangt!

Crypto hardware support

Je voelt al wel aan dat cryptografie belangrijk is in OpenBSD, en de berekingen die daarvoor nodig zijn behoren niet tot de simpelste. Er wordt dan ook rekenkracht geïnvesteerd in al die security. Zoals je kon lezen in `De cryptografische gereedschapskist' is het aantal operaties voor security redelijk beperkt, dus dat kan prima worden uitgevoerd in gespecialiceerde hardware. Zulke hardware bestaat, en wordt ook door OpenBSD ondersteund.

De distributie... is lek?!?

Ik heb maar één zwak punt gevonden in OpenBSD, en dat is het distributie-mechanisme. Je downloadet OpenBSD van een FTP-site, over een niet-encrypted verbinding. Hoe kun je dan zeker zijn dat je werkelijk OpenBSD ophaalt? Er is weliswaar een distributie op CD (daarmee wil het projekt de kosten dekken) maar dekt die de onzekerheid af dat iemand anders de CD vervangen kan hebben?

Dit is duidelijk iets waar OpenBSD aan zal moeten werken -- in de praktijk gaat dit soort zaken wel goed, maar dat vertrouwen sluit niet aan bij de OpenBSD filosofie.

Conclusie

OpenBSD is extreem in security. Het is op vele punten veiliger dan Linux, maar dat is voor doorsnee toepassingen overdreven. Toch is er een markt voor, en als je security belangrijk vindt dan is OpenBSD zeer zeker een overweging waard. Met name het beleid van pro-active security is een heel fundamenteel beginsel, dat open source `af' lijkt te maken op security-gebied.

Verder lezen

http://openbsd.org -- De website van OpenBSD.
http://openssh.org -- De website van OpenSSH.
http://freeswan.org -- FreeS/Wan is IPsec voor Linux.
http://tripwire.com -- Tripwire komt met een commerciële monitoring service
man chflags -- Over immutable files.
man init -- Legt securelevel in detail uit.

 
   ------ 8< ---------- 8< ----------- 8< ------ | OpenFortress*