Niveau :
Résumé : ipset; IN A
Ceci n'est pas une amélioration de l'article précédent, mais un complément.
Un firewall basé sur le DNS
On veut être indépendant des ip utilisées par les gens que l'on filtre. On se propose cette fois de faire des règles de filtrage basées sur le forward DNS et non plus le reverse DNS.
Cette fois, on ne peut plus utiliser l'IP du paquet pour récupérer le nom de domaine, mais on peut mettre au jour automatiquement les règles de firewall en fonction d'un domaine défini et non plus avec des IP statiques.
Encore une fois, les précautions précédentes s'appliquent :
- on base une règle sur quelque chose qu'on ne maitrise pas, voire qu'un attaquant pourrait maitriser : la base dns de la source
- on devient dépendant du résolveur dns et donc de ses failles
Mais à la différence de la dernière fois, le dns est potentiellement sous contrôle d'un ami (si on parle de whitelist et non de blacklist). De plus on peut imaginer utiliser DNSSEC pour gagner en sécurité.
Changeons de technologie. Puisque nous ne faisons plus de reverse DNS, nous devons connaître à l'avance l'intégralité des domaines. Donc on ne peut plus avoir de regex ou de wildcard. Et puisque nous devons les connaître à l'avance, nous pouvons juste faire des requêtes, stocker les IP résultantes et les utiliser directement dans le firewall.
La technologie du jour s'appelle donc ipset. Elle permet d'utiliser un pool d'ip que l'on peut faire varier dynamiquement dans une règle iptables.
Iptables
Son usage est simple :
# on ne matche que sur l'ip source iptables -A ... -m --match-set chezmoi.com src -j ... # on matche sur un couple source/destination iptables -A ... -m --match-set friendzone src -j ...
Ensuite il suffit de créer les set
ipset --create chezmoi.com iphash # ip ipset create chezmoi.com hash:ip (pour ceux qui ont une ancienne version d'ipset) ipset --create friendzone iphash # ip ipset create friendzone.com hash:ip (pour ceux qui ont une ancienne version d'ipset)
Règles en live
Il ne nous reste plus qu'à mettre à jour les set dynamiquement, par exemple en interrogeant régulièrement les serveurs dns.
# on utilise un ipset temporaire pour que le firewall continue de fonctionner pendant nos opérations ipset --create temp iphash for rule in rules do ipset --flush temp for i in domains[$rule] do host $rule | xargs ipset --add $rule $ip done ipset --swap temp $rule done ipset --destroy temp
Il n'y a plus qu'a lancer ce script régulièrement grâce à notre ami cron.
Et voila !
Notez qu'il y a moyen avec ipset de matcher plusieurs adresses à la fois (ip, mac, source, destination), de matcher des réseaux et même de matcher des ports.