Ist mein iptables i.O. für einen Server?

Alles rund um sicherheitsrelevante Fragen und Probleme.
Antworten
bumer
Beiträge: 238
Registriert: 02.07.2014 12:29:15

Ist mein iptables i.O. für einen Server?

Beitrag von bumer » 17.06.2015 13:25:53

Hallo,

ich habe gerade einige iptables-Regeln zusammengefasst. Da ich mich nicht vom vServer aussperren möchte, würde ich es toll finden, wenn Ihr evtl. einen kurzen Blick draufwerft.

Eckdaten:
Ich möchte folgenden eingehenden Verkehr erlauben:
- SSH (habe aber den SSH-Port in der /etc/ssh/sshd_config auf 44077 geändert)
- HTTP und HTTPS
- rsync
- Email (smtp)
Ausgehende Verbindungen:
- DNS

Ist das folgende Skript in Ordnung?

Code: Alles auswählen

# Alle Listen mit bereits erstellten Regeln löschen:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -Z
iptables -t nat -Z
iptables -t mangle -Z

# Alles per Default-Policy verbieten:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Über Looback alles erlauben:
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT

# Alle eingehenden SSH-Verbindungen erlauben:
iptables -A INPUT -i eth0 -p tcp --dport 44077 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 44077 -m state --state ESTABLISHED -j ACCEPT
# Eingehende HTTP- und HTTPS-Verbindungen erlauben:
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# rsync für Backups erlauben:
iptables -A INPUT -i eth0 -p tcp --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
# smtp (email) erlauben:
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

# Ausgehende DNS-Verbindungen:
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

# Schutz vor Syn-Flood:
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
# Port-Scans verbieten:
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# Schutz vor Ping-of-Death:
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# Schutz vor DDOS:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

# Letztendlich wird alles weitere, was 
# bisher nicht explizit vorher erlaubt
# wurde, abgelehnt:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
exit 0 ;

Benutzeravatar
GregorS
Beiträge: 3304
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Ist mein iptables i.O. für einen Server?

Beitrag von GregorS » 17.06.2015 17:07:01

Sieht IMO alles gut aus.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi und sog. Maker)

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Ist mein iptables i.O. für einen Server?

Beitrag von eggy » 18.06.2015 10:37:05

Hat der auch ne v6 IP? Dann das Ruleset für v6 nicht vergessen (ip6tables).
Gegen Aussperren hilft übrigens nen Script im screen, das nach ner definierten Zeitspanne einfach alle Regeln wieder rausnimmt. Dann hast Du im Notfall nach ner Stunde wieder "Vollzugriff", und falls nix schiefgelaufen ist und das Einloggen ging, einfach das Script beenden und alles bleibt wie es soll. Alternativen dazu wären: cronjob/at oder irgendwas fertiges (ich glaube mich dunkel an ne "debianische Lösung" zu erinnern, kennt da jemand nen Paket?).

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Ist mein iptables i.O. für einen Server?

Beitrag von gbotti » 18.06.2015 11:01:00

Das Script schaut gut aus.

Ich habe aber noch Anmerkungen, die jedoch offTopic sind.
Du solltest dir überlegen rsync nicht nach außen zu öffnen. Das native rsync-Protokoll unterstützt keine Verschlüsselung und alle Daten werden lesbar übertragen. Besser wäre es rsync mit der Option -e 'ssh -p 44077' zu verwenden, da dann der Übertragungsweg verschlüsselt wird.

SSH ist sowieso nach außen offen und du hast dann eine potentielle Sicherheitslücke weniger auf dem System offen.

Ich gehe davon aus, dass du SMTP ohne Verschlüsselung (Port 25) betreibst. SMTP ohne SSL/TLS/'was auch immer' ist nicht gut, da im Klartext übertragen wird. Selbst ein selbstsigniertes Zertifikat mit Verschlüsselung ist sicherer.

Code: Alles auswählen

# Letztendlich wird alles weitere, was 
# bisher nicht explizit vorher erlaubt
# wurde, abgelehnt:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Das ist doppelt gemoppelt. Am Anfang des Scriptes hast du die Policies für die Chains bereits gesetzt.

Code: Alles auswählen

# Schutz vor DDOS:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
Schön, dass du den DDOS-Schutz drin hast, jedoch bringt das in den meisten Fällen nicht viel. Ein DDOS (Distributed Denial of Service) wird (normalerweise) verteilt über viele Systeme ausgeführt. Gehen wir mal davon aus, dass du an dem vServer maximal 1GBit/s (shared) zur Verfügung hast. Das RZ ist in der Regel mit x mal mehreren GBit/s angebunden und es findet ein Angriff mit mehr als 1GBit/s Paketen statt. Das hilft dir vielleicht bei kleineren Angriffen, wenn die Requests nicht mehr von Beispielsweise dem Webserver bearbeitet werden müssen, da ein DROP viel schneller geht und die Verbindung damit weg ist. Die Leitung ist dann dennoch dicht (Stau im Kabel). In den meisten Fällen geht der Hoster dann her und sperrt den Angriff am Core-Router.

Dennoch ist das für ein anderes Szenario Sinnvoll. Wenn jemand den Login für deine Seite hacken will, dann passiert das (in meinen Fällen) häufig mit vereinzelten Systemen, die dann immer wieder geblockt werden. Außerdem kann man dadurch Scraper verärgern, da die dann häufig unbrauchbare Daten kriegen.
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

bumer
Beiträge: 238
Registriert: 02.07.2014 12:29:15

Re: Ist mein iptables i.O. für einen Server?

Beitrag von bumer » 18.06.2015 12:41:04

