Ist es sicher, einen für das Internet geöffneten Server neu zu starten?

29

Speziell

Ich habe einen Iptables-Regelsatz auf einem Server mit CentOS definiert. Bin ich garantiert / kann ich garantieren / wie kann ich garantieren, dass beim Einschalten des Netzwerks (entweder beim Systemstart oder nach dem Neustart des Netzwerkdienstes) der iptables-Regelsatz bereits angewendet wird (und wenn iptables nicht gestartet wurde oder den Regelsatz nicht anwendet)? die Netzwerkschnittstelle wird nicht gestartet)?

(Ich weiß, dass dies eine Noob-Frage ist, aber ich habe nie einen Server in einem vertrauenswürdigen Netzwerk hinter einem maskierenden DHCP-NAT und einer Firewall betrieben. Erwarten Sie also Noob-Fragen von Noobs.)

Parthischer Schuss
quelle
15
Wirklich keine noob Frage. Dies ist im Wesentlichen der Grund, warum Hacker 2011 in das PlayStation-Netzwerk eingestiegen sind. Dies führte zu einem Ausfall von 24 Tagen und Siedlungen im Wert von 15 Mio. USD. Als ihre Firewalls neu gestartet wurden (wie monatlich), wurde die Firewall für einige Momente geöffnet - anscheinend lange genug.
Chris S
@ChrisS Das Seltsamste daran wäre für mich, dass ich mir sicher bin, dass die für dieses Netzwerk verantwortlichen Sysadmins mit ziemlicher Sicherheit schlau genug wären, wenn jemand vorschlagen würde, die Firewall auszuschalten, aber monatlich keine Wimpern schlagen würde , Ausschalten ... und dann wieder ein. Ich bin mir jedoch nicht sicher, welche Kombination dies erklären würde.
Parthian Shot
Eine andere Möglichkeit besteht darin, den Port des Netzwerk-Switches zu deaktivieren, bis der Server vollständig gestartet ist - sofern Sie vor Ort sind und über Switch-Zugriff verfügen. Dies ist nicht ideal, aber es würde definitiv funktionieren, es sei denn, der Server hatte eine Netzwerkabhängigkeit wie NFS.
Jftuga
@jftuga Na klar. Aber dann wäre der Server nicht mit dem Internet verbunden, und diese Lösung fällt technisch nicht in den Geltungsbereich dieser Frage. Wenn ich vor Ort bin, kann ich das Ethernet-Kabel während des Neustarts einfach abziehen. Und das zugrunde liegende Problem würde sowieso bei der Portblockierungslösung bleiben; dass ein anderer Computer, der über das Netzwerk angreift, nicht von der lokalen Firewall gestoppt wird. Wenn der Router gehackt wird oder Fehlfunktionen auftreten oder jemand anderes im lokalen Netz gefährdet ist, ist das Spiel immer noch vorbei.
Parthian Shot
@jftuga In der Tat ist das Problem noch schlimmer. Angenommen, jemand hat bereits eine Software zum Ausführen auf dem lokalen Computer, aber meine Firewall filtert den Ausgang. Die Regel lautet, ausgehende Pakete sind nur zulässig, wenn sie hergestellt oder verbunden sind, und eingehende neue Verbindungen sind nur für Port 80 zulässig Normalerweise würde dies verhindern, dass eine Reverse Shell von einem nicht privilegierten Account abweicht. Wenn die Verbindung jedoch beim Booten hergestellt wird, wird sie durch die Firewall-Initialisierung aufrechterhalten. Ich nehme an, das bedeutet auch, dass sich die Firewall-Regeln ändern sollten, aber das ist ein leichter Fehler.
Parthian Shot

Antworten:

18

Im Auslieferungszustand wird garantiert, dass iptables gestartet wird, bevor die Schnittstelle in der Reihenfolge der Startskripte aufgerufen wird. Schauen Sie sich die "chkconfig" -Zeile in jedem Startskript an und Sie werden die Runlevel sehen, auf denen es "on" ist, wenn es aktiv ist, die Startreihenfolge und die Stopreihenfolge.

Es kann nicht garantiert werden, dass die Schnittstelle nicht aufgerufen wird, wenn der iptables-Regelsatz (oder überhaupt) nicht ordnungsgemäß angewendet wurde.

