PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Firewall Skript sauber/sicher?



variable
10.12.2008, 23:39
Hallo,
ich versuche grade meine vHost mittels iptables abzusichern. Dazu habe ich folgendes Skript geschrieben:


#!/bin/sh
# Flush
iptables -F
iptables -X
iptables -t nat -F

# Standard Policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

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

# Loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# DNS
iptables -A OUTPUT -p tcp --sport 1024: --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 1024: --dport 53 -j ACCEPT

# NTP
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

# APT-GET
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

# SSH
iptables -A INPUT -p tcp -m iprange --src-range *.*.0.1-*.*.255.255 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m iprange --dst-range *.*.0.1-*.*.255.255 --sport 22 -j ACCEPT

# BNC
iptables -A INPUT -p tcp -m iprange --src-range *.*.0.1-*.*.255.255 --dport 5873 -j ACCEPT
iptables -A OUTPUT -p tcp -m iprange --dst-range *.*.0.1-*.*.255.255 --sport 5873 -j ACCEPT

# Connection to IRC
iptables -A OUTPUT -p tcp --dport 7000 -j ACCEPT

Die ersten Zeilen sollten selbsterklärend sein. Der SSH und der Bouncer Port sollen nur einer bestimmten (dynamischen) IP zugänglich sein.
Btw.: Ist es möglich eine Domain als Quelle oder Ziel zu definieren? Also ist es möglich z.B. eine DynDNS dort einzutragen?
Wird dieses Skript den Rechner gut genug abschotten? Sollten andere Optionen gewählt werden?

Vielen Dank im Vorraus,
Variable

Rain_Maker
10.12.2008, 23:47
Vielleicht solltest Du Dir als Alternative zu diesem "IP-Range freigeben" Portknocking ansehen.

pitschi5
11.12.2008, 06:07
Hi,

nur schnell zu deiner Frage, ja ein DynDNS-Alias funktioniert grundsätzlich, allerdings nur solange deine IP nicht ändert, wenn der DynDNS die IP ändert musst du das Firewall-Script neu starten, dann gehts wieder, kann man aber eventuell über einen Cron regeln.

cheers,

hex
11.12.2008, 06:29
Du kannst auch die hosts.allow für SSH mit einem cronjob modifizieren. So hab ich es gemacht. Funktioniert eigentlich recht gut. Einzig wenn die IP umstellt muss ich kurz warten, bis der Server die richtige IP wieder hat. Kam aber bisher nur ein Mal vor. ;)

mfg

variable
11.12.2008, 22:49
Hey,
danke für Eure Antworten.

Die Sache mit dem Portknocking hört sich extrem interessant an. Habe davon vorher noch nichts gehört, aber ich werde mich nun damit beschäftigen. Danke Rain_Maker!

Zu der Sache mit der DynDNS:
Wäre es nicht dann sinnvoll, ein separates Skript für die Regeln von SSH und dem BNC zu erstellen? Ansonsten wird doch die komplette Firewall für einen moment deaktiviert, oder?
Was würde denn mehr Sinn machen bzw was wäre sicherer? Die IP über die iptables durchzulassen oder das auf Anwendungsebene (vom SSHD) übernehmen zu lassen?

Ist der Rest der Firewall Konfiguration denn nun sicher?

Danke,
variable

Tomekk228
12.12.2008, 02:48
Ich gehe mal davon aus das du ein anderen Rechner nur den Zugang zur SSH gewähren willst.

Dieser steht zuhause und hat eine Dynamische IP. Also machst du dir ein Account bei dyndns.org oder no-ip.org (o.ä).

Für dyndns.org Adressen kannst du ddclient nehmen. Für no-ip.org den eigenen von der Page.

Das Tool installierst du auf den Rechner der zugang zum Server haben soll (oder du trägst es im Router ein wenn es unterstützt wird). Zuletzt trägst du dann die dyndns Adresse in iptables ein.

Per host.allow kann man es auch regeln. Es gibt hunderte von wegen dieses "Problem" zu beheben :)

Rain_Maker
12.12.2008, 11:48
Die Sache mit dem Portknocking hört sich extrem interessant an. Habe davon vorher noch nichts gehört, aber ich werde mich nun damit beschäftigen. Danke Rain_Maker!