eggy hat geschrieben:Hat der auch ne v6 IP? Dann das Ruleset für v6 nicht vergessen (ip6tables).
Danke für den Hinweis. Ich nutze kein IPv6, das Kernel-Modul ist bei mir auch nicht geladen.

Code: Alles auswählen

lsmod | grep ipv6
eggy hat geschrieben:Gegen Aussperren hilft übrigens nen Script im screen, das nach ner definierten Zeitspanne einfach alle Regeln wieder rausnimmt.
Die Firewall soll sich automatisch nach einer h ausschalten? Könntest du darauf bitte etwas näher eingehen? Ist mir nicht ganz klar was du meinst.
Ich habe das Skript geprüft, funkt alles wunderbar, jetzt wollte ich das ganze per Cronjob verankern:

Code: Alles auswählen

@reboot root /bin/bash /root/bin/dasskript
gbotti hat geschrieben:Du solltest dir überlegen rsync nicht nach außen zu öffnen ... Besser wäre es rsync mit der Option -e 'ssh -p 44077' zu verwenden, da dann der Übertragungsweg verschlüsselt wird.
Danke für den Hinweis, ja, genau so mache ich es eigentlich auch. Die RSYNC-Passage ist somit nutzlos, ich dachte ich muss das nochmal separat einfügen. RSYNC kann natürlich den SSH-Zugangsport (mit -e Option) nutzen.
gbotti hat geschrieben:Ich gehe davon aus, dass du SMTP ohne Verschlüsselung (Port 25) betreibst. SMTP ohne SSL/TLS/'was auch immer' ist nicht gut, da im Klartext übertragen wird. Selbst ein selbstsigniertes Zertifikat mit Verschlüsselung ist sicherer.
Das ganze Email-Zeugs habe ich vorab erst einmal nur so eingefügt, habe den Email-Server noch nicht konfiguriert. Alles, was mit Email zu tun hat, ist auch vorerst ausgeklammert. Ich werde dann natürlich nach einer sicheren Lösung suchen.
gbotti hat geschrieben:

Code: Alles auswählen

# Letztendlich wird alles weitere, was 
# bisher nicht explizit vorher erlaubt
# wurde, abgelehnt:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Das ist doppelt gemoppelt. Am Anfang des Scriptes hast du die Policies für die Chains bereits gesetzt.
Ist gelöscht :THX:
gbotti hat geschrieben:

Code: Alles auswählen

# Schutz vor DDOS:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
Schön, dass du den DDOS-Schutz drin hast, jedoch bringt das in den meisten Fällen nicht viel. Ein DDOS (Distributed Denial of Service) wird (normalerweise) verteilt über viele Systeme ausgeführt. Gehen wir mal davon aus, dass du an dem vServer maximal 1GBit/s (shared) zur Verfügung hast. Das RZ ist in der Regel mit x mal mehreren GBit/s angebunden und es findet ein Angriff mit mehr als 1GBit/s Paketen statt. Das hilft dir vielleicht bei kleineren Angriffen, wenn die Requests nicht mehr von Beispielsweise dem Webserver bearbeitet werden müssen, da ein DROP viel schneller geht und die Verbindung damit weg ist. Die Leitung ist dann dennoch dicht (Stau im Kabel). In den meisten Fällen geht der Hoster dann her und sperrt den Angriff am Core-Router.

Dennoch ist das für ein anderes Szenario Sinnvoll. Wenn jemand den Login für deine Seite hacken will, dann passiert das (in meinen Fällen) häufig mit vereinzelten Systemen, die dann immer wieder geblockt werden. Außerdem kann man dadurch Scraper verärgern, da die dann häufig unbrauchbare Daten kriegen.
Ich nehme den Teil einfach raus, denn:
1. Anscheinend ist das Teil gegen DDOS nutzlos.
2. Mein Hoster bietet einen speziellen DDOS Schutz an, wie sich gerade herausgestellt hat.
3. Meinen Login kann man nicht hacken, ich nutze einen SSH-Key.

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Ist mein iptables i.O. für einen Server?

Beitrag von gbotti » 18.06.2015 12:57:47

bumer hat geschrieben: Ich nehme den Teil einfach raus, denn:
1. Anscheinend ist das Teil gegen DDOS nutzlos.
2. Mein Hoster bietet einen speziellen DDOS Schutz an, wie sich gerade herausgestellt hat.
3. Meinen Login kann man nicht hacken, ich nutze einen SSH-Key.
Dennoch kann es Sinnvoll sein. Ein Drop von IPTables ist in der Regel für das System weniger belastend als eine Antwort von einem Daemon. Das habe ich grad vorhin übersehen, für SSH müsstest du jedoch noch den Port an passen :D
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

bumer
Beiträge: 238
Registriert: 02.07.2014 12:29:15

Re: Ist mein iptables i.O. für einen Server?

Beitrag von bumer » 18.06.2015 13:02:33

gbotti hat geschrieben: Dennoch kann es Sinnvoll sein. Ein Drop von IPTables ist in der Regel für das System weniger belastend als eine Antwort von einem Daemon.
Habs stehen lassen :)
gbotti hat geschrieben: Das habe ich grad vorhin übersehen, für SSH müsstest du jedoch noch den Port an passen :D
Das ist bei mir der richtige SSH-Port (44077). Habe das ganze so per sshd_config angepasst um nicht per-default 22 nutzen zu müssen.

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Ist mein iptables i.O. für einen Server?

Beitrag von gbotti » 18.06.2015 13:05:34

bumer hat geschrieben:

Code: Alles auswählen

...
# Schutz vor DDOS:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
...
Ja, SSH ist auf 44077, aber die DDOS-Rule greift nur auf Port 80.
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Antworten