Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Rund um die Sicherheit des Systems und die Applikationen
mad cow
Posts: 33
Joined: 2006-11-23 22:57
Location: Heidelberg (Baden)
 

Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by mad cow »

Hallo und guten Abend,

in den letzten Tagen habe ich ein kleines Skript zusammengebastelt. Jetzt wollte ich fragen, ob das so in Ordnung geht.

Ob die Regeln für Samba tun, weiß ich nicht, weil ich sie noch nicht testen konnte. Was mir noch Sorgen macht, sind ping-flood und syn-flood. Was kann man noch am Skript machen, um den Server sicher zu bekommen?

Code: Select all

#!/bin/bash

LOOP=127.0.0.1
ADDRESS=xxx.xxx.233.240
NETWORK=xxx.xxx.233.0/24
DNS0=xxx.xxx.100.126
DNS1=xxx.xxx.210.127

start() {
    echo "Starting iptables."
	
    # loading needed modules
    modprobe ip_tables
    modprobe ip_conntrack
    modprobe ip_conntrack_irc
    modprobe ip_conntrack_ftp
    modprobe ipt_state
    modprobe ipt_LOG
    modprobe ipt_limit

    # don't log to consoles
    #dmesg -n 2

    # setting default policies
    iptables -F
    iptables -X
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP

    # don't disturb the loopback device
    iptables -A INPUT -i lo -s $LOOP -d $LOOP -j ACCEPT
    iptables -A OUTPUT -o lo -s $LOOP -d $LOOP -j ACCEPT

    ###############
    # input chain #
    ###############

    # dns
    iptables -A INPUT -p udp -s $DNS0 --sport 53 -j ACCEPT
    iptables -A INPUT -p tcp -s $DNS0 --sport 53 -j ACCEPT

    iptables -A INPUT -p udp -s $DNS1 --sport 53 -j ACCEPT
    iptables -A INPUT -p tcp -s $DNS1 --sport 53 -j ACCEPT

    # ssh
    iptables -A INPUT -m tcp -p tcp -d $ADDRESS --dport 22 
        -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -m tcp -p tcp -s $NETWORK 
        -d $ADDRESS --dport 22 -j ACCEPT
    iptables -A INPUT -m tcp -p tcp -d $ADDRESS --dport 22 
        -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT
    iptables -A INPUT -m tcp -p tcp -d $ADDRESS --dport 22 -j DROP
    # local ssh client to some server
    iptables -A INPUT -m tcp -p tcp -d $ADDRESS --sport 22 
        -m state --state ESTABLISHED,RELATED -j ACCEPT

    # allow samba shares
    iptables -A INPUT -p tcp -s $NETWORK -d $ADDRESS 
        --dport 137:139 -m state --state NEW -j ACCEPT
    iptables -A INPUT -p tcp -s $NETWORK -d $ADDRESS 
        --dport 445 -m state --state NEW -j ACCEPT
    iptables -A INPUT -p udp -s $NETWORK -d $ADDRESS 
        --dport 137:139 -m state --state NEW -j ACCEPT
    iptables -A INPUT -p udp -s $NETWORK -d $ADDRESS 
        --dport 445 -m state --state NEW -j ACCEPT

    # http
    iptables -A INPUT -p tcp -d $ADDRESS --sport 80 -j ACCEPT
    iptables -A INPUT -p tcp -d $ADDRESS --dport 80 -j ACCEPT

    # ping
    iptables -A INPUT -p icmp -d $ADDRESS -j ACCEPT

    ################
    # output chain #
    ################

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

    # ssh
    iptables -A OUTPUT -p tcp -s $ADDRESS --sport 22 -j ACCEPT
    # local ssh client to some server
    iptables -A OUTPUT -p tcp -s $ADDRESS --dport 22 -j ACCEPT

    # allow samba shares
    iptables -A OUTPUT -p tcp -s $ADDRESS --sport 137:139 -d $NETWORK 
        -m state --state NEW -j ACCEPT
    iptables -A OUTPUT -p tcp -s $ADDRESS --sport 445 -d $NETWORK 
        -m state --state NEW -j ACCEPT
    iptables -A OUTPUT -p udp -s $ADDRESS --sport 137:139 -d $NETWORK 
        -m state --state NEW -j ACCEPT
    iptables -A OUTPUT -p udp -s $ADDRESS --sport 445 -d $NETWORK 
        -m state --state NEW -j ACCEPT

    # http
    iptables -A OUTPUT -p tcp -s $ADDRESS --dport 80 -j ACCEPT
    iptables -A OUTPUT -p tcp -s $ADDRESS --sport 80 -j ACCEPT

    # ping 
    iptables -A OUTPUT -p icmp -s $ADDRESS -j ACCEPT

    ###########
    # logging #
    ###########

    iptables -A INPUT -d $ADDRESS -m state --state NEW,INVALID 
        -j LOG --log-prefix "firewall-in "
    iptables -A OUTPUT -s $ADDRESS -m state --state NEW,INVALID 
        -j LOG --log-prefix "firewall-out "
}

