
Linux-Kernelmodul, das eine konfigurationsfreie, OTP-basierte Firewall für IoT-Geräte implementiert. Authentifiziert Netzwerkverkehr transparent mit einem vorher geteilten Schlüssel und verwirft unbefugte Pakete auf Protokollebene.
Zero-Config (IoT) Firewall.
SYNwall ist ein Projekt, das (vorerst) als Linux-Kernel-Modul entwickelt wurde, um eine transparente und konfigurations- und wartungsfreie Firewall zu implementieren.
Vielleicht möchten Sie sich den für ein Beispiel zur Nutzung ansehen.
Normalerweise sind IoT-Geräte außerhalb einer zentralen Kontrolle, mit leistungsschwacher Hardware, schwierigen Umgebungsbedingungen und... wir haben keine Zeit, um der Sicherheit zu widmen. Vielleicht können wir unsere IoT-Infrastruktur nicht patchen und es wird sehr schwierig sein, eine „firewall-ähnliche“ Zugriffskontrolle aufrechtzuerhalten.
Die Idee ist, einen dezentralen Einweg-Einmalpasswort-Code zu erstellen, um den NETZWERKzugriff auf das Gerät zu ermöglichen. Der gesamte Datenverkehr, der das OTP nicht enthält, wird verworfen. Es sind keine Vorkenntnisse darüber erforderlich, wer Zugriff benötigt, wir benötigen nur einen vorab geteilten Schlüssel (Pre-Shared Key) zum Bereitstellen. Der Schutz wird für die Anwendungsebene völlig transparent sein, da er auf der Netzwerkprotokollebene (TCP und UDP) implementiert ist.
Dieses Repository enthält das Linux-Kernel-Modul. Es wurde mit den Versionen 3.x, 4.x und 5.x auf den Architekturen X86_64, ARM, MIPS und AARCH64 getestet.
Es erfordert die aktuellen Kernel-Header für die Kompilierung, die normalerweise mit dem entsprechenden Paketmanager installiert werden können. Zum Beispiel auf Debian-ähnlichen Distributionen:
sudo apt-get install linux-headers-$(uname -r)
Dann sollte es ausreichen, die Kompilierung durchzuführen:
make
Das Modul kann auf die übliche Weise mit insmod oder modprobe geladen werden.
Es hat mehrere Parameter, mit denen Sie das Verhalten anpassen können:
Vorab geteilter Schlüssel (Pre-Shared Key) für das Einmalpasswort
psk:
Der PSK muss eine Byte-Sequenz von 32 bis 1024 sein. Er wird Teil des OTP sein, daher beeinflusst seine Länge die Größe des in das Paket eingefügten OTP. Ohne diesen Parameter wird das Modul nicht geladen.
UDP aktivieren
enable_udp: 0
Aktivieren/Deaktivieren des OTP für das UDP-Protokoll. Standardmäßig ist es deaktiviert. Setzen Sie es auf 1, um es zu aktivieren. Das OTP über UDP erfordert, dass das Modul auf beiden kommunizierenden Geräten aktiv ist, da das OTP (vom Modul) entfernt werden muss, bevor das Paket an die Anwendungsebene weitergeleitet wird. Wenn dies nicht der Fall ist, können Sie seltsame Verhaltensweisen erleben. Die UDP-Verbindungsverfolgung basiert auf dem conntrack-Modul, daher müssen Sie es möglicherweise einfügen, um diese Funktionalität zu nutzen (dies hängt von der Installation ab). Ein Fehler wird im Kernellog angezeigt, wenn dies der Fall ist.
HINWEIS: Standardmäßig sind die Ports 53 (DNS) und 123 (NTP) für ausgehende Verbindungen auf die schwarze Liste gesetzt, sodass das OTP nicht hinzugefügt wird. Wenn Sie dies ändern müssen, suchen Sie nach dem Array udp_blacklist[]. Ich werde in Zukunft einen Parameter dafür hinzufügen.
Zeitgenauigkeitsparameter
precision: 10
Das OTP wird auch mit der aktuellen Gerätezeit berechnet. Da das Datum auf den beteiligten Geräten unterschiedlich sein kann, können Sie die Zeit auf einen bestimmten Wert 'runden', um Zeitabweichungen zu ermöglichen. Standard ist 10.
Die Genauigkeit wird in Zweierpotenzen angegeben (Sie mögen sich fragen, warum... es war eine Entscheidung zur Leistungssteigerung und zur geringen Auswirkung auf Geräte mit niedriger Leistung):
...
9 -> 1 Sekunde
10 -> 8 Sekunden
...
Eine Genauigkeit unter 8 wird wahrscheinlich nicht funktionieren.
Wenn Sie den Genauigkeitswert auf 11 oder mehr erhöhen, sollten Sie auch den Wert MAX_TRASH in SYNgate_netfilter.c erhöhen.
WARNUNG: Dies wird den gesamten Datenverkehr zu Ihrem Gerät verwerfen, also stellen Sie sicher, dass Sie wissen, wie Sie mit einem anderen SYNwall-Gerät darauf zugreifen oder es remote deaktivieren können (Port-Knocking).
sudo insmod SYNwall.ko psk=123456789012345678901234567890123 precision=10 portk=12,13,14,15,16 load_delay=5000 enable_udp=1
SYNwall Repository:
SYNwall_distrib Repository:
SYNwall_ATAES132 Repository:
SYNwall_docs Repository:
Alles wurde für den Einsatz auf Geräten mit geringer Leistung und sehr geringen Ressourcen implementiert. Die Wahl des Quark-Hashings für den Krypto-Hash wurde aus diesem Grund getroffen. Der durch die OTP-Berechnung hinzugefügte Overhead ist im normalen Gebrauch nahezu unsichtbar:

