Gute iptables Startregeln für einen Webserver?

12

Ich installiere einen neuen Centos 5.4-Server und möchte eine Reihe sauberer Regeln für den Start von muiptables haben.

Was wären die guten Regeln für den Anfang?

Ist das ein guter Ausgangspunkt:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Für was ist diese Regel:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

UPDATE:

Es wird ein Webserver mit FTP (erforderlich), Apache, SSH, MySQL sein.

benjisail
quelle
Ich verwende diese einfache Regel .... Schließe alles und arbeite rückwärts und öffne, was benötigt wird. Für einen Webserver sind Port 80/443 normalerweise die einzigen öffentlich zugänglichen Dienste. Blockieren Sie alles andere oder beschränken Sie den Zugriff - beschränken Sie beispielsweise ssh auf bestimmte IP-Adressen oder auf ein privates Netzwerk.
Jeffatrackaid

Antworten:

13

Ihre IPTables-Regeln scheinen für Ihren Server am besten geeignet zu sein. Aber ich würde ein paar mögliche Änderungen vorschlagen:

  • Sofern Sie nicht den SSH-, MySQL- und FTP-Zugriff vom gesamten Internet aus zulassen müssen, wäre es viel sicherer, die Option '--source' zu verwenden, um den Zugriff auf diese Ports nur von bestimmten zugelassenen IP-Adressen aus zu beschränken. Um beispielsweise nur SSH-Zugriff von der IP-Adresse 71.82.93.101 aus zuzulassen, ändern Sie die 5. Regel in "iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT". Sie müssen wahrscheinlich eine separate Regel für jede einzelne IP-Adresse hinzufügen, die Sie zulassen möchten. Weitere Informationen hierzu finden Sie in dieser Frage: iptables multiple source IPs .

  • Sofern auf diesem Computer kein DNS-Server ausgeführt wird, möchten Sie wahrscheinlich den Zugriff auf den Domain-Port (53) blockieren. Entfernen Sie dazu einfach die Zeile 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT'. (Dies sollte übrigens auch Ihre letzte Frage beantworten.) Wenn Sie jedoch tatsächlich einen DNS-Server betreiben, lassen Sie diese Regel in Kraft.

  • Wenn Sie den Remote-Zugriff auf MySQL-Clients über das Netzwerk zulassen möchten, müssen Sie die Zeile 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' hinzufügen, um den externen Zugriff auf den Standard-MySQL-Port zu ermöglichen . Tun Sie dies jedoch NICHT, es sei denn, dies ist wirklich erforderlich. Wenn Sie nur lokalen MySQL-Zugriff benötigen (beispielsweise für eine PHP-App unter Apache), müssen Sie keinen Remote-MySQL-Zugriff bereitstellen. Wenn Sie nicht riskieren möchten, gehackt zu werden, stellen Sie sicher, dass Sie für alle MySQL-Benutzerkonten sichere Kennwörter benötigen und dass Ihre MySQL-Serverpakete auf dem neuesten Stand sind, wenn Sie Port 3306 für das Netzwerk öffnen.

  • In einem Ihrer Kommentare ("Zulassen von ssh-, dns-, ldap-, ftp- und Webdiensten") werden LDAP-Dienste erwähnt, aber in Ihrer Konfiguration gibt es keine solche Regel. Dies passiert mir häufig, wenn ich eine Beispielkonfiguration kopiere und sie ändere. Es wird die Funktion nicht beeinträchtigen, aber ich würde den Kommentar korrigieren, da irreführende Kommentare indirekt dazu führen können, dass Sie oder ein anderer Administrator in Zukunft verwirrt werden.

Nach meiner Erfahrung ist es schwierig, perfekte IPTables-Regeln zu finden, aber ich denke, Sie sind definitiv auf dem richtigen Weg. Viel Glück beim Erlernen von IPTables - diese Regeln können auf den ersten Blick komplex erscheinen, aber es ist eine sehr hilfreiche Fähigkeit für jeden Linux-Systemadministrator.