stop() {
    echo "Stopping iptables."
    iptables -F
    iptables -X
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT
}

status() {
    iptables -L -vn
}

case "$1" in
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	stop
	start
	;;
    status)
	status
	;;
    *)
	echo "Usage: $0 start|stop|restart|status"
	exit 1
	;;
esac

exit 0
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by rootsvr »

Wenn Du mal ein bischen gelesen hättest wüßtest Du das die weitverbreitete Einstellung hier ist: Firewalls bringen nichts auf dem Server. Wenn kein Prozess läuft horcht eh nichts, wenn jemand was fremdes unterschieben kann kann er auch die Firewall ändern.

--> Daher würde iptables nur eine zusätzlichen Fehlermöglichkeit bringen und Performance kosten
lucki2
Posts: 427
Joined: 2006-10-03 01:31
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by lucki2 »

--sport !
SPORT ist Mord. Schon mal gehört? Besonders wenn zusätzlich decrementiert. Hier hat es die Firewall getroffen.("casuality" würden die Engländer sagen):wink:

Code: Select all

iptables -N allowed
iptables -A allowed -p tcp --syn -j ACCEPT
iptables -A allowed -p tcp  -m state -state ESTABLISHED,RELATED,NEW -j ACCEPT
iptables -A allowed -j LOG --log-prefix "$WASWEISICH"

iptables -A INPUT -i $if -d $ifadr -p tcp -m multiport -dports "por1,port2,port4" -j allowed
Irgendwie so - Deine FW Scripts werde ich nicht debuggen.

PS: das ist das Problem, wo ich sledge 100% Recht gebe. Da kommt eine FW hin und dann neigen die Leute dazu sich sicher zu fühlen - Pustekuchen. Bei Samba finde ich aber FW sinnvoll, das schützt die Anderen im internet immerhin vor unnützen Broadcasts misskonfigurierter Sambaserver auf Rootservern.
mad cow
Posts: 33
Joined: 2006-11-23 22:57
Location: Heidelberg (Baden)
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by mad cow »

Entschuldigung, dass ich mich jetzt erst melde. Nach einigen Stunden habe ich nicht mehr mit einer Antwort gerechnet.
rootsvr wrote:Wenn Du mal ein bischen gelesen hättest wüßtest Du das die weitverbreitete Einstellung hier ist: Firewalls bringen nichts auf dem Server. Wenn kein Prozess läuft horcht eh nichts, wenn jemand was fremdes unterschieben kann kann er auch die Firewall ändern.

--> Daher würde iptables nur eine zusätzlichen Fehlermöglichkeit bringen und Performance kosten
Performance ist nicht das Problem. Die dürfte uns dicke reichen. Dass Firewalls nichts auf einem Server bringen, kann man behaupten. Aber gegen DoS-Attacken usw. sollte man sich schon schützen.
lucki2 wrote:--sport !
SPORT ist Mord. Schon mal gehört? Besonders wenn zusätzlich decrementiert. Hier hat es die Firewall getroffen.("casuality" würden die Engländer sagen):wink:

Code: Select all

iptables -N allowed
iptables -A allowed -p tcp --syn -j ACCEPT
iptables -A allowed -p tcp  -m state -state ESTABLISHED,RELATED,NEW -j ACCEPT
iptables -A allowed -j LOG --log-prefix "$WASWEISICH"

iptables -A INPUT -i $if -d $ifadr -p tcp -m multiport -dports "por1,port2,port4" -j allowed
Irgendwie so - Deine FW Scripts werde ich nicht debuggen.

PS: das ist das Problem, wo ich sledge 100% Recht gebe. Da kommt eine FW hin und dann neigen die Leute dazu sich sicher zu fühlen - Pustekuchen. Bei Samba finde ich aber FW sinnvoll, das schützt die Anderen im internet immerhin vor unnützen Broadcasts misskonfigurierter Sambaserver auf Rootservern.
Mir ist auch klar, dass eine FW kein 100%iger Schutz ist. Aber sie bietet etwas Schutz vor ein paar Spinnern.

