Apprendre à construire un pare-feu DynFi à partir de zero

Construction de DynFi Firewall

DynFi Firewall est un pare-feu moderne basé sur FreeBSD. Le logiciel est entièrement open source, mais avoir un système entièrement open source n’est pas suffisant de nos jours. Il y a presque 40 ans, Ken Thompson dans son article “Reflections on trusting trust” nous a montré qu’il ne faut pas faire confiance aux logiciels qui ne peuvent pas être construits et vérifiés par la communauté.

En suivant son idée, nous aimerions vous montrer comment compiler DynFi Firewall étape par étape. Il s’agit exactement du même processus que celui utilisé lors de la publication du logiciel.

Vue d’ensemble

DynFi Firewall utilise les mécanismes standards de construction de FreeBSD. Ce qui est innovant cependant, c’est qu’il utilise également une base de paquetage qui n’est pas encore très populaire. Dans le cas des ports, le pare-feu utilise poudrière avec un overlay pour la construction.

Les superpositions (overlay) sont également une nouvelle technique qui permet de fusionner plusieurs arbres de ports en un seul.
Grâce à ces techniques, nous sommes en mesure de garder toutes nos modifications dans des dépôts séparés et de les fusionner facilement avec les prochaines branches trimestrielles des ports.

Prérequis

Avant de commencer, le pré-requis est d’installer quelques outils requis par le système de construction.
Le premier est poudriere. Au moment de l’écriture de cet article, les overlays ne sont pas encore dans la version de poudriere disponible sous FreeBSD.
Le moyen le plus simple est donc de récupérer la branche principale de poudriere et de l’installer depuis le dépôt officiel.

De plus, nous devons également installer jq(1) qui est un processeur JSON en ligne de commande.

# pkg install jq

Les scripts de construction sont préparés pour construire tout ce qui se trouve dans le répertoire de l’utilisateur. Cependant, il y a certains outils, comme poudriere, qui nécessitent les privilèges root.
Il est donc nécessaire que l’utilisateur en charge de l’installation / compilation ait un accès root via sudo(8).

Dupliquer les répertoires

Le pare-feu est construit à partir de quelques dépôts, tout le code source est hébergé publiquement sur GitHub.

Le projet est divisé avec les dépôts suivants :

  • FreeBSD-base - c’est un dépôt FreeBSD avec les modifications personnalisées utilisées par le pare-feu.
  • dynfi-overlay - il s’agit d’une superposition de ports, ce dépôt contient tous les ports supplémentaires ou modifiés requis par le pare-feu.
  • dynfi-build - c’est un ensemble de scripts de construction utilisés pour construire un pare-feu DynFi.

Nous allons commencer par récupérer le dynfi-builder. $ git clone https://github.com/DynFi/dynfi-build

La variable FBSD_TREE dans common.subr nous permet d’indiquer où se trouve le repo de la base FreeBSD. Par défaut, l’emplacement est dans le répertoire dynfi-build.

Clonons ce répertoire :

$ cd dynfi-build
$ git clone https://github.com/DynFi/FreeBSD-base freebsd

Poudrière

Le système de construction est préparé pour fonctionner dans des environnements multi-utilisateurs, ou des instances multi-poudrières.
Pour cette raison, tous les fichiers poudrière sont conservés dans un répertoire utilisateur privé. Pour configurer toutes les variables d’environnement nécessaires à poudriere, nous avons préparé un script poudriere.sh. Ce script est une enveloppe pour une instance de poudrière par défaut avec tous les paramètres nécessaires pour construire un projet dans un répertoire personnel.

Tout d’abord, nous devons choisir une branche de ports FreeBSD que nous voulons utiliser. Actuellement DynFi Firewall est construit sur la branche 2021Q2. Nous utilisons simplement poudriere.sh pour récupérer cette branche.

$ 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
$

La commande ci-dessus récupérera la branche des ports 2021Q2 dans poudriere sous le nom de ports 2021Q2.

