Ich habe versucht, ein grundlegendes Server-Skript für iptables zusammenzustellen, das für die meisten Sites funktioniert, auf denen nur ein grundlegender Webserver mit HTTP (S) und SSH (Ports 80, 443 und 22) ausgeführt wird. Schließlich benötigen die meisten VPS nur diese Regeln für Startports und können Mail- oder Game-Ports später nach Bedarf hinzufügen.
Bisher habe ich den folgenden Regelsatz und ich habe mich gefragt, ob jemand ein besseres Skript oder Verbesserungen kennt, die hinzugefügt werden könnten.
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allows SSH connections (only 4 attempts by an IP every 3 minutes, drop the rest)
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
iptables ist einer der wichtigsten Teile beim Sichern Ihrer Box (siehe auch fail2ban), und dennoch haben viele Leute wie ich Probleme, alles zu verstehen, was dazu beiträgt, eine sichere Basis-Firewall für unsere Server zu erstellen.
Was ist der sicherste Weg, um nur die grundlegenden Ports zu öffnen, die für einen Webserver benötigt werden?
Update: cyberciti.biz hat ein weiteres iptables-Skript , das ziemlich gut aussieht.
Anstatt Denyhosts oder fail2ban zu verwenden, können Sie auch iptables selbst verwenden, um wiederholte Versuche mit SSH zu blockieren .
modprobe
es nicht installiert ist (oder ein anderer Fehler auftritt, bevor Sie Port 22 öffnen), sperren Sie sich selbst aus dem Server aus.Antworten:
Die sicherste Art, mit iptables zu arbeiten, ist, alles zu schließen und nur das zu öffnen, was Sie benötigen. Ich bin irgendwie abgelenkt, also versuche ich immer, so faul wie möglich zu sein, damit ich keine Fehler mache, die dazu führen können, dass der Server unsicher wird.
Ich benutze dieses, es muss nur ein bisschen eine variable Zuweisung gemacht werden, damit es funktioniert.
Ich benutze es seit einiger Zeit, und jede Art von Änderung wird sehr geschätzt, wenn es die Verwaltung erleichtert.
quelle
Das sieht ganz gut aus, aber man könnte es ein bisschen enger machen. Das Flag -s ist die Quell-IP oder der Domain-Name, und Sie fügen "-s 198.23.12.32" hinzu, oder wie auch immer Ihre IP-Adresse lautet, um nur SSH von Ihrer Quell-IP zuzulassen. Sie können auch einen Bereich von Quell-IPs mithilfe der CIDR- Notation auswählen .
Sie sollten vorsichtig sein, wenn Sie abgelehnte Anrufe protokollieren. Die IP-Adresse Ihres Servers wird von Bots, Script-Kiddies usw. gescannt, und die Protokolldatei kann ziemlich schnell groß werden. Sofern Sie nicht versuchen, ein bestimmtes Problem zu diagnostizieren, von dem Sie glauben, dass es mit jemandem zusammenhängt, der versucht, Ihre Firewall zu beschädigen, würde ich diese Option entfernen.
Sie können für ein Pseudo-IDS auch fail2ban mit iptables verknüpfen. fail2ban scannt Ihre Protokolldateien und kann eine IP-Adresse blockieren, wenn diese versucht, sich in Ihr System zu drängen. Wenn sich eine bestimmte IP-Adresse beispielsweise fünfmal nicht bei SSH anmeldet, können Sie sie für einen ganzen Tag sperren. Es funktioniert auch mit FTP und vielen anderen (einschließlich Bots, die Apache treffen). Ich verwende es auf allen meinen Servern, um ein bisschen mehr Schutz vor Brute-Force-Angriffen zu bieten.
quelle
Schauen Sie sich Shorewall an. Die Standardkonfiguration für eine einzelne Schnittstelle wäre ein guter Ausgangspunkt. Es ist einfach zu konfigurieren und verfügt über Makros für Dinge wie SSH und Webzugriff. Es kann so konfiguriert werden, dass der Server beim Herunterfahren der Firewall auf die gewünschte Stufe gesperrt wird. Mit Shorewall-lite können Sie einen Firewall-Build auf einem anderen Server ausführen. Die Protokollierung kann einfach auf die gewünschte Ebene konfiguriert werden.
Für einen einfachen HTTP-Server möchten Sie den eingehenden Zugriff auf Port 80 und Port 443 öffnen, wenn Sie HTTPS verwenden. Ein SSH-eingehender Zugriff von wenigen eingeschränkten Adressen ist normalerweise erwünscht. Möglicherweise möchten Sie auch den ausgehenden Zugriff sperren. Öffnen Sie die Firewall nur für die erforderlichen Server und Dienste. Es sollten NTP und DNS sowie ein Kanal zum Abrufen von Patches geöffnet werden.
quelle
Ich würde sagen, dass dies eine ziemlich gute Firewall ist, mit der Ausnahme, dass sie darauf abzielt, eingehenden Verkehr zu stoppen, und sich nicht auf ausgehenden oder ausgehenden Verkehr konzentriert. In vielen Fällen ist es genauso wichtig, sich auf ausgehende Verbindungen zu konzentrieren wie auf eingehende. In dem unglücklichen Fall, dass die Maschine tatsächlich ausgenutzt wird, wäre es schön zu verhindern, dass zusätzliche Root-Kits heruntergeladen oder eine Verbindung zu Befehls- und Steuerknoten oder was auch immer hergestellt wird.
BillThor fing an, darüber zu sprechen, aber ich antworte nur mit konkreten Beispielen. Eines der schönen Dinge an iptables ist, dass es sich an den Verbindungsstatus erinnern kann. Dies kann Auswirkungen auf die Leistung von stark frequentierten Sites haben. Sie können jedoch den eingehenden Zugriff auf http / https ändern, um beispielsweise nur Antworten auf bestehende Verbindungen zuzulassen, oder bestimmte unprivilegierte Verbindungen speziell einschränken Benutzer haben überhaupt keinen ausgehenden Zugriff. Dann hätten Ihre ausgehenden Regeln RELATED, ESTABLISHED-Klauseln, die eine ganze Reihe von Nebenangriffen verhindern und diejenigen verlangsamen würden, die eine Sekundärstufe erfordern, um eine Box tatsächlich auszunutzen, was sehr häufig ist.
Schließlich würde ich sagen, dass es besser ist, die iptables-Richtlinie -P DROP festzulegen, als am Ende ein angefügtes REJECT zu haben. Dies ist meistens eine Frage der Präferenz, kann jedoch Fehler beim Anhängen an Ketten mit vorhandenen Regeln verringern, anstatt sie einzufügen oder zu löschen / zurückzusetzen.
quelle
-A INPUT -j REJECT
zu-A INPUT -P DROP
?