---

Mir ging es mehr darum nachzufragen, ob hier jemandem ein übles Sicherheitsloch auffällt.

Sport finde ich garnicht schlecht, auch nicht als '--sport'. Wenn ich es nicht einsetze, kann ich gleich alle Ports aufmachen. Ansonsten finde ich das Skript nicht schlecht (unten seht ihr die neue Version).

Da es sich um einen Uni-Server handelt, verlangt man von mir, dass eine FW darauf läuft. Sie bringt keinen perfekten Schutz, engt Angreifer aber sehr ein. Mehr muss sie nicht können.

Wenn ihr etwas an dem neuen Skript auszusetzen habt ist das kein Problem. Bitte gebt dann aber an, welche Zeilen euch nicht passen.

Code: Select all

#!/bin/bash

LOOPBACK=127.0.0.1
NETWORK=xxx.xxx.233.0/24
DNS0=xxx.xxx.100.126
DNS1=xxx.xxx.210.127
IPTABLES=$(which iptables)

start() {
    echo "Starting iptables."
	
    # loading needed modules
    modprobe ip_tables
    modprobe ip_conntrack
    modprobe ip_conntrack_irc
    modprobe ip_conntrack_ftp
    modprobe ipt_state
    modprobe ipt_LOG
    modprobe ipt_limit

    # don't log to consoles
    dmesg -n 2

    #####################
    # kernel parameters #
    #####################

    # activate syn cookies
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    # ignore broadcast pings
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    # ignore false error responses
    echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 
    # drop packets if buffer is full
    echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
    # limit icmp packets
    echo 5 > /proc/sys/net/ipv4/icmp_ratelimit
    # FIN,ACK timeout
    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
    # anti ip-spoofing
    for i in /proc/sys/net/ipv4/conf/*; do echo 1 > $i/rp_filter; done
    # log packets from mars
    for i in /proc/sys/net/ipv4/conf/*; do echo 1 > $i/log_martians; done
    # kill packets from 0.x.x.x
    for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/bootp_relay; done
    # deny source routed packets
    for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/accept_source_route; done
    # no redirects allowed
    for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $i; done
    for i in /proc/sys/net/ipv4/conf/*/send_redirects; do echo 0 > $i; done

    # setting default policies
    $IPTABLES -F
    $IPTABLES -X
    $IPTABLES -P INPUT DROP
    $IPTABLES -P FORWARD DROP
    $IPTABLES -P OUTPUT DROP

    # don't disturb the loopback device
    $IPTABLES -A INPUT -i lo -s $LOOPBACK -d $LOOPBACK -j ACCEPT
    $IPTABLES -A OUTPUT -o lo -s $LOOPBACK -d $LOOPBACK -j ACCEPT

    ###############
    # input chain #
    ###############

    # SYN flood protection
    $IPTABLES -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    $IPTABLES -A INPUT -p tcp --syn -j DROP

    # drop all incoming sh*t
    $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    $IPTABLES -A INPUT -f -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

    # ping
    PING_LIMIT="--limit 1/s --limit-burst 1"
    $IPTABLES -A INPUT -p icmp --icmp-type 0 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 3 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 4 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 11 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 12 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 0  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 3  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 4  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 8  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 11  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 12  -j DROP

    # dns
    $IPTABLES -A INPUT -p udp -s $DNS0 --sport 53 -j ACCEPT
    $IPTABLES -A INPUT -p tcp -s $DNS0 --sport 53 -j ACCEPT

    $IPTABLES -A INPUT -p udp -s $DNS1 --sport 53 -j ACCEPT
    $IPTABLES -A INPUT -p tcp -s $DNS1 --sport 53 -j ACCEPT

    # ssh
    SSH_LIMIT="--limit 3/min --limit-burst 3"
    $IPTABLES -A INPUT -p tcp -s $NETWORK --dport 22 -j ACCEPT
    $IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m limit $SSH_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p tcp --dport 22 -j DROP
    # local ssh client to some server
    $IPTABLES -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT

    # allow samba shares
    $IPTABLES -A INPUT -p tcp -s $NETWORK --dport 137:139 -j ACCEPT
    $IPTABLES -A INPUT -p tcp -s $NETWORK --dport 445 -j ACCEPT
    $IPTABLES -A INPUT -p udp -s $NETWORK --dport 137:139 -j ACCEPT
    $IPTABLES -A INPUT -p udp -s $NETWORK --dport 445 -j ACCEPT

    # http
    $IPTABLES -A INPUT -p tcp --sport 80 -j ACCEPT
    $IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT

    # ntp
    $IPTABLES -A INPUT -p udp --sport 123 -j ACCEPT

    ################
    # output chain #
    ################

    # ping
    $IPTABLES -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT

    # dns
    $IPTABLES -A OUTPUT -p udp --sport 1024: --dport 53 -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --sport 1024: --dport 53 -j ACCEPT

    # ssh
    $IPTABLES -A OUTPUT -p tcp --sport 22 -j ACCEPT
    # local ssh client to some server
    $IPTABLES -A OUTPUT -p tcp --dport 22 -j ACCEPT

    # allow samba shares
    $IPTABLES -A OUTPUT -p tcp --sport 137:139 -d $NETWORK -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --sport 445 -d $NETWORK -j ACCEPT
    $IPTABLES -A OUTPUT -p udp --sport 137:139 -d $NETWORK -j ACCEPT
    $IPTABLES -A OUTPUT -p udp --sport 445 -d $NETWORK -j ACCEPT

    # http
    $IPTABLES -A OUTPUT -p tcp --dport 80 -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --sport 80 -j ACCEPT

    # ntp
    $IPTABLES -A OUTPUT -p udp --dport 123 -j ACCEPT

    ###########
    # logging #
    ###########

    $IPTABLES -A INPUT  -m state --state NEW,INVALID -j LOG --log-prefix "firewall-in "
    $IPTABLES -A OUTPUT -m state --state NEW,INVALID -j LOG --log-prefix "firewall-out "
}