La prochaine étape est de créer un port avec le dynfi-overlay. Nous pouvons utiliser la même technique que dans l’exemple précédent. Dans ce cas, nous allons juste dire à poudriere de ne pas utiliser le dépôt officiel mais celui hébergé sur GitHub.
Le nom des ports utilisés par le système de construction est dynfi-overlay, cela peut être changé dans le fichier common.subr sous la variable OVERLAY_PORTS.

$ 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
$ 

Signature

Le pare-feu DynFi utilise des paquets signés. Pour cette raison, lorsque vous construisez un système, vous devez également créer vos propres signatures. Malheureusement, cela pose actuellement problème car les paquets auront des signatures différentes de celles que vous verrez dans les dépôts officiels - nous allons travailler à la fourniture d’un moyen plus robuste de vérifier cela.

Les clés de signature doivent être placées dans le répertoire keys.
Pour créer une clé de signature, vous pouvez suivre une méthode décrite dans la page de manuel pkg-repo(8) qui est :

$ openssl genrsa -out pkg-dff.key 2048
$ chmod 0400 pkg-dff.key
$ openssl rsa -in pkg-dff.key -out pkg-dff.pub -pubout

Cette étape est toujours nécessaire mais si vous voulez utiliser le dépôt officiel de DynFi, vous n’avez rien à modifier.
Si vous voulez configurer notre propre dépôt pkg, vous devez modifier le fichier usr.sbin/pkg/DynFi-base.conf pour pointer vers notre serveur de ports et télécharger la signature dans le répertoire share/DynFi/keys/pkg/trusted.
Le fichier et le répertoire sont dans le repo freebsd.

Construction

Lorsque nous avons récupéré tous les dépôts et que nous avons les clés de signature, nous pouvons commencer à construire le Firewall. Tout d’abord, nous pouvons commencer construire le monde / build world (jolie terminologie de FreeBSD) et un noyau DynFi Firewall.

Pour ce faire, nous pouvons simplement utiliser un script build_base.sh :

$ sh build_base.sh 
Building world and kernel
[...]

Après cette première étape, nous sommes prêts à construire les ports nécessaires.
Cela peut être fait par build_packages.sh. Cela construira à la fois les paquets requis pour l’image d’installation et les paquets requis pour l’installateur.

Dans les fonctionnalités à venir, nous pourrions également essayer de séparer ces deux éléments.
Nous fournissons l’option -c au script pour indiquer que c’est une construction propre et que tout doit être reconstruit.

Pour le prochain build, nous pouvons ignorer cette option afin d’accélérer le processus.

$ 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...
[...]

Enfin, nous pouvons construire un installateur avec un simple script build_installer.sh. Les nouveaux installateurs avec le support vga et serial seront construits dans le répertoire image.

$ 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 

Lorsque cette étape est terminée, nous pouvons utiliser les nouvelles images iso pour installer le pare-feu DynFi.

Si nous avons configuré le serveur de ports, nous pouvons les télécharger en utilisant le script build_sync.sh. Ce script va tout télécharger sur le serveur de ports.
N’oubliez pas d’ajuster le serveur IP dans le fichier common.subr sous la variable PUBLIC_SRV.

Conclusion

DynFi Firewall est un pare-feu moderne avec un mécanisme de construction simple. Le mécanisme utilise des méthodes uniques comme les overlays ou les bases de paquets.
En plus de l’utilisation de ces mécanismes uniques, le processus entier est enveloppé dans un couple de scripts simples à comprendre.

Si vous aimez cet article, essayez d’acheter vos appareils dans notre e-shop ;-) Cela permettra au projet de se développer en douceur et de vous fournir des fonctionnalités plus pointues.

Notre générateur de fichiers aléatoire en shell
 
Interview Demain la Tech Grégory BERNARD - DynFi
Besoin d’experts pour votre cybersécurité réseau ?

Découvrez nos services infogérés

Articles reliés