Bannir des IP avec Ruby

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]|1\d|[1-9])?\d)(?:\.(?:25[0-5]|(?:2[0-4]|1\d|[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

Il lui manque certainement quelques test d’erreurs, un test sur l’utilisateur qui l’exécute, … Je suis tout ouïe.

Cet article, publié dans Informatique, PLUG, est tagué , , . Ajoutez ce permalien à vos favoris.

4 commentaires pour Bannir des IP avec Ruby

  1. bdauvergne dit :

    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 http://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).

  2. 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.

  3. 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.

  4. 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).

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s