stop() {
    echo "Stopping iptables."
    $IPTABLES -F
    $IPTABLES -X
    $IPTABLES -P INPUT ACCEPT
    $IPTABLES -P FORWARD ACCEPT
    $IPTABLES -P OUTPUT ACCEPT
}

status() {
    $IPTABLES -L -vn
}

case "$1" in
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	stop
	start
	;;
    status)
	status
	;;
    *)
	echo "Usage: $0 start|stop|restart|status"
	exit 1
	;;
esac

exit 0
lucki2
Posts: 427
Joined: 2006-10-03 01:31
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by lucki2 »

Kapier es:
Deine Firewall ist Meilenweit offen!
wegen sport!
'--sport'. Wenn ich es nicht einsetze, kann ich gleich alle Ports aufmachen.
umgekehrt, wie bei Dir zu sehen!
User avatar
nyxus
Posts: 626
Joined: 2002-09-13 08:41
Location: Lübeck
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by nyxus »

lucki2 wrote:Kapier es:
Deine Firewall ist Meilenweit offen!
wegen sport!
Nicht, daß ich mich wirklich mit IPTables auskennen würde, aber in jeder anderen anständigen Firewall-Konfig gehört es dazu auch die Source-Ports einzugrenzen soweit man sie kennt.
Und in seinem Beispiel grenzt er die Anfragen seiner weiteren DNS-Server ein, weil er z.B. weiß daß die konfiguriert sind von Port 53 zu kommen, bei ausgehenden DNS-queries benutzt er gt1023 was auch in Ordnung ist. Die Zeilen für SSH und HTTP mit source 22 bzw. 80 leuchten mir nicht ganz ein. Dafür doch auch irgendeine Art von "state-tracking" möglich sein (evtl. dieses "ESTABLISHED,RELATED" weiter oben?).
lucki2
Posts: 427
Joined: 2006-10-03 01:31
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by lucki2 »

So so.
Du kannst über sport nicht filtern, weil Du nicht weißt, wer hinter sport steckt.
An welchen Ports Deine Server lauschen weißt Du schon.

Wenn das jemand bewußt ist und dann doch sport für etwas braucht ist es was anderes. Hier versucht jemand über sport herauszufinden, was für ein Service connecten will: geht nicht, öffnet alle die Türen. Was Du machen kannst ist das RELATED aus der Contrac rausnehmen, wenn Du willst - dann gehen forks auf clients nach dem Handshake u.U. nicht mehr, aber eine Option.
danu
Posts: 264
Joined: 2005-02-02 11:15
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by danu »

