Bannir des IP avec Ruby

Première publication : 2008-04-23

J’ai souvent besoin de bannir des adresses IP pour la connexion SSH sur mes serveurs.

Au delà de la question du choix de ne pas (plus) utiliser d’outils à la Fail2ban, je propose un petit script qui permet de facilement ajouter des adresses dans la blacklist de iptables. Je le poste ici tant pour m’en souvenir que pour le partager en vue d’améliorations possibles.

Pourquoi Ruby ? Parce que je suis pas assez fort en bash (ou autre shell) pour faire le test de regexp avec, alors qu’avec Ruby, de toutes façons installé sur mes serveurs) j’y arrive assez rapidement.

#!/usr/bin/env ruby

IPT_CTL = "/sbin/iptables"

REGEXP = /^A(?:25[0-5]|(?:2[0-4]|1d|[1-9])?d)(?:.(?:25[0-5]|(?:2[0-4]|1d|[1-9])?d)){3}^z/

def ban(ip)
  if ip.match(REGEXP)
    system IPT_CTL + " -A INPUT -s #{ip} -p tcp -m tcp --dport 22 -j DROP"
    puts "L'adresse IP '#{ip}' a été blacklistée."
  else
    puts "L'adresse IP '#{ip}' n'est pas valide, rien n'a été fait."
  end
end

if ARGV.size > 1
  ARGV.each { |ip| ban(ip) }
else
  ban(ARGV[0])
end

Comentaires

bdauvergne 2008-04-23 23:14:55

C’est devenu hype de faire des règles iptables ? Dans le temps pour bannier/allouer des IPs on utilisait hosts.allow/deny il me semble.

Bon sinon un truc sympa à faire ce serait d’utiliser l’option -i qui permet de lancer ssh dans inetd ou n’importe quel autre tcpwrapper et d’utiliser des outils tels www.hostip.info pour sélectionner les ips par zone géographique ou des blacklist dns pour ip dynamique ou ips pourris (voir http://www.spamhaus.org).

Jérémy Lecour 2008-04-24 09:33:57

Arf, constat d’ignorance ; j’avais même oublié l’existence de ces allow/deny. Je vais certainement regarder de ce côté, ça sera effectivement plus propre que les règles iptables.

Pour le reste, ces tentatives d’intrusion ne me pose pas suffisamment de problèmes pour que je m’attelle à la tache que tu décris, mais merci du conseil.

Jérémy Lecour 2008-04-24 10:35:36

Merci Benjamin, je viens de virer mes règles itables et de remplir mes fichiers /etc/hosts.allow et /etc/hosts.deny

Il me reste plus qu’à modifier mon script pour qu’il change hosts.deny et qu’il dédoublonne au passage.

Y’a aussi DenyHosts qui a l’air de faire comme Fail2ban, je vais tenter ça.

Jérémy Lecour 2008-04-28 20:37:27

Ah ah !

DenyHosts a passé avec succès le test des quelques jours sur le serveur. Il m’a bien ajouté les petits malins dans /etc/hosts.deny et ne m’a pas causé de soucis à moi.

Donc, je l’adopte (jusqu’à qu’il se mette à me casser les pieds).