Kan man jämföra OpenBSD och SELinux?

Jag har fått en fråga! Kurt undrar så här:

En säkerhetsfråga från en novis.

Vad jag förstår så bygger säkerheten i OPENBSD på att undvika säkerhetshål, så ingen kan komma in. Säkerheten i SELINUX bygger väl på principen att om någon kommer in kan de inte göra något elakt. Skulle man inte kunna kombinera principerna och implementera SELINUX i OPENBSD och därmed få ett supersäkert system?

Det korta svaret är: Nej.

Ett förtydligande tillägg lyder: Beskrivning av de båda projekten är inte riktigt riktig.

En längre utläggning följer. :-)

Jag tror båda projekten sysslar med både intrångssäkerhet och intern säkerhet i lika hög utsträckning. Däremot skiljer de sig från varandra på så vis att SELinux (nästan) bara är en åtkomstmodell, som så att säga "står i mitten" och försöker styra upp eventuella taskigt konstruerade program, medan OpenBSD är ett helt operativsystem (i ordets vidare bemärkelse).

OpenBSD innefattar till exempel varianter av GNU-kompilatorn och Apache-servern, och är »hemsystem« för både OpenSSH och sudo, och GCC-varianten som följer med har ett inbyggt skydd mot stack-smashing. SELinux omfattar däremot inte ens något skal, och än mindre någon kompilator, utan är en uppsättning patchar för Linux-kärnan.

Projekten är alltså inte helt jämförbara, eftersom SELinux bara är en modifikation av Linux-kärnan, medan OpenBSD är både en unik kärna och ett userland bestående av unika program (alltså ungefär en »distribution« på Linux-språk, fast en distribution där alla program kommer från samma källa istället för att ha plockats ihop från olika håll).

Vill man göra en ordentlig jämförelse, så bör det alltså vara mellan OpenBSD och en enskild Linux-distribution (till exempel Ubuntu, Fedora eller Slackware), inte mellan OpenBSD och Linux (vilket vore litet som att jämföra en päronplantage med ett mandelträd.)

Om vi ägnar en stund åt de områden där jämförelser ändå går att göra i någon mån, alltså sådana områden där projekten i en annan värld hade kunnat vara likadana, så finns det faktiskt flera väsentliga skillnader. Den säkerhetsmässigt mest avgörande tror jag är inställningen till användaren. OpenBSD bibehåller aktivt en viss inlärningströskel, och de flesta program som utgör ens en perifer säkerhetsrisk är inte aktiverade på en fräsch installation. Konfigurering sker därtill i regel på klassiskt vis, genom att man ändrar i textfiler, vilket i sin tur kräver att man läser de noggrant underhållna man-sidor som följer med systemet.

Inlärningströskeln gör att man måste lära sig en del om hur programmen fungerar för att få dem att bete sig som man vill, eller för att ens starta dem. Konsekvensen är (förhoppningsvis) mera upplysta användare och administratörer, vilket i grund och botten är vad all säkerhet går ut på, både intern och extern.

I rättvisans namn så är en sådan inriktning antagligen omöjlig att genomföra för SELinux. Projektets fokus är rent kodmässigt betydligt snävare, och svängrummet är därför mera begränsat. Kärnan har inget som helst inflytande över hur svåra eller lätta program är att administrera, hur säker programmens kod är, vad som körs och inte körs direkt efter en installation eller hur bra dokumentationen av programmen är. Däremot kan en kärna vara konstruerad så att den begränsar skadeverkningarna av dåliga program (vilket givetvis inte är förbehållet SELinux, utan gäller alla kärnor).

Att kombinera SELinux och OpenBSD är i praktiken omöjligt. Linux är rent kodmässigt en klon av Unix, medan BSD-systemen är direkta avkomlingar. BSD-systemen (däribland Darwin under OSX) har var sina egna kärnor, som liknar och delar viss kod med varandra, medan Linux-kärnan har en helt egen struktur och bygger på helt annan kod. BSD är alltså inte Linux, men Linux är (tillsammans med GNU-systemet som brukar följa med) ursprungligen skapat för att efterlikna BSD:s förfäder.

Linux-kärnan är dessutom GPL-licensierad, vilket gör det mycket svårt att använda kod därifrån i BSD-systemen, eftersom de i regel använder olika varianter på BSD-licensen. OpenBSD använder numera mestadels en ISC-licens, som i praktiken bara kräver att licenstexten och copyright-snutten lämnas orörda, och det endast i källkoden. Därför kan man hitta BSD-licensierad i helt sluten programvara, som Windows, marslandaren och en del routrar. GPL tillåter inte något sådant.

Den licensen kräver ju en hel del mer, bland annat att samma licens gäller alla ändringar och tillägg i koden, och att den alltid är tillgänglig till självkostnadspris för alla som har programmet. Om du infogar GPL-kod i ett BSD-licensierat program så måste hela programmet därefter distribueras enligt GPL-villkoren. Det är alltså inte omöjligt att infoga GPL-kod i BSD-licensierade program, men det är få BSD-utvecklare som vill, eftersom de tycker BSD-licensen passar dem bättre.

Om man däremot tar BSD-kod och placerar i GPL-program, så uppstår inga problem förrän någon får lust att hämta tillbaka eventuella förbättringar i koden till ett BSD-program; detta är omöjligt utan att hela programmet blir GPL-licensierat istället. På så vis är BSD-licensen alltid den »svagare« i relation till GPL.

Men som tur är, så tror jag det vore onödigt att kombinera själva idéerna i SELinux med OpenBSD-kärnan. Jag vågar inte påstå att det vore ett säkerhetsmässigt nerköp för OpenBSD, men det skulle nog inte heller tillföra något väsentligt. Ibland talas det om att den mera flexibla filåtkomst-modellen som SELinux implementerar skulle vara en fördel i OpenBSD, men i praktiken kan man uppnå samma effekt med den för Unix-system traditionella åtkomstmodell som OpenBSD använder. En fördel med den traditionella modellen är att den är lättare att förstå sig på och överblicka.

Jag hoppas det här duger som svar på frågan. Dessutom kostar jag på mig brasklappen att jag inte är någon »säkerhetsexpert«, vare sig i betydelsen white hat, eller på så vis att jag försörjer mig genom att varna för internetmaskar åt något antivirusföretag. ;-)

Däremot är jag intresserad sedan flera år tillbaka. Kritiska eller utvecklande kommentarer är med andra ord (också) välkomna!