Aber gegen DoS-Attacken usw. sollte man sich schon schützen.
Auf dem Server selber hilft da mod_evasive wirkungsvoll.
Dazu einen externen Firewall welcher entsprechende Signaturen filtern kann.
mad cow
Posts: 33
Joined: 2006-11-23 22:57
Location: Heidelberg (Baden)
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by mad cow »

Nyxus wrote:Die Zeilen für SSH und HTTP mit source 22 bzw. 80 leuchten mir nicht ganz ein. Dafür doch auch irgendeine Art von "state-tracking" möglich sein (evtl. dieses "ESTABLISHED,RELATED" weiter oben?).
Da hast du recht, damit sollten die beiden Regeln einiges besser sein. Das müsste dann so aussehen:

Code: Select all

$IPTABLES -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
lucki2 wrote:So so.
Du kannst über sport nicht filtern, weil Du nicht weißt, wer hinter sport steckt.
An welchen Ports Deine Server lauschen weißt Du schon.
Wer dahinter steckt, kann ich in der Tat nicht wissen. Jetzt verstehe ich langsam, was du gemeint hast. Also sollte ich alle Regeln mit '--sport' dadurch ersetzen:

Code: Select all

$IPTABLES -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
lucki2 wrote:Wenn das jemand bewußt ist und dann doch sport für etwas braucht ist es was anderes. Hier versucht jemand über sport herauszufinden, was für ein Service connecten will: geht nicht, öffnet alle die Türen. Was Du machen kannst ist das RELATED aus der Contrac rausnehmen, wenn Du willst - dann gehen forks auf clients nach dem Handshake u.U. nicht mehr, aber eine Option.
Wenn ich dich richtig verstehe, sollten die Regeln dann so aussehen?:

Code: Select all

$IPTABLES -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Mir war überhaupt nicht klar, was man potentiell mit '--sport' alles anrichten kann. Also werden jetzt alle Regeln, die es enthalten ersetzt. Das wird aber erst gegen Mittag was. Denn über ssh kann ich gerade nicht rein. Die Regeln hier haben eine Macke, wahrscheinlich weil ich einen Teil speichere:

Code: Select all

SSH_LIMIT="--limit 3/min --limit-burst 3"
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m limit $SSH_LIMIT -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j DROP
Vor dieser Änderung hat es noch getan.

Bei den Regeln zu DNS sollte man den '--sport' vielleicht schon drinlassen. Er betrifft ja nur 2 DNS-Server. Die brauchen nicht auf jeden Port. Wie ich das bei NTP löse, weiß ich noch nicht.

Bis später und danke für eure wertvollen Tipps. :-D
lucki2
Posts: 427
Joined: 2006-10-03 01:31
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by lucki2 »

Du mußt response und connect chain unterscheiden.
So sieht ein ssh connect aus(schnell hier von lo auf lo rausgedumpt):

Code: Select all

10:51:43.834688 IP localhost.40833 > localhost.ssh: S 2646789846:2646789846(0) win 32792 <mss 16396,sackOK,timestamp 237812 0,nop,wscale 6>
sync

Code: Select all

10:51:43.835163 IP localhost.ssh > localhost.40833: S 2644967943:2644967943(0) ack 2646789847 win 32768 <mss 16396,sackOK,timestamp 237812 237812,nop,wscale 6>
sync ack

Code: Select all

10:51:43.835233 IP localhost.40833 > localhost.ssh: . ack 1 win 513 <nop,nop,timestamp 237812 237812>
ack

Das ist typisch für jeden tcp connect und danach ist die established! Das mußt Du zu lassen.
Dann kennt die Statemashine als Verbindung die Sockets
localhost.40833 und localhost.ssh
Die beiden gehören zusammen und das, was zwischen denen fließt ist established.
Synfloodingschutz machst Du über Kernel.

UDP ist komplizierter, weil da kein Handshake passiert. Glück gehabt: da haben sich Leute Gedanken gemacht und die Statemashine kennt auch für udp connection tracking - gute Sache.

FTP ist z.B. noch komplexer, weil da noch eine zweite Verbindung aufgemacht wird. Dafür bräuchtest Du related. Wobei Du schon conntrack_ftp entdeckt hast. Das ist dafür besser: das weiß wie ftp sich verbindet -> besser als über related. Kam aber erst später in die iptables rein.

