Free of Open? Van een FreeBSD firewall naar een OpenBSD firewall met flashrd
- January 13, 2015
- 0
FreeBSD firewalls hebben een goede reputatie. FreeBSD heeft de keuze gemaakt om de bestaande code te verbeteren, zodat deze beter presteert op multi processor systemen (SMP). Hierdoor is wel de hoeveelheid nieuwe features beperkt [Remko Lodder].
Hier liep ik tegenaan toen ik een aantal nieuwe features moest implementeren in een kritische productie-omgeving. OpenBSD bevatte wel de gewenste features. Hier was een simpelere manier van regels beschrijven en door de verbeterde manier om NAT regels te beschrijven, werd het ineens wel mogelijk om een VPN verbinding werkend te krijgen. Omdat snel en veilig upgrades gedaan moesten worden, is ervoor gekozen om flashrd te gaan gebruiken.
FreeBSD’s PF stamt nog uit de tijd van OpenBSD 4.5 (mei 2009) en is daarna niet meer gesynchroniseerd met OpenBSD’s nieuwere features. Er is wel aan de FreeBSD implementatie gewerkt, maar zoals eerder beschreven is dit met name gericht op performance verbeteringen bij multiprocessor systemen (SMP). Naast de nieuwere features zijn hierdoor ook semantiek versimpelingen niet meegenomen.
OpenBSD’s ontwikkelingen zijn onder andere het verbeteren van de regel semantiek. Had je eerst 3 regels nodig om een aantal redirect en/of nat rules te maken, is dat er nu 1. Hierdoor is het dus mogelijk om deze combinatie aan regels te reduceren. In de firewall configuratie die ik onder handen moest nemen, moet je denken aan 300 firewall regels voor de migratie naar 200 firewall regels na de migratie.
Doordat regels nu slimmer te combineren zijn, wordt de hoeveelheid regels drastisch beperkt. Minder regels betekent over het algemeen dat deze beter te lezen zijn en hierdoor wordt de rulebase overzichtelijker. Een overzichtelijke rulebase zorgt vervolgens ervoor dat deze beter begrepen wordt, waarna de beheerders minder fouten zullen maken bij het aanpassen van de rulebase.
De oude opstelling was niet gebouwd om snel en flexibel te kunnen updaten. Omdat het vandaag de dag wenselijk is om snel nieuwe features en configuratiewijzigingen te doen, is er bij het bekijken van een nieuw firewall platform gekeken of dit ook meegenomen kon worden. De beoogde machines waarop dit firewall platform komt te draaien, is een aantal Soekris appliances. Soekrissen bieden de mogelijkheid om een interne SSD (mini PCIe) te gebruiken en/of op te starten via USB-stick. Het gebruik van SSD betekent wel dat de kast open gemaakt moet worden als een nieuwe image of configuratie geplaatst moet worden. De USB-stick is hier de oplossing. Deze kan zonder het openen van de kast geplaatst en verwijderd worden, wat uiteraard de benodigde flexibiliteit oplevert.
Gezien bovenstaande wensen, de mogelijkheden die OpenBSD biedt en de eis om USB-sticks te kunnen gebruiken, is gekozen om flashrd te gebruiken. Flashrd is een applicatie die OpenBSD 5.4 STABLE gebruikt. Flashrd combineert daarnaast een voorbereide configuratie met het besturingssysteem en maakt hiervan een heel kleine USB image (kleiner dan 1GB). Dit maakt het mogelijk om zowel OpenBSD als USB sticks te gebruiken. Deze keuze werd hierdoor eenvoudig; dit was het platform en de applicatie die nodig is om de nieuwe firewalls op te baseren.
Nu de keuze is gemaakt, is het tijd om de werkomgeving op te bouwen. Vandaag de dag leveren hardware leveranciers goed uitgeruste apparaten. Deze zijn vaak voorzien van een grote hoeveelheid opslag en geheugen. Dit gaf mij de mogelijkheid om de werkomgeving geheel virtueel te maken. Ik ben dan ook begonnen met het opzetten van een aantal Virtual Machines (VM’s) op mijn werklaptop, daarnaast had ik de beschikking over de Soekris en een USB-stick.
Virtuele Machines opzetten
Voor het VM gedeelte heb ik gebruik gemaakt van 3 VM’s, een bouwVM (1 CPU, 10GB disk); een testVM (1 CPU, 10GB diskruimte); en een kale VM (1 CPU, 10GB diskruimte en voldoende netwerkkaarten).
De bouwVM is met name bedoeld om door middel van flashrd een aantal images te kunnen produceren en te kunnen testen of dat proces goed werkt. De testVM is om de configuraties te testen los van een installatie eromheen, een standaard OpenBSD installatie vormde de ondergrond (deze VM is optioneel). De laatst gebruikte VM is een kale VM; deze VM heeft dezelfde hoeveelheid netwerkkaarten als de beoogde machines hebben, hierop is vooraf geen installatie opgezet. Dat geeft namelijk een uitgelezen mogelijkheid om met wat trucjes een image te kunnen wegschrijven en daarmee het USB gedeelte te kunnen nabootsen. VMware in de door mij gebruikte setup ondersteunt geen bootable USB-sticks.
Flashrd gaat ervan uit dat je voldoende ruimte hebt om in de /tmp partitie bestanden te kunnen plaatsen. De volgende df output geeft een beeld van hoe dat er dan uit kan zien:
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/wd0a 480M 52.6M 403M 12% /
/dev/wd0k 4.5G 1.1G 3.2G 25% /home
/dev/wd0d 763M 20.0M 705M 3% /tmp
/dev/wd0f 1.3G 429M 794M 35% /usr
/dev/wd0g 743M 192M 514M 27% /usr/X11R6
/dev/wd0h 2.8G 214K 2.6G 0% /usr/local
/dev/wd0j 1.6G 2.0K 1.5G 0% /usr/obj
/dev/wd0i 1.1G 949M 161M 85% /usr/src
/dev/wd0e 1.1G 8.5M 1.0G 1% /var
Dit geeft aan dat maar 705MB beschikbaar is op de /tmp partitie. Ter illustratie, een standaard image is ca 1GB groot. Ik heb ervoor gekozen om gebruik te maken van de /home partitie.
Wat is flashrd?
Zoals eerder al kort beschreven, is flashrd een applicatie die met name geschreven is voor het produceren van images voor embedded systemen. Er is minstens 64MB aan intern geheugen nodig en voor een image circa 1GB diskruimte. Aangeraden wordt om minstens 128MB ram beschikbaar te hebben en als meerdere images geplaatst moeten worden voor upgrades, wordt een 4GB USB-stick aangeraden. De kleine images worden op de USB-stick geschreven en vanaf daar deels via een memory filesystem (mfs) aan het systeem beschikbaar gemaakt. Deze filesystems zijn read-only, zodat het systeem elke keer op dezelfde manier opstart. Mocht het iemand lukken om in te breken op het systeem, dan zal deze niet per definitie wijzigingen kunnen maken. Deze kleine images, tezamen met een voorbereide configuratie, maken het mogelijk om snel geschikte images te maken waarmee apparaten zoals een Soekris gestart kunnen worden.
Flashrd installeren
Als de handleiding van flashrd gevolgd wordt, is te lezen dat men een aantal directories verwacht danwel aanraadt. In de /home partitie heb ik een tmp/ directory aangemaakt. Hieronder zijn vervolgens de beoogde directories aangemaakt. Hierdoor heb je enerzijds de OpenBSD bestanden beschikbaar en anderzijds de flashrd bestanden om de ‘build’ te kunnen doen:
mkdir /home/tmp
mkdir /home/tmp/openbsd
mkdir /home/tmp/flashrd
Download de flashrd software van de website (http://www.nmedia.net/flashrd/flashrd-1.4.tar.gz) en pak deze uit in de flashrd directory:
tar xzpf /home/tmp/flashrd/flashrd-1.4.tar.gz -C /home/tmp/flashrd/
Download daarna een aantal bestanden van een OpenBSD mirror (http://ftp.nluug.nl/pub/OpenBSD/5.4/amd64/), zodat een goede volledige image gebouwd kan worden. Deze worden geplaatst in de /home/tmp/openbsd directory: etc54.tgz, base54.tgz. Optioneel kunnen de volgende bestanden ook gedownload worden, maar deze zijn zeker niet verplicht: man54.tgz, comp54.tgz.
Flashrd maakt naast de gedownloade bestanden ook gebruik van de ‘sourcetree’ van OpenBSD. Dat is de broncode lijst, zoals gebruikt wordt door de ontwikkelaars. Deze sourcetree kan direct worden gedownload vanaf een OpenBSD Mirror:
cd /usr/src && cvs -d anoncvs@openbsd.cs.fau.de:/cvs -q get -rOPENBSD_5_4 src
SSH fingerprints:
(RSA) 2048 d0:f2:0c:a3:bf:28:ba:18:50:5f:04:dc:13:ed:63:42
(DSA) 1024 9f:a1:78:0b:d4:76:68:bf:3e:83:d0:41:c8:1e:33:8b
(ECDSA) 256 f0:d1:64:e6:6b:2f:9e:1e:85:aa:75:e3:a0:52:d3:5a
Vergeet niet om de fingerprints te valideren voordat je hier gebruik van maakt. Als ze overeenkomen, geeft dat een betrouwbaarder beeld van de mirror. Als de fingerprints niet overeenkomen, zoek dan een andere mirror met gepubliceerde bekende fingerprints die wel kloppen.
We kunnen nu met flashrd aan de slag, we maken zoveel mogelijk gebruik van de standaard instellingen. Dat betekent dat straks een image beschikbaar is die circa 1GB groot zal zijn. Dat past dus ruim op de hedendaagse (commerciële) USB-sticks.
Flashrd gebruiken
De syntax om een image te maken via flashrd is heel simpel. Vanuit de directory waar de uitgepakte flashrd bestanden staan doen we het volgende:
./flashrd /home/tmp/openbsd
Flashrd pakt nu de directory waar de openbsd installatie geplaatst is, onder water wordt /usr/src gebruikt voor de kernel. De bestanden die worden gegenereerd, zijn in mijn geval amd64-<datum> en flashimg.amd64-<datum>. Het laatste bestand is het bestand welke gebruikt wordt om te schrijven naar USB-stick. Let wel op dat als je meerdere images op dezelfde dag maakt, deze de voorgaande overschrijft. Maak van elke goede image die je wilt bewaren een reserve kopie om te voorkomen dat je deze kwijt raakt!
Verder lezen
zie: http://www.unix.nl/artikelen/free-of-open/
Dit artikel heeft eerder gestaan in Linuxmagazine 2014 nr 3 p 46.