From a70205526f4e4b12cd20ffcdfaf8f72df013e668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Elliott=20B=C3=A9cue?= Date: Sat, 6 Jun 2015 01:03:26 +0200 Subject: [PATCH] On durcit avec du lubrifiant un peu le parefeu pour le bruteforce ssh. --- gestion/gen_confs/firewall4/komaz.py | 3 +- gestion/gen_confs/firewall6.py | 59 ++++++++++++++-------------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/gestion/gen_confs/firewall4/komaz.py b/gestion/gen_confs/firewall4/komaz.py index 9f36dc41..5f21a036 100644 --- a/gestion/gen_confs/firewall4/komaz.py +++ b/gestion/gen_confs/firewall4/komaz.py @@ -94,6 +94,7 @@ class firewall(base.firewall_routeur): self.add(table, chain, '-p icmp -j ACCEPT') self.add(table, chain, '-m state --state RELATED,ESTABLISHED -j ACCEPT') self.add(table, chain, '-j %s' % blacklist_soft_chain) + self.add(table, chain, '-j %s' % self.limit_ssh_connexion(table)) for net in base.config.NETs['all'] + base.config.NETs['adm'] + base.config.NETs['personnel-ens']: self.add(table, chain, '-s %s -j %s' % (net, mac_ip_chain)) self.add(table, chain, '-j %s' % blacklist_hard_chain) @@ -156,7 +157,7 @@ class firewall(base.firewall_routeur): if table == 'filter': pretty_print(table, chain) self.add(table, chain, '-i %s -p tcp --dport ssh -m state --state NEW -m recent --name SSH --set' % dev['out']) - self.add(table, chain, '-i %s -p tcp --dport ssh -m state --state NEW -m recent --name SSH --update --seconds 30 --hitcount 10 --rttl -j DROP' % dev['out']) + self.add(table, chain, '-i %s -p tcp --dport ssh -m state --state NEW -m recent --name SSH --update --seconds 120 --hitcount 10 --rttl -j DROP' % dev['out']) print OK if apply: diff --git a/gestion/gen_confs/firewall6.py b/gestion/gen_confs/firewall6.py index 823b9c26..40a3c911 100755 --- a/gestion/gen_confs/firewall6.py +++ b/gestion/gen_confs/firewall6.py @@ -20,7 +20,10 @@ # along with this program. If not, see . -import sys, re, os, pwd +import sys +import re +import os +import pwd sys.path.append('/usr/scripts/gestion') @@ -57,13 +60,11 @@ def ports(dev_ip6, dev_list): # Il semble qu'il faille un kernel >= .29 et iptables >= 1.4.3 # http://netfilter.org/projects/iptables/files/changes-iptables-1.4.3.txt -# ip6tables.filter.forward('-i %s -p tcp --dport ssh -m state --state NEW -m \ -#recent --name SSH --set ' % dev_ip6) -# ip6tables.filter.forward('-i %s -p tcp --dport ssh -m state --state NEW -m \ -#recent --name SSH --update --seconds 60 --hitcount 4 --rttl -j DROP' % -# dev_ip6) -# ip6tables.filter.forward('-i %s -p tcp --dport ssh -m state --state NEW \ -#-j ACCEPT' % dev_ip6) + ip6tables.filter.forward('-i %s -p tcp --dport ssh -m state --state NEW -m recent --name SSH --set ' % dev_ip6) + ip6tables.filter.forward('-i %s -p tcp --dport ssh -m state --state NEW -m recent --name SSH --update --seconds 120 --hitcount 10 --rttl -j DROP' % dev_ip6) + ip6tables.filter.input('-i %s -p tcp --dport ssh -m state --state NEW -m recent --name SSH --set ' % dev_ip6) + ip6tables.filter.input('-i %s -p tcp --dport ssh -m state --state NEW -m recent --name SSH --update --seconds 120 --hitcount 10 --rttl -j DROP' % dev_ip6) + #ip6tables.filter.forward('-i %s -p tcp --dport ssh -m state --state NEW -j ACCEPT' % dev_ip6) for proto in open_ports.keys(): ip6tables.filter.forward('-i %s -p %s -m multiport --dports %s -j ACCEPT' % (dev_ip6, proto, open_ports[proto])) @@ -72,7 +73,7 @@ def ports(dev_ip6, dev_list): prefix[dprefix[type_machine]][0], 'EXT' + re.sub('-', '', type_machine.upper()))) eval('ip6tables.filter.ext' + re.sub('-', '', type_machine))('-j REJECT --reject-with icmp6-port-unreachable') - + # Port ouvert CRANS->EXT for dev in dev_list: ip6tables.filter.forward('-i %s -p udp -m multiport --dports 0:136,140:65535 -j ACCEPT' % dev) @@ -97,7 +98,7 @@ def basic_fw(): for icmpv6 in ['neighbour-solicitation','neighbour-advertisement','redirect','router-solicitation']: ip6tables.filter.input('-p icmpv6 -m icmp6 --icmpv6-type %s -j ACCEPT' % icmpv6) ip6tables.filter.output('-p icmpv6 -m icmp6 --icmpv6-type %s -j ACCEPT' % icmpv6) - + # on accepte les ping for icmpv6 in authorized_icmpv6: ip6tables.filter.forward('-p icmpv6 -m icmp6 --icmpv6-type %s -j ACCEPT' % icmpv6) @@ -106,26 +107,26 @@ def basic_fw(): # On ne vérifie rien sur les ip qui ne sont pas dans notre prefix for net in prefix['subnet']: ip6tables.filter.ieui64('! -s %s -j RETURN' % net) - + # Correspondance MAC-IP mac_ip(ip6tables, machines, ['fil', 'adherents-v6', 'adm', 'wifi', 'wifi-adh-v6', 'serveurs']) def main_router(): ''' Firewall pour le router principal ''' - + #TODO : réseaux non routable, interaction avec generate # il faut aussi voir les conditions pour passer la ctstate avant MAC-IP # (normalement, il n'y a pas de problèmes. # et peut être aussi avant blackliste (il faut prévoir un script qui # enlève les entrées dans la conntract lors de la mise en place de la # blackliste - + dev_crans = iface6('fil') dev_wifi = iface6('wifi') dev_ip6 = iface6('sixxs2') - + ip6tables.mangle.forward("-o %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu" % dev_ip6) ip6tables.mangle.forward("-o %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu" % dev_wifi) ip6tables.mangle.forward("-o %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu" % dev_crans) @@ -133,14 +134,14 @@ def main_router(): ip6tables.mangle.prerouting('-i %s -m state --state NEW -j LOG --log-prefix "LOG_ALL "' % dev_crans) ip6tables.mangle.prerouting('-i %s -m state --state NEW -j LOG --log-prefix "LOG_ALL "' % dev_wifi) ip6tables.mangle.prerouting('-i %s -m state --state NEW -j LOG --log-prefix "LOG_ALL "' % dev_ip6 ) - + # On force le /32 de google à passer en ipv4 pour tester si ça soulage le tunnel ipv6 ip6tables.filter.forward('-o %s -p tcp -d 2a00:1450:4006::/32 -j REJECT' % dev_ip6) - + # Ipv6 sur évènementiel, on ne laisse sortir que si ça vient de la mac d'ytrap-llatsni ip6tables.filter.forward('-o %s -d 2a01:240:fe3d:d2::/64 -j ACCEPT' % dev_crans) ip6tables.filter.forward('-o %s -m mac --mac-source 00:00:6c:69:69:01 -s 2a01:240:fe3d:d2::/64 -j ACCEPT' % dev_ip6) - + # Les blacklistes # Si on les met après la règle conntrack, une connexion existante ne sera # pas sevrée et dinc avec un tunnel ssh idoine, la blacklist aurait aucun @@ -151,15 +152,15 @@ def main_router(): ip6tables.filter.forward('-i %s -j BLACKLIST_SRC' % dev_crans) ip6tables.filter.forward('-i %s -j BLACKLIST_SRC' % dev_wifi) ip6tables.filter.forward('-i %s -j BLACKLIST_DST' % dev_ip6) - + #tracker_torrent(ip6tables) #ip6tables.filter.forward('-o %s -p udp -j TRACKER_TORRENT' % dev_ip6 ) #ip6tables.filter.forward('-o %s -p tcp -m string --algo kmp --string "GET /" -j TRACKER_TORRENT' % dev_ip6) #ip6tables.filter.forward('-o %s -p tcp -m string --algo kmp --string "get /" -j TRACKER_TORRENT' % dev_ip6) - + ip6tables.filter.forward('-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT') - + # On filtre les réseaux non routable et aussi on accepte en entrée # que les paquets dont la source n'est pas notre plage, pour éviter # http://travaux.ovh.net/?do=details&id=5183 @@ -182,18 +183,18 @@ def main_router(): # Ouverture des ports ports(dev_ip6, [dev_crans, dev_wifi]) - + # On met en place le forwarding enable_forwarding(6) def routeur_nat64(): ''' Firewall pour le nat64 ''' - + dev_crans = iface6('fil') dev_adm = iface6('adm') dev_v6only = iface6('v6only') - + # Les blacklistes # Si on les met après la règle conntrack, une connexion existante ne sera # pas sevrée et dinc avec un tunnel ssh idoine, la blacklist aurait aucun @@ -203,10 +204,10 @@ def routeur_nat64(): blacklist(ip6tables) ip6tables.filter.forward('-i %s -j BLACKLIST_SRC' % dev_v6only) ip6tables.filter.forward('-i %s -j BLACKLIST_DST' % dev_crans) - - + + ip6tables.filter.forward('-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT') - + # Pour les autres connections for type_m in [i for i in ['fil', 'adherents-v6', 'wifi', 'wifi-adh-v6'] if not 'v6' in i]: ip6tables.filter.mac('-s %s -j %s' % (prefix[type_m][0], 'MAC' + @@ -258,7 +259,7 @@ def adherents_server(): # On arrête tout ip6tables.filter.srv_out_adm('-j REJECT --reject-with icmp6-adm-prohibited') - + def appt_proxy(): pass @@ -276,7 +277,7 @@ def start(): global machines machines = db.all_machines(graphic = True) print hostname - + # On supprime les anciennes règles si elles existent. try: os.remove(output_file[6]) @@ -311,7 +312,7 @@ def start(): def stop(): ''' Vide les tables ''' # TODO - # il manque une gestion des règles de routage spéciales réalisées à + # il manque une gestion des règles de routage spéciales réalisées à # l'aide de ip rule et ip route # idée faire une classe et la stocker en pickle pour savoir ce qui a été # ajouté