Wie Du an dem Beispiel sehen kannst ist der SPORT 40833 und mitnichten 22. Erst bei der Antwort ist SPORT 22 und dann hast Du aber eine Verbindung und da weiß conntrack nicht nur sport sondern auch den Socket, der die Verbindung aufgemacht hat also ip+dport, was Du so gar nicht angeben könntest.
mad cow
Posts: 33
Joined: 2006-11-23 22:57
Location: Heidelberg (Baden)
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by mad cow »

Danke für die Hintergrundinformationen. Das war mir so nicht bewusst.

Den '--sport' habe ich jetzt mal aus dem Input-Chain entfernt. Das dürfte einige Probleme lösen. Nur für DNS gibt es noch einen Source-Port, aber das kann denke ich nicht schaden, weil man zuerst einen der DNS-Server der Uni hacken müsste, um das ausnutzen zu können. Im Output-Chain habe ich die Source-Ports drin gelassen, damit nicht alles nach draußen kommt. Das sollte so aber passen.

Das ftp-Modul ist tatsächlich eine geniale Sache. Damit spart man sich zumindest das RELATED.

Hier wieder mal eine geänderte Variante. Kritik ist ausdrücklich erwünscht.

Code: Select all

#!/bin/bash

LOOPBACK=127.0.0.1
NETWORK=xxx.xxx.233.0/24
DNS0=xxx.xxx.100.126
DNS1=xxx.xxx.210.127
IPTABLES=$(which iptables)

start() {
    echo "Starting iptables."
	
    # loading needed modules
    modprobe ip_tables
    modprobe ip_conntrack
    modprobe ip_conntrack_ftp
    modprobe ipt_state
    modprobe ipt_LOG
    modprobe ipt_limit

    # don't log to consoles
    dmesg -n 2

    #####################
    # kernel parameters #
    #####################

    # activate syn cookies
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    # ignore broadcast pings
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    # ignore false error responses
    echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 
    # drop packets if buffer is full
    echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
    # limit icmp packets
    echo 5 > /proc/sys/net/ipv4/icmp_ratelimit
    # FIN,ACK timeout
    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
    # anti ip-spoofing
    for i in /proc/sys/net/ipv4/conf/*; do echo 1 > $i/rp_filter; done
    # log packets from mars
    for i in /proc/sys/net/ipv4/conf/*; do echo 1 > $i/log_martians; done
    # kill packets from 0.x.x.x
    for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/bootp_relay; done
    # deny source routed packets
    for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/accept_source_route; done
    # no redirects allowed
    for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $i; done
    for i in /proc/sys/net/ipv4/conf/*/send_redirects; do echo 0 > $i; done

    # setting default policies
    $IPTABLES -F
    $IPTABLES -X
    $IPTABLES -P INPUT DROP
    $IPTABLES -P FORWARD DROP
    $IPTABLES -P OUTPUT DROP

    # don't disturb the loopback device
    $IPTABLES -A INPUT -i lo -s $LOOPBACK -d $LOOPBACK -j ACCEPT
    $IPTABLES -A OUTPUT -o lo -s $LOOPBACK -d $LOOPBACK -j ACCEPT

    ###############
    # input chain #
    ###############

    # let established connections in
    $IPTABLES -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

    # SYN flood protection
    $IPTABLES -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    $IPTABLES -A INPUT -p tcp --syn -j DROP

    # drop all incoming sh*t
    $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    $IPTABLES -A INPUT -f -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

    # ping
    PING_LIMIT="--limit 1/s --limit-burst 1"
    $IPTABLES -A INPUT -p icmp --icmp-type 0 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 3 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 4 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 11 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 12 -m limit $PING_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 0  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 3  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 4  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 8  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 11  -j DROP
    $IPTABLES -A INPUT -p icmp --icmp-type 12  -j DROP

    # dns
    $IPTABLES -A INPUT -p udp -s $DNS0 --sport 53 -j ACCEPT
    $IPTABLES -A INPUT -p tcp -s $DNS0 --sport 53 -j ACCEPT
    $IPTABLES -A INPUT -p udp -s $DNS1 --sport 53 -j ACCEPT
    $IPTABLES -A INPUT -p tcp -s $DNS1 --sport 53 -j ACCEPT

    # ssh
    SSH_LIMIT="--limit 3/min --limit-burst 3"
    $IPTABLES -A INPUT -p tcp -s $NETWORK --dport 22 -j ACCEPT
    $IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m limit $SSH_LIMIT -j ACCEPT
    $IPTABLES -A INPUT -p tcp --dport 22 -j DROP

    # allow samba shares
    $IPTABLES -A INPUT -p tcp -s $NETWORK --dport 137:139 -j ACCEPT
    $IPTABLES -A INPUT -p tcp -s $NETWORK --dport 445 -j ACCEPT
    $IPTABLES -A INPUT -p udp -s $NETWORK --dport 137:139 -j ACCEPT
    $IPTABLES -A INPUT -p udp -s $NETWORK --dport 445 -j ACCEPT

    # http
    $IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT

    ################
    # output chain #
    ################

    # ping
    $IPTABLES -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT

    # dns
    $IPTABLES -A OUTPUT -p udp --sport 1024: --dport 53 -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --sport 1024: --dport 53 -j ACCEPT

    # ssh
    $IPTABLES -A OUTPUT -p tcp --sport 22 -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --dport 22 -j ACCEPT

    # passive ftp
    $IPTABLES -A OUTPUT -p tcp --sport 1024: --dport 21 -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --sport 1024: --dport 1024: -j ACCEPT

    # allow samba shares
    $IPTABLES -A OUTPUT -p tcp --sport 137:139 -d $NETWORK -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --sport 445 -d $NETWORK -j ACCEPT
    $IPTABLES -A OUTPUT -p udp --sport 137:139 -d $NETWORK -j ACCEPT
    $IPTABLES -A OUTPUT -p udp --sport 445 -d $NETWORK -j ACCEPT

    # http
    $IPTABLES -A OUTPUT -p tcp --sport 80 -j ACCEPT
    $IPTABLES -A OUTPUT -p tcp --dport 80 -j ACCEPT

    # ntp
    $IPTABLES -A OUTPUT -p udp --dport 123 -j ACCEPT

    ###########
    # logging #
    ###########

    $IPTABLES -A INPUT  -m state --state NEW,INVALID -j LOG --log-prefix "firewall-in "
    $IPTABLES -A OUTPUT -m state --state NEW,INVALID -j LOG --log-prefix "firewall-out "
}

