DynFi Firewall aufbauen
DynFi Firewall ist eine moderne Firewall, die auf FreeBSD basiert. Die Software ist vollständig quelloffen, aber ein vollständig quelloffenes System zu haben, reicht heutzutage nicht mehr aus. Vor fast 40 Jahren hat Ken Thompson in seinem Artikel “Reflections on trusting trust” gezeigt, dass man Software, die nicht von der Gemeinschaft entwickelt und verifiziert werden kann, nicht trauen sollte. In Anlehnung an seine Idee möchten wir zeigen, wie man die DynFi Firewall Schritt für Schritt baut. Dies ist genau derselbe Prozess, der auch bei der Veröffentlichung der Software verwendet wird.
Überblick
Die DynFi Firewall nutzt die Standard FreeBSD Build-Mechanismen. Innovativ ist jedoch, dass sie auch eine Paketbasis verwendet, die noch nicht so verbreitet ist. Im Falle der Ports verwendet die Firewall poudriere mit einem Overlay zum Bauen. Overlays sind ebenfalls eine neue Technik, die es erlaubt, mehrere Ports-Bäume zu einem einzigen zusammenzufassen.
Dank dieser Techniken sind wir in der Lage, alle unsere Änderungen in separaten Repositories zu halten und sie einfach mit den nächsten vierteljährlichen Ports-Zweigen zusammenzuführen.
##Voraussetzung
Bevor wir beginnen, müssen wir ein paar Werkzeuge installieren, die das Build-System benötigt.
Das erste ist poudriere. Zum Zeitpunkt des Schreibens dieses Artikels sind die Overlays noch nicht in der für FreeBSD verfügbaren Version von poudriere enthalten. Aus diesem Grund ist es am einfachsten, den Hauptzweig von poudriere*** zu holen und ihn aus dem offiziellen Repository zu installieren*** - https://github.com/freebsd/poudriere.
Außerdem müssen wir auch jq(1) installieren, einen JSON-Prozessor für die Kommandozeile.
# pkg install jq
Die Build-Skripte sind darauf vorbereitet, alles im Benutzerverzeichnis zu bauen. Allerdings gibt es einige Werkzeuge, wie poudriere, die Root-Rechte erfordern.
Aus diesem Grund verlangen wir auch, dass der Benutzer über sudo(8) Root-Rechte hat.
Klonen von Repos
Die Firewall wird aus Paaren von Repositories gebaut. Der gesamte Quellcode ist [öffentlich auf GitHub gehostet] (https://github.com/DynFi/).
Das Projekt ist in folgende Repositories aufgeteilt:
- FreeBSD-base - das ist ein FreeBSD-Repository mit den von der Firewall verwendeten Änderungen
- dynfi-overlay - es ist ein Ports-Overlay, dieses Repository enthält alle zusätzlichen oder geänderten Ports, die von der Firewall benötigt werden
- dynfi-build - ein Satz von Skripten, die zur Erstellung einer DynFi-Firewall verwendet werden
Wir beginnen damit, den dynfi-builder zu holen.
$ git clone https://github.com/DynFi/dynfi-build
Mit der Variable FBSD_TREE in common.subr können wir angeben, wo sich das FreeBSD-Basis-Repository befindet. Standardmäßig befindet es sich im Verzeichnis dynfi-build. Ziehen wir es in dieses Verzeichnis.
$ cd dynfi-build
$ git clone https://github.com/DynFi/FreeBSD-base freebsd
Poudriere
Das Build-System ist darauf vorbereitet, in Multi-User-Umgebungen oder Multi-Poudriere-Instanzen zu arbeiten.
Aus diesem Grund werden alle Poudriere-Dateien in privaten Benutzerverzeichnissen aufbewahrt. Um alle notwendigen Umgebungsvariablen für poudriere einzurichten, haben wir ein poudriere.sh
-Skript vorbereitet. Dieses Skript ist ein Wrapper für eine Standard-Poudriere-Instanz mit allen Einstellungen, die für die Erstellung eines Projekts im Home-Verzeichnis erforderlich sind.
Zuerst müssen wir einen FreeBSD-Ports-Zweig auswählen, den wir verwenden wollen.
Derzeit wird DynFi Firewall auf Basis des 2021Q2 branch erstellt. Wir benutzen einfach poudriere.sh
, um diesen Zweig zu holen.
$ sh poudriere.sh ports -c -p 2021Q2 -B 2021Q2
[00:00:00] Creating 2021Q2 fs at /usr/home/buildtest/dynfi-build/poudriere-base/ports/2021Q2... done
[00:00:00] Cloning the ports tree... done
$
Der obige Befehl holt den 2021Q2 Ports-Zweig nach poudriere unter dem Ports-Namen 2021Q2.
Der nächste Schritt ist, einen Port mit dem dynfi-overlay
zu erstellen. Wir können die gleiche Technik wie im vorherigen Beispiel verwenden.
In diesem Fall werden wir poudriere nur sagen, dass es nicht das offizielle Repository verwenden soll, sondern das auf GitHub gehostete.
Der Ports-Name, der vom Build-System verwendet wird, ist dynfi-overlay
, dies kann in der Datei common.subr unter der Variable OVERLAY_PORTS
geändert werden.
$ sh poudriere.sh ports -c -p dynfi-overlay -m git+https -U ‘https://github.com/DynFi/dynfi-overlay‘
[00:00:00] Creating dynfi-overlay fs at https://github.com/DynFi/dynfi-overlay... done
[00:00:00] Cloning the ports tree... done
$
Signierung
Die DynFi Firewall verwendet signierte Pakete. Aus diesem Grund müssen Sie bei der Erstellung eines Systems auch Signaturen erstellen. Unglücklicherweise unterbricht dies einen reproduzierbaren Mechanismus, da die Pakete andere Signaturen haben werden, als die, die man in den offiziellen Repositories sieht - wir werden daran arbeiten, einen robusteren Weg zu finden, dies zu verifizieren.
Die Signierschlüssel sollten im Verzeichnis keys abgelegt werden.
Um einen Signierschlüssel zu erstellen, können Sie einer Methode folgen, die in der pkg-repo(8) man page beschrieben ist:
$ openssl genrsa -out pkg-dff.key 2048
$ chmod 0400 pkg-dff.key
$ openssl rsa -in pkg-dff.key -out pkg-dff.pub -pubout
Dieser Schritt ist immer erforderlich, aber wenn Sie das offizielle DynFi-Repository verwenden möchten, müssen Sie nichts mehr ändern.
Wenn Sie unser eigenes pkg-Repository konfigurieren möchten, müssen Sie die Datei usr.sbin/pkg/DynFi-base.conf
so ändern, dass sie auf unseren Ports-Server zeigt und die Signatur in das Verzeichnis share/DynFi/keys/pkg/trusted
hochladen.
Die Datei und das Verzeichnis befinden sich im freebsd repo.
Bauen
Wenn wir alle Repositories geholt haben und die Signierschlüssel haben, können wir mit dem Bau der Firewall beginnen.
Zuerst können wir damit beginnen, eine DynFi World und einen Kernel zu bauen. Wir können einfach ein build_base.sh
Skript verwenden.
$ sh build_base.sh
Building world and kernel
[...]
Nach diesem ersten Schritt sind wir bereit, die benötigten Ports zu bauen.
Dies kann mit build_packages.sh
gemacht werden. Dies wird sowohl die Pakete erstellen, die für das Installations-Image benötigt werden, als auch die Pakete, die für den Installer benötigt werden.
In zukünftigen Features können wir auch versuchen, diese beiden zu trennen. Wir geben dem Skript die Option -c mit, um anzugeben, dass dies ein sauberer Build ist und alles neu erstellt werden soll.
Für den nächsten Build können wir diese Option weglassen, um den Prozess zu beschleunigen.
$ sh build_packages.sh -c
Building the poudriere jail
[00:00:00] Error: No such jail: dynfi-13-stable
[00:00:00] Creating dynfi-13-stable fs at /usr/home/buildtest/dynfi-build/poudriere-base/jails/dynfi-13-stable... done
[00:00:00] Checking out the sources with git+http...
[...]
Schließlich können wir einen Installer mit einem einfachen Skript build_installer.sh
erstellen. Neue Installer mit vga- und serial-Unterstützung werden im image-Verzeichnis erstellt.
$ sh build_installer.sh
[.../usr/home/buildtest/dynfi-build/image/dynfi_installer_serial_0.99.021-20211031-222857.iso: 1.519:1, 5.265 bits/byte, 34.19% saved, 672233472 in, 442410256 out.]
[...] /usr/home/buildtest/dynfi-build/image/dynfi_installer_vga_0.99.021-20211031-222857.iso: 1.519:1, 5.265 bits/byte, 34.19% saved, 672233472 in, 442410256 out.
Wenn dieser Schritt abgeschlossen ist, können wir die neuen iso-Images verwenden, um die DynFi-Firewall zu installieren.
Wenn wir die Ports-Server eingerichtet haben, können wir sie mit dem Skript build_sync.sh
hochladen. Dieses Skript wird alles auf den Ports-Server hochladen.
Denken Sie nur daran, den IP-Server in der Datei common.subr unter der Variable PUBLIC_SRV
anzupassen.
Schlussfolgerung
DynFi Firewall ist eine moderne Firewall mit einem einfachen Aufbaumechanismus. Der Mechanismus verwendet einzigartige Methoden wie Overlays oder Paketbasen.
Neben der Verwendung dieser einzigartigen Mechanismen ist der gesamte Prozess in ein paar einfach zu verstehende Skripte verpackt.
Wenn Ihnen dieser Artikel gefällt, versuchen Sie bitte, Ihre Geräte in unserem e-shop zu kaufen ;-) Dies wird es dem Projekt ermöglichen, reibungslos zu wachsen und Ihnen weitere innovative Funktionen zu bieten.