Beispiel: In
chkconfig: 2345 08 92
dieser Zeile wird angegeben, dass der betreffende Dienst in den Runlevels 2, 3, 4 und 5 aktiv ist und bei 8 beginnt und bei 92 endet. Alle mit einem höheren Wert für "start" werden erst gestartet, nachdem dieses Skript abgeschlossen wurde. Dieses fehlerhafte Skript wird jedoch als abgeschlossen betrachtet und verhindert nicht, dass nachfolgende Skripts ausgeführt werden.

Bitte beachten Sie, dass diese Antwort für CentOS 6 und früher gilt, nicht unbedingt für CentOS 7. Ich habe 7 nicht ausreichend recherchiert, um diese Frage für 7 zu beantworten.

John
quelle
1
+1 Und ... nicht ein Geschenk Pferd in den Mund zu sehen, weil Ihre Antwort ist sehr hilfreich, aber ... Würden Sie zufällig von einer Standardmethode wissen, um Dienstleistungen eine Abhängigkeitsreihenfolge zu geben, so dass, wenn eine fehlschlägt Früh in der Kette starten nachfolgende nicht? Ooh- und auch wenn es jemand schafft, die Firewall (irgendwie) zum Absturz zu bringen, dass die Netzwerkschnittstelle "mit dem Schiff ausfällt"? Idealerweise möchte ich, dass alles in Sicherheit ist, auch wenn jemand einen Tag Zeit hat, um die Firewall zu schützen ...
Parthian Shot
5
Bei SysV-Startskripten (dh CentOS 6 und früher) gibt es keine gute Möglichkeit, dies zu tun. CentOS 7 führt Abhängigkeiten nach Ihren Wünschen aus. Wenn B von A abhängt und A ausfällt, wird B nicht gestartet. Für 7, um zu sehen, welche Abhängigkeiten verwendet werden systemctl list-dependencies --all(ich habe mir vor 30 Sekunden die Manpage angesehen).
John
Obwohl diese Nachricht etwas enttäuschend ist (ich bin gerade auf 6), weiß ich jetzt zumindest, dass das Modifizieren der Init-Skripte ein akzeptabel schrecklicher Hack ist.
Parthian Shot
5
Seien Sie beim Ändern von Init-Skripten sehr vorsichtig - dies kann zu Fehlalarmen bei eventuell vorhandener Intrusion Detection-Software führen. Änderungen werden überschrieben, wenn das initscriptsPaket jemals aktualisiert wird (z. B. eine Errata-Version). Ich empfehle das wirklich nicht.
John
Ich habe noch kein IDS eingerichtet, daher sind Fehlalarme im Moment kein Problem (der Server ist noch nicht aktiv und ich weiß, dass ich noch lange nicht bereit bin; diese Frage ist Teil meiner Vorbereitung. Aber ich werde ein HIDS einsetzen). Ich werde so vorsichtig wie möglich sein, und wenn es eine Möglichkeit gibt, die Kernteile der init-Konfiguration nicht manuell zu ändern, mache ich das auf jeden Fall.
Parthian Shot
1

Sie können auch die Option ifup-post in Centos verwenden:

/ etc / sysconfig / network-scripts / ifup-post

Wird aufgerufen, wenn ein Netzwerkgerät AUSSER einem SLIP-Gerät hochgefahren wird. Rufen Sie / etc / sysconfig / network-scripts / ifup-routes auf, um statische Routen aufzurufen, die von diesem Gerät abhängen. Rufen Sie / etc / sysconfig / network-scripts / ifup-aliases auf, um Aliase für dieses Gerät aufzurufen. Legt den Hostnamen fest, sofern er nicht bereits festgelegt wurde, und es kann ein Hostname für die IP für dieses Gerät gefunden werden. Sendet SIGIO an alle Programme, die eine Benachrichtigung über Netzwerkereignisse angefordert haben.

Kann nach Bedarf erweitert werden, um die Nameservice-Konfiguration zu reparieren, beliebige Skripte aufzurufen usw.

Dieses Skript wird ausgeführt und sucht nach den obigen Anweisungen (ifup-route und ifup-aliases) nach ifup-local

if [ -x /sbin/ifup-local ]; then
   /sbin/ifup-local ${DEVICE}
fi

So können Sie diese Datei erstellen und sicherstellen, dass sie iptables erneut aufruft, beispielsweise mit iptables-restore:

iptables-restore < /etc/sysconfig/iptables
Moti
quelle
1

Ein kleiner Nachtrag: Um sicherzustellen, dass die erforderlichen Regeln beim nächsten Start des Servers vorhanden sind, speichern Sie sie mit

sudo sh -c "iptables-save > /etc/iptables.rules"
manu
quelle