stop() {
    echo "Stopping iptables."
    $IPTABLES -F
    $IPTABLES -X
    $IPTABLES -P INPUT ACCEPT
    $IPTABLES -P FORWARD ACCEPT
    $IPTABLES -P OUTPUT ACCEPT
}

status() {
    $IPTABLES -L -vn
}

case "$1" in
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	stop
	start
	;;
    status)
	status
	;;
    *)
	echo "Usage: $0 start|stop|restart|status"
	exit 1
	;;
esac

exit 0
lucki2
Posts: 427
Joined: 2006-10-03 01:31
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by lucki2 »

Schau Dir nochmal das Howto an:
http://iptables-tutorial.frozentux.net/ ... orial.html
Gerade neu überarbeitet, wie ich sehe. Das ist imho total schön, ausführlich und verständlich erklärt. Mit Bildern die manche Sachen gut illustrieren. Wärmstens zu empfehlen. Und dann ... dann packst Du nmap und nessus aus und ärgerst Deine FW und schaust nach, bei welchen Angriffen Deine Firewall Alarm schlägt oder ob nessus nicht sogar Dein System zum crashen bringt - soll ja auch schon vorgekommen sein.

Disclaimer, damit mir keiner Ärger macht:
Die beiden Tools benutzt Du bitte nur für Deine Seite und in Absprache mit Deinem Provider, sonst fängst Du Dir u.U. eine Anzeige ein.
User avatar
nyxus
Posts: 626
Joined: 2002-09-13 08:41
Location: Lübeck
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by nyxus »

lucki2 wrote:So so.
Du kannst über sport nicht filtern, weil Du nicht weißt, wer hinter sport steckt.
An welchen Ports Deine Server lauschen weißt Du schon.
Nö, kein "so so". Denn natürlich weiß man bei einer typischen Client-Server-Kommunikation den Source-Port nicht, da er irgendein Port >1023 ist. Und genau darauf habe ich mich bezogen. Deine erste Nachricht liest sich, als sollte man generell nicht auf den Source-Port filtern. Aber dabei wird vermutlich (?) auch bei IPTables generell jeder Port von 0 bis 64K erlaubt sein. Und warum sollte man diese Filter-Möglichkeit ignorieren wenn man den Sourceport zwar nicht genau, aber zumindest in einem Bereich einschränken kann. Und damit auf welchen Ports ein Server lauscht hat das dann ja auch nichts zu tun, da das für die eingehenden Verbindungen die dports sind.

