Klik hier voor informatie over de wijziging in de levering van diensten en ondersteuning.

Mijn eerste kennismaking met pfctl op OpenBSD

Reeds jaren werk ik met Linux, zowel op laptops en desktops als servers. Sinds kort ben ik FreeBSD en OpenBSD aan het verkennen. Zo draai ik FreeBSD op een HP Envy-laptop en OpenBSD op een HP Mini-PC.

Omdat ik OpenBSD wil inzetten als server, wil ik goed begrijpen hoe de onderliggende systemen werken. De firewall speelt daarbij een centrale rol — het is immers essentieel om je systeem afdoende te beveiligen.

Installatie en partitie-indeling

Tijdens de installatie viel mij het partitioneerprogramma van OpenBSD op. Na wat experimenteren koos ik voor een eenvoudige indeling: een swap-partitie en één grote rootpartitie (/). Hoewel dit niet de gebruikelijke aanpak is, volstaat het voor mijn doeleinden. Voor productieomgevingen is het echter vaak verstandiger om bepaalde directories op aparte partities te plaatsen, om risico’s te beperken zoals het vollopen van / door logbestanden of gebruikersdata.

Onderstaand overzicht laat zien waarom het (eigenlijk) verstandiger is om bepaalde locaties op afzonderlijke partities te plaatsen.

Partitie Functie Standaardgebruik Waarom apart zetten?
/ Het rootbestandssysteem, bevat het besturingssysteem en de meeste programma's en configuraties. Bevat standaard alles als je geen aparte partities gebruikt. N.v.t.; root is altijd nodig, maar je voorkomt risico’s door bepaalde directories uit te splitsen.
swap Virtueel geheugen bij RAM-tekort. Bijna altijd aanwezig op systemen. Geen partitie nodig, maar logisch gescheiden vanwege geheugengebruik.
/home Gebruikt voor persoonlijke bestanden van gebruikers. Vaak standaard op desktop-systemen. Voorkomt dat gebruikersbestanden het hele systeem laten vollopen.
/var Bevat variabele bestanden, zoals logs, mail, en spool-gegevens. Standaard op servers en werkstations. Logbestanden kunnen snel groeien en zo / vullen — apart zetten voorkomt dit.
/tmp Tijdelijke opslag van applicaties. Wordt vaak leeggemaakt bij reboot. Vaak aparte partitie of als tmpfs. Beperkt het risico dat tijdelijke bestanden de root vullen of dat onbetrouwbare data blijft staan.

Eerste stappen

Tijdens de installatie kreeg ik de vraag of ik SSH-verbindingen wilde toestaan — logisch voor een server, dus dat stond ik toe. OpenBSD draait standaard met een actieve firewall: PF (Packet Filter), beheerd via het commando pfctl.

Werken met doas

Eén van mijn eerste acties was het instellen van doas, het OpenBSD-alternatief voor sudo:

echo "permit persist main as root" >> /etc/doas.conf

Hiermee kan gebruiker main systeembeheertaken uitvoeren. Een root-shell starten doe je eenvoudig met doas -s.

Poorten controleren

Waar ik onder Linux vaak netstat -antu of netstat -tulpn (of beter: ss -tulpn) gebruik, werkt dat op OpenBSD niet. Alternatieven zijn:

netstat -an | grep LISTEN
fstat | grep internet

Firewallregels bekijken

Met pfctl -sr krijg je de actieve firewallregels te zien:

pfctl -sr

De uitvoer verbaasde mij:

block return all
pass all flags S/SA
block return in on ! lo0 proto tcp from any to any port 6000:6010
block return out log proto tcp all user = 55
block return out log proto udp all user = 55

SSH werkte dus blijkbaar, ondanks de ogenschijnlijk strenge regels. Wat blijkt: met pass all flags S/SA staat het systeem bepaalde verbindingen toe (zoals SSH), omdat deze gebruik maken van de juiste TCP-vlaggen. De regel is krachtig en laat enkel verbindingen toe die voldoen aan geldige connectie-opbouw, wat juist veiliger is dan zomaar pass in toestaan.

Voor de volledigheid: S/SA verwijst naar de TCP-vlaggen SYN (S) en SYN+ACK (SA), die respectievelijk het begin en de bevestiging vormen van een geldige TCP-handshake.

De regels blokkeren verder uitgaand verkeer van gebruiker 55... maar wie of wat is gebruiker 55?

Het commando:

grep ':55:' /etc/passwd

leverde op:

_pbuild:*:55:55:dpb build user:/nonexistent:/sbin/nologin

Deze gebruiker wordt gebruikt voor het bouwen van ports. Door zijn netwerktoegang te beperken, voorkom je dat er tijdens het bouwen van software verbindingen gelegd worden met onbetrouwbare servers.

Wat is pfctl?

Zoals genoemd is pfctl het beheercommando voor de PF-firewall. Hier een handig overzicht van veelgebruikte opties:

Commando Betekenis
pfctl -sr Toon de actieve firewallregels
pfctl -si Toon firewallstatistieken
pfctl -sa Toon alle instellingen en tabellen
pfctl -nf /etc/pf.conf Check de syntax van je pf.conf
pfctl -f /etc/pf.conf Herlaad de configuratie
pfctl -e Schakel PF in (enable)
pfctl -d Schakel PF uit (disable)

Conclusie

Mijn eerste ervaring met PF en pfctl op OpenBSD was verhelderend. OpenBSD hanteert een "default-deny"-aanpak: blokkeer alles, en sta alleen het noodzakelijke toe. Dit zet je aan tot bewuste keuzes in systeembeveiliging.

Waar je in Linux vaak met een open configuratie begint, draait OpenBSD het om: alles is dicht, tenzij expliciet toegestaan. Het resultaat is een minimalistische maar krachtige benadering van netwerkbeveiliging.

Vergelijking tussen pf en iptables (nftables)

Regel (OpenBSD PF) Wat gebeurt er? Veiligheidsniveau Equivalent in Linux (iptables)
pass all flags S/SA Staat alleen verbindingen met SYN/ACK flags toe, wat een geldige TCP-handshake betekent. Hoger: Alleen legitieme verbindingen worden toegestaan. -A INPUT -p tcp --syn -m state --state NEW -j ACCEPT
pass in Staat alle inkomende verbindingen toe zonder enige controle. Laag: Alle verkeer wordt geaccepteerd, inclusief ongewenste verbindingen. -A INPUT -j ACCEPT
block return all Blokkeert alle verbindingen, met uitzondering van de expliciet toegestane regels. Zeer hoog: De standaard is blokkeren, wat betekent dat alleen benodigde verbindingen worden toegestaan. -A INPUT -j DROP

Hoewel iptables (tegenwoordig nftables) meer uitgebreide functionaliteit en modules biedt, dwingt PF met zijn eenvoudige en duidelijke syntaxis tot doordachte keuzes. Het is daarmee een krachtig hulpmiddel voor wie streeft naar een minimalistische, maar effectieve beveiliging.

Previous Post