Malte Thoma schrieb: > Wenn mir iregndein Experte sagen könnte, ob die Regeln so OK sind, > oder ob es noch irgendwo ein gravierendes Loch gibt, dann wäre ich > sehr dankbar.
Eigentlich fühle ich mich von "irgendein" nie angesprochen ;-> Na gut: Die Regeln sind Müll. Keine Notwendigkeit viel zu diskutieren. Entferne ipmasq und gshield bzw. solange, bis Du nach dem Start eine leere Auflistung bei "iptables -vnL" bekommst und nicht irgend welche Zusatzpakete dort viel Müll abladen. Dann rekonfiguriere iptables mit "dpkg-reconfigure -s iptables" und aktiviere dabei die init.d Skripte mit "yes". Danach kannst Du in /var/lib/iptables eine Datei mit dem Namen "active" und eine "inactive" ablegen, die beim Hoch- und Runterfahren bzw. durch /etc/init.d/iptables start/stop geladen werden. Es können dort auch weitere Dateien (z.B. Sicherheitskopien oder Testexemplare liegen) und mit /etc/init.d/iptables load/save dateiname geladen oder gespeichert werden. Du kannst somit auch mit dem Kommando iptables Regeln interaktiv erstellen und anschliessend den gesamten neuen Regelsatz speichern. Für den Anfang kann auch inactive identisch mit active sein (symb. Link). Anbei mal (ausnahmsweise) ein Anhang mit einer Minimalversion einer "active" für ppp-Kontakt zur Aussenwelt und ggf. internem Netzwerk auf einer weiteren lokalen Schnittstelle. Dieser Regelsatz arbeitet nur mit Schnittstellen (benötigt also keine IPs) und Stateful Inspection. Das einzige, was angepasst werden muss ist der Name der weiteren lokalen Schnittstelle, falls ein internes Netz angeschlossen ist. Im Moment lautet diese "int+". Ohne den Wunsch ein internes Netz anzuschliessen, können diese Regeln also schadlos drin bleiben. Bei einem internem Netz kann entweder die Schnittstelle von ethX nach intX mit dem Kommando "ip" (Paket iproute) umbenannt werden, oder der Eintrag "int+" in active wird durch den exakten Namen der Schnittstelle ersetzt. Noch als Vorbemerkung: das ist ein Paketfilter und keine Firewall. Firewall ist der Begriff für ein Konzept, zentral an einer Stelle alle Filter und Zugangsvorgänge zu organisieren. Der Paketfilter "filtert" relativ wenig im wörtlichen Sinne. Es ist mehr ein Verteilerknoten. Wesentlich mehr "gefiltert" werden muss auf der Applikationsebene. Dieser Paketfilter hat die Leistungsfähigkeit eines normalen Türschlosses. Vermutlich hast Du zu Hause auch kein atombombensicheres Wohnzimmer und den Garten mit NATO-Draht umzäunt. Ein Teil des denkbaren Schindluders bzw. eigentlich notwendige Funktionen werden hierbei auch der Verantwortung Deines Providers überlassen. Hier eine kurze Kommentierung. ---NAT Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) num target prot opt in out 1 MASQUERADE all -- * ppp+ Verbindungen von internen Quellen nach draussen über jedes ppp-Device werden maskiert, d.h. bekommen die externe IP als Absendeadresse. Das "+" ist bei iptables die Wildcard entsprechend einem "*" bei Dateinamen. Das hier legt einfach die Funktionalität fest. Berechtigungsfragen regelt man im FORWARD Filter. ---FILTER Chain INPUT (policy DROP 0 packets, 0 bytes) Die INPUT-Regeln betreffen alle Pakete, die an das System selbst gehen sollen. Alle Regelsätze sollten nach dem Prinzip "vom Allgemeinen zum Speziellen" aufgebaut sein, und damit wie ein immer feiner werdendes Sieb funktionieren. Am Ende steht ein DROP. Was nicht erlaubt war, fällt bis zum DROP durch, wird vorher protokolliert und verworfen. num target prot opt in out 1 ACCEPT all -- * * state RELATED,ESTABLISHED Das ist Stateful Inspection. Der Kernel führt eine Liste aller aktiven Verbindungen (siehe cat /proc/net/ip_conntrack). Alle hereinkommenden Pakete, die zu einer bereits aktiven Verbindung gehören, werden direkt akzeptiert. 2 ACCEPT all -- lo * 3 ACCEPT all -- int+ * Lokale Verbindungen über das loop-Device sind nicht immer Stateful und werden daher generell akzeptiert. Das hier auch nur lokale Pakete hereinkommen stellt der Kernel in der Standardeinstellung von alleine sicher. 4 extern all -- * * Hier springen wir zu einer sogenannten Userchain (siehe unten). Da keine weiteren Bedingungen definiert sind, wird diese Chain immer angesteuert. Man könnte es auch bedingt gestalten, z.B. nur "-i ppp+". Bringt aber aktuell keinen Vorteil. Durch Userchains lassen sich komplexe Filter übersichtlicher gestalten. Hier wird z.B. auch die Handhabung vereinfacht: man muss sich keine Gedanken im die richtige Position im Filter machen, sondern kann alle Regeln um externen Zugriff einfach in der "extern" Userchain anhängen. 5 ACCEPT icmp -- * * Hier werden alle ICMP-Pakete akzeptiert. Grundsätzlich sollte man auf keinen Fall auf ICMP verzichten. Sonst geht kein Ping und viele wichtige Netzfunktionen arbeiten nicht richtig. Für 08/15-Sicherheit wird das kein zu grosses Problem sein, alles zu erlauben. Für den fortgeschritteneren Anspruch wäre stattdessen eine Userchain angesagt und zuerst eine Einschränkung auf z.B. icmp-type 0,3,5,8,11 6 LOG all -- * * limit: avg 1/sec burst 10 LOG flags 0 level 4 prefix `DROP INPUT ' Pakete, die jetzt noch nicht angenommen wurden, sollen geblockt werden. Um auch zu wissen, was das ist, wird hiermit ein Logfile-Eintrag in /var/log/kern.log erzeugt. Damit das Logfile nicht geflutet wird, ist es sehr wichtig Limits zu setzen. Dabei geht es weniger um Plattenplatz (jedes mittelmässige Apache-Log wächst schneller), sondern auch darum, dass der klogd bei einer zu grossen Flut wegknacken könnte. Avg-Limits von weniger als 1/sec sind nicht praxisnah. Den Burst sollte man auf 3*Zahl der ext. IPs des Anschlusses setzen, um auch Netzscans sauber in den Logs zu haben, 7 REJECT all -- * * reject-with icmp-port-unreachable Alle Pakete die einfach durchfallen, würden von der Policy der Chain (immer DROP = kommentarlos löschen) erfasst werden. Bei INPUT sollte man ein REJECT machen (Gegenstelle bekommt eine ICMP-Nachricht geschickt). So funktionieren auch Traceroutes zum eigenen System. Als 8. würde ich normalerweise noch ein explizites, unbedingtes DROP einbauen, auch wenn die Policy schon auf DROP ist. Motto: doppelt gemoppelt, ist übersichtlicher, usw. Hier aus Minimalismusgründen ausgelassen. Chain FORWARD (policy DROP 0 packets, 0 bytes) Dieser Regelsatz legt fest, welche Pakete von internen Netzwerkschnittstellen zu anderen weitergeleitet werden und umgekehrt. num target prot opt in out 1 LOG udp -- int+ * limit: avg 1/sec burst 10 udp dpts:137:139 LOG flags 0 level 4 prefix `LOG SMB-OUT ' Nur ein Beispiel, wie man sehr spezielle Dinge mitprotokollieren kann. Hier geht es z.B. darum zu erfahren, ob interne Rechner Pakete auf Port 137-139 nach draussen schicken. Das passiert besonders, wenn sich ein Windowssystem einen der aktuellen Würmer eingefangen hat. Hier ist auch die Grundstruktur aller iptables-Kommandos sichtbar: iptables [iptables-Optionen] [Match u. Match-Optionen] [ggf. weitere Match-Konstrukte] [Jump-Target und Target-Optionen] In diesem Punkt unterscheidet sich iptables deutlich von ipchains. Hier stolpern die Leute auch zuerst, wenn Sie die Optionen wild durcheinander wirbeln und alle dem iptables-Kommando selbst zuordnen. Mit den Match- und Target-Optionen kann das iptables-Kommando aber gar nichts anfangen, sondern nur die entsprechenden Match- und Target-Module. 2 ACCEPT all -- * * state RELATED,ESTABLISHED 3 ACCEPT all -- int+ * Wir erlauben alle Wünsche von innen nach draussen grundsätzlich. Das ist ein Thema, über das man ein ganzes Buch schreiben könnte. Nur soviel: Wer glaubt, er könne vorsorglich bösen Geistern (Trojanern) den Kontakt verwehren, sieht die Tatsachen nicht. Die wenigsten Leute können z.B. auf https oder DNS verzichten. Somit kann man also prinzipiell nach draussen tunneln. Darüber hinaus führen zu repressive Einstellungen bei Benutzern zu den kreativsten und abenteuerlichsten work-arounds, die meistens kontraproduktiv sind. Nach dem Motto: wenn der selbstdenkende, intelligente Türmechanismus nicht wie gewünscht funktioniert, legen wir einfach einen Keil dazwischen. Folge: noch schlechtere Sicherheit, als ohne Repression. Beschränkungen von intern->draussen sind äusserst wartungsintensiv und komplex zu handhaben. Schwieriger, als die Gegenrichtung. Das kann man anfangen, wenn man Vollzeit-Firewall Operator ist, und die Effekte immer sofort in den Logs sieht. 4 LOG all -- * * limit: avg 1/sec burst 10 LOG flags 0 level 4 prefix `DROP FORWARD ' s.o. Chain OUTPUT (policy DROP 0 packets, 0 bytes) num target prot opt in out 1 ACCEPT all -- * * state RELATED,ESTABLISHED Das gleiche wie in den anderen Regelsätzen. Die Regel um Pakete zu schon bestehenden Verbindungen zu akzeptieren steht ziemlich weit oben. Damit wird (gerade wenn er komplexer wird) ein kompletter Regelsatz nur beim ersten Paket der Verbindung durchlaufen. Anschliessend stehen akzeptierte Verbindung in der Datenbank und werden von dieser Regel erfasst. Vor dieser Regel könnte man noch Regeln zum Accounting und zum generellen Protokollieren einfügen. Auch eine Regel, "unclean" Pakete zu verwerfen macht Sinn. Das Unclean-Modul hat aber im Moment einen dummen Bug mit UDP Checksums und verwirft auch akzeptable Pakete. Bräuchte man also einen Kernel-Patch oder voraussichtlich Kernel >=2.4.20 dazu. 2 ACCEPT all -- * * state NEW Alle Verbindungen, die vom eigenen Host gestartet werden, werden akzeptiert und stehen damit im Connection Tracking. Es gäbe hier ein paar Details zu Situationen, in denen kein NEW-State gesetzt ist. Ist nun ja keine 5-Tage-Schulung. Vieles muss prinzipbedingt unter den Tisch fallen.... ;-) 3 ACCEPT all -- * lo s.o. 4 LOG all -- * * limit: avg 1/sec burst 10 LOG flags 0 level 4 prefix `DROP OUTPUT ' Wenn ein OUTPUT verworfen werden sollte, dann kann man sich das mal genauer anschauen. Das sollte in diesem Regelsatz eigentlich nicht vorkommen. Es könnte also irgend ein Konfigurationsfehler vorliegen. Chain extern (1 references) num target prot opt in out 1 ACCEPT tcp -- ppp+ * tcp dpt:22 Hier kannst Du analog alle Protokolle eintragen, die von ausserhalb erlaubt sein sollen. Sobald die Verbindung akzeptiert wurde, stehen sie wieder in der Connection Tabelle. Somit wird keine Regel für den Output benötigt. Weitere Dienste einfach dazufügen. Dieser Regelsatz ist, wie gesagt, ein Grundgerüst, mit dem Ziel ein praktikables Minimum zu zeigen. Für den professionelleren Anspruch wären die nächsten Schritte die hereinkommend erlaubten icmp-Typen näher zu spezifizieren und die Weiterleitung von/zu RFC1918-Adressen zu untersagen und viele weitere Details. Auch gehe ich davon aus, dass Du einen vertrauenswürdigen Internet Provider hast. Die meisten üblen Sachen setzen voraus, das der Manipulator bei Deinem Provider direkt am anderen Ende der Leitung sitzt oder im lokalen Netz. Im kommerziellen Umfeld ist somit das lokale Netz auch der weitaus problematischere und schwierigere Teil, als die Internetanbindung. Viele haben das aber noch nicht begriffen. Gerade in den Wireless-Zeiten. Es sind dann die Dir nicht untergebenen Führungskräfte, die sich, um auch in der Sofaecke mit dem schicken Lappi arbeiten zu können, ungefragt im Supermarkt eine Wireless Ausrüstung kaufen und das Ding einfach an's Netz klemmen. Der Admin erfährt davon gar nichts, funktioniert ja. Admins, die wie das Karnickel nur auf das "böse Internet" und die Aussenanbindung starren, sind da verloren. Der grössere Brocken Arbeit ist im internen Bereich zu finden. Das geht schon bei kleineren Firmen los, wo z.B. auch externe Mitarbeiter mit Ihren Lappis ein- und ausgehen. Und da helfen auch nicht die üblichen "ich nehme einen ollen PC als Gateway" Konstrukte. Bei 2Mbit Uplink vielleicht. Aber nicht bei einigen Servern mit je 100MBit am Switch. Das sind auch die heutigen typischen Angriffszenarien. Irgend so ein Billig-Wireless-Kit oder eine Spielconsole mit zu verschmerzenden Verlustkosten mit der Putzkolone eingeschleppt, unter'm Schrank oder sonstig unauffällig deponiert, Kabel in die nächste Dose und man ist in deren Netz... > 2. Ausschließlich ssh erlauben will? > b) Wo werden sie mitgeloggt? /var/log/auth.log > 3. Mit welchem 'Einbruchswerkzeug' kann man das testen? Mit brachialem Hacker-Einbruch aus dem Internet muss man als einfacher Netzteilnehmer nicht rechnen. Die meisten Portscans zielen in Bezug auf Linux auf typische Fehler bei der Konfiguration bzw. Bug-behaftete und nicht aktualisierte Software auf den Ports 21 (ftp), 22 (ssh), 80 (http), sowie Ports von Proxy- und Socks-Servern (1080, 3128, 8080) oder P2P-Diensten. Es geht dabei mehr um Vandalismus und Missbrauch, als um Einbruch. Solche Scans treffen haupsächlich Windowssysteme auf Port 137, Port 80 bzw. 1433 (SQL-Server). Bei Linux kommen hier Port 111 (rpc) und aktuell 443 (https) in Frage. Mit Software auf aktuellem Stand aber kein Problem. Das jemand gezielt Dein System angreift, das passiert typischerweise nicht auf der Paketfilter-, sondern der Applikationsebene. Dazu reichen die üblichen schlecht konzipierten LAMP-Konstrukte. -- [EMAIL PROTECTED]
# Generated by iptables-save v1.2.6a *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] :extern - [0:0] [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT [0:0] -A INPUT -i lo -j ACCEPT [0:0] -A INPUT -i int+ -j ACCEPT [0:0] -A INPUT -j extern [0:0] -A INPUT -p icmp -j ACCEPT [0:0] -A INPUT -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "DROP INPUT " [0:0] -A INPUT -j REJECT --reject-with icmp-port-unreachable [0:0] -A FORWARD -i int+ -p udp -m limit --limit 1/sec --limit-burst 10 -m udp --dport 137:139 -j LOG --log-prefix "LOG SMB-OUT " [0:0] -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT [0:0] -A FORWARD -i int+ -j ACCEPT [0:0] -A FORWARD -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "DROP FORWARD " [0:0] -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT [0:0] -A OUTPUT -m state --state NEW -j ACCEPT [0:0] -A OUTPUT -o lo -j ACCEPT [0:0] -A OUTPUT -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "DROP OUTPUT " [0:0] -A extern -i ppp+ -p tcp -m tcp --dport 22 -j ACCEPT COMMIT # Generated by iptables-save v1.2.6a *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT # Generated by iptables-save v1.2.6a *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] [0:0] -A POSTROUTING -o ppp+ -j MASQUERADE COMMIT # Completed