Ryan B. Lynch
quelle
1
Anstatt den MySQL-Remotezugriff über die Firewall zuzulassen, können Sie nur sicherstellen, dass jeder, der Zugriff auf den MySQL-Server benötigt, das Recht hat, SSH-Ports weiterzuleiten.
Ptman
SSH-Portforwards sind eine mögliche Alternative zum Öffnen des Ports und zum Sperren der MySQL-Berechtigungen. Aber wenn er nicht mit sensiblen Daten zu tun hat und / oder ein hochkarätiges Ziel ist (was die Verschlüsselungsfunktionen von SSH nützlich machen würde), sehe ich keinen Vorteil. Immerhin hat das SSH-Tunneln seine eigenen Nachteile, darunter: Probleme beim Einrichten / Konfigurieren; Erhöhung der CPU-Auslastung und Begrenzung der Bandbreite (aufgrund der statischen Puffergröße von OpenSSH). Und was ist, wenn er nicht möchte, dass alle entfernten MySQL-Clients lokale Anmeldungen haben?
Ryan B. Lynch
In Bezug auf Kommentare, die nicht mit den Regeln übereinstimmen, erlauben die ICMP-Regeln Traceroutes, PMTU-Erkennung und andere nützliche Nachrichten, erlauben jedoch keine Pings (Echo-Request und Echo-Reply).
Gerald Combs
Gerald, das ist ein guter Fang, das habe ich nicht einmal bemerkt. Er sollte wahrscheinlich entweder den Kommentar ändern, um zu beachten, dass Ping NICHT zulässig ist, oder Regeln hinzufügen, die ICMP-Echo-Anforderungs- / Antwortverkehr zulassen.
Ryan B. Lynch
4

Versuchen Sie auf jeden Fall, auch Ihren ausgehenden Datenverkehr einzuschränken.

Ich habe viele Fälle gesehen, in denen PHP-Exploits dazu führen, dass jemand 'curl' oder 'wget' verwendet, um bösartigen Code von einer anderen Stelle abzurufen und ihn dann auf Ihrem Server auszuführen, um sich einem Botnetz anzuschließen.

Wenn Sie nicht erwarten, dass Apache (als Beispiel) mit anderen Websites selbst kommunizieren muss, beschränken Sie den Datenverkehr und sparen Sie sich ein wenig Zeit!

nixgeek
quelle
2

Diese Regeln können über "iptables-restore" importiert werden:

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

Und nur zur Veranschaulichung ... diese Standardrichtlinien sollten auch festgelegt werden, WENN die oben genannte iptables-restore nicht verwendet wird:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
Phil
quelle
Ich habe Ihren Beitrag bearbeitet - StackOverflow ist ein Frage / Antwort-Format. Bitte lesen Sie die FAQ: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705
Dies führt zu Leistungsproblemen, da die Stateful-Regel hier zuletzt angezeigt wird und zuerst angezeigt werden sollte, da sie mit der überwiegenden Mehrheit der Pakete übereinstimmt.
Michael Hampton
0

Warum erlauben Sie FTP und DNS? Bietet Ihr Server diese Dienste an? FTP sollte eigentlich nicht verwendet werden, außer für einige sehr spezielle Anwendungsfälle, verwenden Sie stattdessen SFTP (nicht FTPS). Warum sollten Sie auch alle anderen Ports durch symbolische Namen und http durch numerische 80 angeben? Hast du das gerade von woanders kopiert? Kein Kopieren und Rat wird Unverständnis ausgleichen. Stellen Sie sicher, dass Sie TCP, IP, Firewalls und die Protokolle der Dienste verstehen, die Sie bereitstellen werden.

ptman
quelle
Ich möchte nicht beleidigen, ptman, aber ich denke, Ihre Antwort könnte als etwas unhöflich und herablassend angesehen werden. Außerdem beantworten Sie die Frage nicht wirklich. Wenn der Fragesteller kein Verständnis hat, halten Sie es nicht für besser, respektvoll zu sprechen und ihn zu diesem Thema zu unterrichten?
Ryan B. Lynch
Sie haben wahrscheinlich recht. Meine Kommentare können negativ klingen, sind aber nicht so gemeint. Ich habe versucht, Fragen aufzulisten, die relevante Denkprozesse auslösen. Und da ich die Grundkenntnisse nicht kenne, habe ich nicht angefangen, ein Lehrbuch zu schreiben. Aber Sie sind absolut richtig in Bezug auf den nicht hilfreichen Ton. Zum Glück haben Sie eine viel hilfreichere Antwort geschrieben.
Ptman