Das Tutorial ganz unten sieht aber wirklich gut aus. Gleich ein Bookmark angelegt, falls ich mich doch mal mit IPTables beschäftigen muß.
lucki2
Posts: 427
Joined: 2006-10-03 01:31
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by lucki2 »

Nyxos, da ist eine DROP Policy. Jede Regel, die dazu kommt heißt die FW ein Stück weiter aufzumachen, sonst ist die Regel überflüssig.
[Bitte nicht auf die Goldwaage legen sondern als Hinweis, was hier zum Problem führt. Eine Reject oder Drop Target ändert da was ... aber ich mag jetzt nicht Haarespalten ]
User avatar
nyxus
Posts: 626
Joined: 2002-09-13 08:41
Location: Lübeck
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by nyxus »

lucki2 wrote:Nyxos, da ist eine DROP Policy. Jede Regel, die dazu kommt heißt die FW ein Stückn weiter aufzumachen, sonst ist die Regel überflüssig.
Der OP hatte aber jede Menge ACCEPT-Policies. Und daher wird die Regel durch das Hinzufügen eines weiteren Parameters eingeschränkt und nicht weiter aufgemacht:
Wenn ich keine Regel mit einem SP >1023 habe könnte ein User eine Verbindung (TCP, a.b.c.d:23 -> myIP:80) aufbauen, wenn ich in meiner FW-Regel den Source-Port explizit auf >1023 filtere wird die Verbindung abgeblockt.
lucki2
Posts: 427
Joined: 2006-10-03 01:31
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by lucki2 »

Alles klar: mein Server ist es nicht. :roll:

Code: Select all

while(true); do echo IPTABLES hat eine Statemashine; done
mad cow
Posts: 33
Joined: 2006-11-23 22:57
Location: Heidelberg (Baden)
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by mad cow »

lucki2 wrote:Schau Dir nochmal das Howto an:
http://iptables-tutorial.frozentux.net/ ... orial.html
Gerade neu überarbeitet, wie ich sehe. Das ist imho total schön, ausführlich und verständlich erklärt. Mit Bildern die manche Sachen gut illustrieren. Wärmstens zu empfehlen. Und dann ... dann packst Du nmap und nessus aus und ärgerst Deine FW und schaust nach, bei welchen Angriffen Deine Firewall Alarm schlägt oder ob nessus nicht sogar Dein System zum crashen bringt - soll ja auch schon vorgekommen sein.

Disclaimer, damit mir keiner Ärger macht:
Die beiden Tools benutzt Du bitte nur für Deine Seite und in Absprache mit Deinem Provider, sonst fängst Du Dir u.U. eine Anzeige ein.
Keine Angst, die Tools werde ich nur im Subnetzt einsetzen, nicht von zu Hause aus. Dann bekommt nichtmal das Rechenzentrum was mit.
Mit der Version aus meinem ersten Post habe ich nach gewisser Zeit einen Absturz geschafft, weil die Ausgaben der FW zu viel für die Konsole waren. Seit nur noch in Logfiles geschrieben wird, tritt das Problem nicht mehr auf. Hätte ich nicht gedacht.

Mit nmap habe ich schon ein paar Tests gemacht, das verlief problemlos. Nessus habe ich bisher noch nicht eingesetzt, das wird aber auf jeden Fall interessant. Hoffentlich geht alles gut.

Das Tutorial habe ich zum Teil schon gelesen. In nächster Zeit muss ich mal weiter lesen. :oops:

Thanks @lucki2 und alle anderen.

---

Nochmal zur Erklärung an alle, die sich wundern, dass ein Server eine Firewall bekommt. Es gibt tatsächlich eine Firewall für das gesamte Netz. Die bietet aber 0 Schutz, sie stört höchstens die Nutzung von P2P-Netzwerken.

Das Subnetz soll ich nicht durch eine Router schützen, weil der dann gleichzeitig ein Server ist, denn Server sind böse. Es war schon ein Kampf, dieses Gerät ans Netz zu bekommen.
User avatar
nyxus
Posts: 626
Joined: 2002-09-13 08:41
Location: Lübeck
 

Re: Ist mein Iptables-Skript so sicher? Was kann man noch tun?

Post by nyxus »

lucki2 wrote:Alles klar: mein Server ist es nicht. Rolling Eyes

Code: Select all

while(true); do echo IPTABLES hat eine Statemashine; done
Und auch da frage ich mich was Du uns damit sagen willst ...