Warum wir FreeBSD nutzen


Ich werde öfter gefragt, warum wir so gerne FreeBSD einsetzen. Manchmal erwische ich mich dabei, sehr ausschweifend und theoretisch zu antworten. Da dies nicht immer der verständlichste Weg ist, hier einmal ein Beispiel aus der Praxis.

Es sollte eine Single-Sign-On (SSO) Lösung für diverse Applikationen erstellt werden. Als Komponenten werden eingesetzt:

  • Keycloak
  • PostgreSQL für Keycloak
  • OAuth2-Proxy für Anwendungen, die kein OAuth2 / OIDC unterstützen.
  • Eine eigene Web-Anwendung, die eine Übersicht aller angebotenen Applikationen liefert (Spring Boot, Java).
  • nginx als Reverse-Proxy

Fünf unterschiedliche Dienste. In unserem Setup wird jeder Dienst in einer Jail betrieben. Die Jails werden mit BastilleBSD betrieben, einem sehr leichtgwichtigen Jail Manager. Genutzt werden sogenannte Thin Jails: Sie nutzen ein gemeinsames Basissystem, sodass eine typische Installation nur den Speicherplatz für die installierten Pakete (keycloak, postgres etc.) verbraucht:

❯ sudo bastille create -V oauth2-proxy-1 14.2-RELEASE 10.20.30.1/24
❯ sudo pkg -j oauth2-proxy-1 install oauth2-proxy
❯ zfs list zroot/bastille/jails/oauth2-proxy-1/root
NAME                                       USED  AVAIL  REFER  MOUNTPOINT
zroot/bastille/jails/oauth2-proxy-1/root   248M  7.01G   248M  /srv/jails/oauth2-proxy-1/root

Schlank, oder?

Diese Lösung ist möglich, da es bei FreeBSD eine klare Trennung zwischen Basis-System und den zusätzlich installierten Paketen gibt.

Von jeder Jail werden regelmäßig Snapshots erstellt. Diese sind dank ZFS blitzschnell erstellt und kosten kaum Speicherplatz. Die Erstellung und Verwaltung geschieht über ZFS autobackup mit der Grundregel 1h1d,1d1w.

Die Snapshots führen zu einer äußerst entspannten Administration: Wenn z.B. bei einer Aktualisierung einer Jail ein Fehler auftritt, kann sehr schnell gehandelt werden:

do-something-stupid
❯ sudo do-something-stupid
❯ zfs list -t snapshot zroot/bastille/jails/oauth2-proxy-1/root
...
❯ sudo bastille stop oauth2-proxy-1
❯ sudo zfs rollback -r zroot/bastille/jails/oauth2-proxy-1/root@localsnap-20250402070000
❯ sudo bastille start oauth2-proxy-1

Neben sehr schlank und angenehmer Konfiguration haben die Jails noch weitere Vorteile:

  • Sie können einfach kopiert werden. Zum Beispiel werden in diesem Projekt mehrere Instanzen von OAuth2-Proxy benötigt. Diese werden einfach über
    sudo bastille clone --live oauth2-proxy-1 oauth2-proxy-2 10.20.30.2
    erstellt.
  • Die Prozesse sind sauber von einander getrennt. Ein Angreifer in einer Jail hat weder Zugriff auf den Host noch auf andere Jails.

In der Grundkonfiguration sind keine Dienst nach außen offen, alle binden sich auf ihre lokale Adresse:

❯ sockstat -4 -l | grep oauth2-pro
www      oauth2-pro  9590 7   tcp4   10.20.30.1:4180     *:*
...

Um nginx mit der Außenwelt in Verbindung zu bringen, reicht ein einfaches

❯ sudo bastille rdr nginx tcp 443 443

nginx selbst arbeitet als Reverse Proxy und leitet die Anfragen an die gewünschten Applikationen oder Jails weiter.

Gerne beschreibe ich bei Interesse mehr Details.