während Sie eine deutliche CPU-Ersparnis sehen können, wenn viel Datenverkehr an das Gerät gesendet wird:

Als Begleitwerkzeug enthält das Repository auch das SYNgate-Modul. SYNgate wurde mit der gleichen Logik wie das Basismodul SYNwall entwickelt, arbeitet jedoch für mehrere Netzwerke und PSKs. Sie können mehrere Netzwerke (mit den zugehörigen PSKs und anderen Optionen) definieren. Die Idee ist, es auf einem SOCKS-Server zu installieren, um es für verschiedene Protokolle und Ziele nutzen zu können. Das SYNwall_VM Repository enthält Skripte zum Aufbau eines solchen Systems mit einem SOCKS-Server und dem vorinstallierten Modul.
SYNgate arbeitet nur mit ausgehendem Datenverkehr.
Um das SYNgate-Modul zu kompilieren, verwenden Sie einfach:
make SYNGATE=1
Das Modul kann auf die übliche Weise mit insmod oder modprobe geladen werden.
Es hat mehrere Parameter, mit denen Sie das Verhalten anpassen können. Es ist der SYNwall-Konfiguration sehr ähnlich, aber mit einer anderen Logik: Parameter sind (kommagetrennte) Listen von Werten und alle müssen angegeben werden. Der erste Wert einer Liste entspricht dem ersten der anderen. Nicht alle Parameter sind verfügbar, nur diejenigen, die sinnvoll sind (denken Sie daran, dass SYNgate eingehenden Datenverkehr nicht beeinflusst):
Es hat nur einen Parameter, der sich von der SYNwall-Konfiguration unterscheidet, die dstnet_list
Zielnetzwerk
dstnet_list: ip1/mask1[,ip2/mask2]...
Liste von Netzwerken im IP/MASK-Format. Beispiel: 192.168.1.0/24. Wenn eine IP angegeben wird (anstelle einer Netzwerkadresse), wird das Netzwerk berechnet. Alle IPs, die zu diesem Netzwerk gehören, erhalten die in den anderen Listen angegebenen Verbindungsparameter (PSK, Genauigkeit usw.) am gleichen Array-Index.
Vorab geteilter Schlüssel (Pre-Shared Key) für das Einmalpasswort
psk_list: pks1[,pks2]...
Der PSK muss eine Byte-Sequenz von 32 bis 1024 sein. Er wird Teil des OTP sein, daher beeinflusst seine Länge die Größe des in das Paket eingefügten OTP. Ohne diesen Parameter wird das Modul nicht geladen.
UDP aktivieren
enable_udp_list: {0|1}[,{0|1}]...
Aktivieren/Deaktivieren des OTP für das UDP-Protokoll. Setzen Sie 0, um es zu deaktivieren oder 1, um es zu aktivieren. Das OTP über UDP erfordert, dass das Modul auf beiden kommunizierenden Geräten aktiv ist, da das OTP (vom Modul) entfernt werden muss, bevor das Paket an die Anwendungsebene weitergeleitet wird. Wenn dies nicht der Fall ist, können Sie seltsame Verhaltensweisen erleben. Die UDP-Verbindungsverfolgung basiert auf dem conntrack-Modul, daher müssen Sie es möglicherweise einfügen, um diese Funktionalität zu nutzen (dies hängt von der Installation ab). Ein Fehler wird im Kernellog angezeigt, wenn dies der Fall ist.
HINWEIS: Standardmäßig sind die Ports 53 (DNS) und 123 (NTP) für ausgehende Verbindungen auf die schwarze Liste gesetzt, sodass das OTP nicht hinzugefügt wird. Wenn Sie dies ändern müssen, suchen Sie nach dem Array udp_blacklist[]. Ich werde in Zukunft einen Parameter dafür hinzufügen.
Zeitgenauigkeitsparameter
precision_list: {9|10|...}[,{9|10|...}]...
Das OTP wird auch mit der aktuellen Gerätezeit berechnet. Da das Datum auf den beteiligten Geräten unterschiedlich sein kann, können Sie die Zeit auf einen bestimmten Wert 'runden', um Zeitabweichungen zu ermöglichen.
Die Genauigkeit wird in Zweierpotenzen angegeben (Sie mögen sich fragen, warum... es war eine Entscheidung zur Leistungssteigerung und zur geringen Auswirkung auf Geräte mit niedriger Leistung):
...
9 -> 1 Sekunde
10 -> 8 Sekunden
...
IP-Spoofing-Schutz aktivieren
enable_antispoof_list: {0|1}[,{0|1}]...
Sie können ganz einfach cross-kompilieren, indem Sie die folgenden Variablen setzen, bevor Sie make ausführen:
ARCH (Zielarchitektur)
CROSS_COMPILE (Toolchain-Pfad)
KERNEL (Kernel-Quellpfad)
Beispiel mit zwei Netzwerken direkt von der Kommandozeile:
sudo insmod SYNgate.ko dstnet_list=10.1.1.0/24,198.168.10.0/24 psk_list=d41d8cd98f00b204e9800998ecf8427e,efebceec0de382839cd38bffcdc6bf0c enable_udp_list=0,0 precision_list=10,9 enable_antispoof_list=0,1
oder mit einer Konfigurationsdatei:
sudo cat /etc/modprobe.d/SYNgate.conf
# SYNgate Config-Datei
# Halte sie sicher!!
options SYNgate dstnet_list=10.1.1.0/24,198.168.10.0/24
options SYNgate psk_list=d41d8cd98f00b204e9800998ecf8427e,efebceec0de382839cd38bffcdc6bf0c
options SYNgate enable_udp_list=0,0
options SYNgate precision_list=10,9
options SYNgate enable_antispoof_list=0,1
GPL-2.0
Sorint.Lab
Deaktivieren des OTP für ausgehende Pakete
disable_out: 0
Sie können das OTP in ausgehenden Paketen deaktivieren, indem Sie dies auf 1 setzen. In diesem Fall wird das Modul die Pakete ohne OTP einfach verwerfen, aber es wird nicht am Kommunikationsnetz mit anderen SYNwall-Geräten teilnehmen. Dies kann nützlich sein, falls es Probleme mit den ausgehenden Paketen auf Uplink-Geräten gibt.
DoS-Schutz aktivieren
enable_antidos: 0
Diese Option kann aktiviert werden, indem Sie sie auf 1 setzen. Wenn gesetzt, begrenzt dies die OTP-Berechnung auf dem Gerät auf eine bestimmte Anzahl (Variable allow_otp_ms, standardmäßig auf 1000 gesetzt). In diesem Fall ist nur eine OTP-Berechnung pro Sekunde erlaubt, was die CPU-Zeit des Geräts im Falle eines DoS-Angriffs schont.
IP-Spoofing-Schutz aktivieren
enable_antispoof: 0
Standardmäßig ist die IP nicht Teil des OTP. Dies könnte zu einem Replay-Angriff führen. Sie können den Antispoof-Schutz aktivieren, um vollständig sicher zu sein. Dies kann die Kommunikation unterbrechen, wenn sich zwischen den Geräten NATs befinden.
Verzögerung beim Starten der Modulfunktionen (ms)
load_delay: 10000
Sie können entscheiden, eine Weile zu warten, bevor Sie den Schutz nach dem Laden des Moduls aktivieren. Dies könnte nützlich sein, um bei Problemen und nach einem Neustart Zugriff auf das Gerät zu erhalten. Der Standardwert beträgt 10 Sekunden.
Liste der Ports für Port-Knocking-Failsafe
portk: 0,0,0,0,0
Wenn die Geräteuhr verrückt spielt, kann es schwierig sein, Zugriff zu erhalten. Ein Weg könnte die zuvor besprochene 'Verzögerung' sein, aber Sie können auch eine 'Port-Knocking'-Sequenz festlegen, die das Modul für eine Weile deaktivieren kann. Die Liste muss, falls definiert, aus 5 TCP-Ports bestehen. Wenn das Modul innerhalb einer Sekunde ein SYN-Paket auf diesen Ports erkennt, deaktiviert es sich selbst für die gleiche Zeit, die als 'load_delay' festgelegt ist. HINWEIS: Wenn Sie die Sequenz aktiv nutzen, denken Sie daran, sie zu ändern, da sie leicht ausgespäht werden kann!
Aktivieren/Deaktivieren des Antispoof-Schutzes. Setzen Sie 0, um ihn zu deaktivieren oder 1, um ihn zu aktivieren. Standardmäßig ist die IP nicht Teil des OTP in SYNwall. Dies könnte zu einem Replay-Angriff führen. Sie können den Antispoof-Schutz aktivieren, um vollständig sicher zu sein. Dies kann die Kommunikation unterbrechen, wenn sich zwischen den Geräten NATs befinden.