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.