Zumindest umgeht es das Problem spezieller iptables-Regeln, denn es wird nur der freigegeben, der "richtig anklopft" (für eine von Dir festgelegte Zeit).

Einziger "Haken" an der Geschichte ist natürlich, daß ohne laufenden Portknocking Demon kein Zugriff möglich wäre, weshalb das zusätzlich "abgesichert" werden muss.

Mein Setup sieht prinzipiell so aus (ist nur Spielerei um von "draussen" auf meine Kiste zu Hause zu kommen)

a) Portknocking für Port 22 ist aktiviert, der Port ist natürlich per default vom Paketfilter geblockt

b) DynDNS-Client auf meiner Maschine, der alle 5 Minuten ein Update fährt. Das sorgt eigentlich "nur" dafür, daß eben auch nach einem 24h-Reconnect (mit IP-Wechsel) Zugriff möglich ist.

c) Der Portknocking-Demon und der DynDNS-Client werden per "post up"-Script bei jedem ifup $INTERFACENAME gekillt und neu gestartet

d) Cronjob, der alle 10 Minuten prüft, ob beide Prozesse laufen und ggf. neu startet

Wenn alles klappt, dann kann man von überall auf die Kiste zugreifen, jedoch ist der SSH-Port für einen "Angreifer" immer zu, da der Portknocking-Demon den SSH-Port nur für die IP öffnet, die anklopft, die "Anklopfsequenz" besteht aus der richtigen Reihenfolge von vier Paketen (TCP/UDP gemischt, man kann auch mehr Pakete nehmen, siehe die Doku), also gäbe es 2*65535^4 Möglichkeiten, was für ein "Erraten" doch etwas lange dauern dürfte.

Der Angreifer müsste also "Man in the Middle" spielen können, dagegen kann man sich aber nur auf dem Client-System absichern, auf dem Server kann man dagegen nichts unternehmen.

Und selbst wenn jemand die richtige Sequenz "Erraten" könnte, so muss er immer noch

a) mit der richtigen User-ID einloggen (die nur für diesen Login existiert, danach wechsle ich mit su -u AndererUser zum normalen Systemuser oder root)

b) den passenden Key haben (Login per Passwort ist deaktiviert)

c) die Passphrase zur Freischaltung des Keys haben

d) Username und Passwort eines Users kennen, welcher auf dem System mehr als nur ein bis auf die notwendigen configs (z.B. SSH) praktisch leeres $HOME hat.

Das dürfte auf Serverseite genügen, um etwas ruhiger schlafen zu können (wobei das Ganze für mich eher Spielerei war, weil ich sehen wollte, was man mit diesen Tools so alles anstellen kann).

Gegen kompromittierte Client-Systeme (Keylogger & Co.) kannst Du auf dem Server nichts ausrichten, darum geht es hier aber nicht.

Greetz,

RM

variable
14.12.2008, 11:11
Hey,
@Tomekk:
Eine laufende DynDNS habe ich bereits. Das Problem ist jedoch, dass Iptables die Domain nur ein Mal während des Erstellens der Regel auflöst und dann die IP in die Regel schreibt.

@Rain Maker:
Portknocking ist erfolgreich auf dem Server installiert worden. Funktioniert alles wunderbar. Der Befehl, der von dem knockd ausgeführt wird enthält die DynDNS Adresse und wird daher wenn die Klopfversuche eingegangen sind ausgeführt und die DNS aufgelöst!

Vielen Dank für Eure Mühe,
variable

Rain_Maker
14.12.2008, 11:20
@Rain Maker:
Portknocking ist erfolgreich auf dem Server installiert worden. Funktioniert alles wunderbar. Der Befehl, der von dem knockd ausgeführt wird enthält die DynDNS Adresse und wird daher wenn die Klopfversuche eingegangen sind ausgeführt und die DNS aufgelöst!


Halte ich ehrlicherweise für unnötig, da der knockd per default automatisch für die anklopfende IP den Port öffnet.


start_command = /usr/sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT

Wenn mal "Not am Mann" ist und man von einer anderen Kiste aus draufkommen muss, dann hast Du jedenfalls verloren, der zusätzliche Sicherheitsgewinn, den Zugriff wirklich nur auf die eine Domain zu beschränken, ist IMHO minimal.