Denyhosts vs fail2ban vs iptables: le meilleur moyen d'empêcher les connexions brutales?

62

Je suis en train de mettre en place un serveur LAMP et je dois empêcher SSH / FTP / etc. tentatives de connexion brute-force de réussir. J'ai vu de nombreuses recommandations pour denyhosts et fail2ban, mais peu de comparaisons des deux. J'ai aussi lu qu'une règle IPTables peut remplir la même fonction.

Pourquoi devrais-je choisir l'une de ces méthodes plutôt qu'une autre? Comment les utilisateurs de serverfault traitent-ils ce problème?

Spiffytech
la source

Réponses:

53

IIRC, DenyHosts ne surveillera que votre service SSH. Si vous en avez également besoin pour protéger d'autres services, Fail2ban est certainement un meilleur choix. Il est possible de surveiller presque tous les services si vous souhaitez modifier leur configuration, mais cela ne devrait pas être nécessaire, car les nouvelles versions de Fail2ban incluent des jeux de règles qui conviennent à de nombreux démons de serveurs populaires. L’utilisation de fail2ban par rapport à une limite de débit iptables simple présente l’avantage de bloquer complètement l’attaquant pendant un laps de temps déterminé, au lieu de simplement réduire la vitesse à laquelle il peut taper sur votre serveur. J'ai utilisé fail2ban avec d'excellents résultats sur un certain nombre de serveurs de production et je n'ai jamais vu l'un de ces serveurs violé par une attaque en force brutale depuis que je l'utilise.

Ron
la source
3
Notez que DenyHosts va bloquer d'autres services - la principale différence est que fail2ban utilise iptables alors que DenyHosts utilise hosts.deny, certains services ne consultent pas les fichiers hôtes tels qu'Apache.
jammypeach
Pour jeter une autre option sur la table, j'ai récemment découvert que le configurateur de pare-feu ufw vous permettait également d'appliquer une limite de débit (non configurable) à tout port TCP ou UDP. Si vous utilisez déjà UFW, cela pourrait être une bonne option, au lieu de configurer et d'exécuter un démon supplémentaire.
spiffytech
La première chose à faire pour éviter les brutes de force brutale consiste à utiliser un mot de passe assez fort (ou même à désactiver complètement l’authentification du mot de passe :). Limiter le taux (seul) est trop faible pour cela. Je n’ai pas essayé d’alternative, mais j’utilise moi-même fail2ban et j’ai trouvé assez utile de repousser les robots surveillant les mots de passe.
Petr Gladkikh
D'après mon expérience, fail2ban a besoin d'un peu plus de travail pour lui permettre de faire n'importe quoi. En revanche, vous pouvez très bien installer le RPM denyhosts et le démarrer pour protéger votre serveur pendant que vous définissez des options plus complexes. Je suis tout à fait d’accord pour dire que fail2ban est 'meilleur', mais pour une protection facile, rien ne vaut les denyhosts.
Ralph Bolton
21

meilleur moyen d'empêcher les connexions par force brute?

Ne les laissez pas accéder à votre machine en premier lieu! Il existe de nombreux moyens d'arrêter les tentatives de force brute avant qu'elles n'atteignent votre hôte, voire au niveau SSH.

Cela dit, protéger votre système d'exploitation avec quelque chose comme fail2ban est une excellente idée. Fail2ban est légèrement différent de DenyHosts, bien qu'ils jouent dans le même espace. Fail2ban utilise iptables.

http://en.wikipedia.org/wiki/Fail2ban

Fail2ban est similaire à DenyHosts ... mais contrairement à DenyHosts qui se concentre sur SSH, fail2ban peut être configuré pour surveiller tout service enregistrant les tentatives de connexion dans un fichier journal et au lieu d'utiliser /etc/hosts.deny uniquement pour bloquer les adresses IP / hôtes. , fail2ban peut utiliser Netfilter / iptables et TCP Wrappers /etc/hosts.deny.

Il existe un certain nombre de techniques de sécurité importantes à prendre en compte pour empêcher les connexions par force brute:

SSH:

  • Ne pas autoriser root à se connecter
  • Ne pas autoriser les mots de passe ssh (utilisez l'authentification par clé privée)
  • Ne pas écouter sur chaque interface
  • Créez une interface réseau pour SSH (par exemple, eth1), différente de l'interface depuis laquelle vous répondez aux demandes (par exemple, eth0)
  • N'utilisez pas de noms d'utilisateur communs
  • Utiliser une liste d'autorisations et n'autoriser que les utilisateurs nécessitant un accès SSH
  • Si vous avez besoin d'un accès Internet ... Limitez l'accès à un ensemble fini d'adresses IP. Une adresse IP statique est idéale, mais le verrouiller à xx0.0 / 16 vaut mieux que 0.0.0.0/0
  • Si possible, trouvez un moyen de vous connecter sans accès Internet. Ainsi, vous pourrez refuser tout le trafic Internet pour SSH (par exemple, avec AWS, vous pouvez obtenir une connexion directe qui contourne Internet, elle s'appelle Direct Connect).
  • Utilisez un logiciel tel que fail2ban pour attraper toutes les attaques par force brute
  • Assurez-vous que le système d'exploitation est toujours à jour, en particulier les paquets de sécurité et ssh

Application:

  • Assurez-vous que votre application est toujours à jour, notamment les packages de sécurité.
  • Verrouillez les pages "admin" de votre application. La plupart des conseils ci-dessus s’appliquent également à la zone administrative de votre application.
  • Protégez votre zone d'administration avec un mot de passe, par exemple htpasswd pour la console Web projettera les vulnérabilités des applications sous-jacentes et créera une barrière supplémentaire à l'entrée
  • Verrouillez les autorisations de fichiers. Les «dossiers de téléchargement» sont connus pour être des points d'entrée de toutes sortes de choses désagréables.
  • Envisagez de placer votre application derrière un réseau privé et d'exposer uniquement votre équilibreur de charge frontal et une boîte de connexion (il s'agit d'une configuration typique dans AWS utilisant des VPC).
Drew Khoury
la source
1
Pourriez-vous préciser la déclaration "Il existe de nombreux moyens d'arrêter les tentatives de force brute avant qu'elles n'atteignent votre hôte, voire au niveau SSH." Je suis particulièrement intéressé si vous avez des suggestions pour des machines hébergées sur lesquelles vous n'avez pas le contrôle sur le réseau externe. Merci!
Kevin Keane
7

J'utilise les règles iptables pour limiter les nouvelles connexions à partir de la même adresse IP (SSH principalement, mais cela fonctionnerait aussi bien pour FTP). À mon avis, l’avantage par rapport à "fail2ban" et à d’autres outils de ce type est que la route iptables est totalement en mode noyau et ne repose sur aucun outil en mode utilisateur pour analyser / analyser les fichiers journaux.

Des centaines de connexions ssh échouées

Si vous le pouvez, limiter les adresses source pouvant accéder aux protocoles en question vous aidera évidemment.

Avec SSH, vous devriez vraiment utiliser l'authentification par certificat et ne pas accepter les mots de passe de toute façon.

Evan Anderson
la source
@ mc0e - Je ne vous suis pas.
Evan Anderson
7

Une autre excellente façon de protéger SSH (je l’utilise depuis au moins une décennie) consiste à utiliser les bibliothèques récentes dans iptables de manière native (en fonction de votre distribution).
Fondamentalement, il peut être utilisé comme un port frappant, intégré à iptables. Cela vous évitera beaucoup de maux de tête. Tant que vous pouvez vous connecter TCP (telnet est un moyen. J'ai également utilisé des clients SSH et les a pointés vers le port. Tout ce qui permettra une connexion TCP à un numéro de port spécifié. Je vous regarde Putty!) De la client initiant la connexion ssh, vous pouvez l'utiliser.

Ci-dessous, vous trouverez un exemple où iptables ouvrira le port 22 sur votre hôte lorsque vous utiliserez telnet de votre hôte vers le serveur sur le port 4103. Vous pourrez ensuite utiliser un telnet pour mettre en communication 4102 ou 4104 afin de fermer l’ouverture. La raison pour les deux 4102 et 4104 est de garder une simple analyse TCP de l'ouverture 22. Seul un TCP Connect (telnet) au port 4103 vous permettra d'entrer.

Prendre plaisir!

Oh et je suis en faveur de Fail2Ban. Plus de flexibilité et j'aime bien que l'interdiction se produise dans iptables plutôt que dans tcpwrappers.

SSH PORTKNOCKING

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name SSH -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4102 -m recent --name SSH --remove -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4103 -m recent --name SSH --set -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4104 -m recent --name SSH --remove -j DROP
Jeff Moore
la source
6

Une autre différence entre Fail2ban et Denyhosts est que Denyhosts peut partager la liste de blocage avec d'autres utilisateurs Denyhosts. Avec Fail2ban, vous ne pouvez bloquer que les adresses IP que votre serveur a déjà vues. Avec Denyhosts, une tentative brutale peut même ne jamais parvenir sur votre serveur, si quelqu'un d'autre l'a vue, et la liste de blocage est téléchargée sur votre serveur avant l'attaquant. arrive à votre ordinateur.

Une autre différence est que Fail2ban utilise iptables, tandis que Denyhosts utilise tcpwrappers. D'autres ont déjà mentionné cette différence, mais quelques notes méritent d'être mentionnées.

iptables est limité dans le nombre d'adresses IP que vous pouvez bloquer efficacement. C'est probablement l'une des raisons pour lesquelles Fail2ban ne dispose pas d'un mécanisme permettant de partager des listes de blocage.

Un autre effet est que lorsque iptables est remplacé par nftables, Fail2ban cessera probablement de fonctionner ou doit être réécrit. Denyhosts continuera probablement à travailler.

Donc, les deux ont des avantages et des inconvénients. J'aime les deux; Pour ma part, j'utilise Denyhosts parce que d'habitude, je ne veux que protéger SSH et j'aime partager la liste de blocage.

Kevin Keane
la source
5

Une chose à noter à propos de Fail2Ban est qu’il semble utiliser environ 10 Mo de mémoire de plus que DenyHosts. Donc, si vous utilisez un VPS de 128 Mo, vous voudrez peut-être examiner cela. De plus, fail2ban prêt à l'emploi est uniquement configuré sur SSH, ce qui signifie qu'en l'absence de modification de la configuration, DenyHosts fait la même chose avec moins de mémoire.

Xeoncross
la source
2
Essayez d’ajouter "ulimit -s 256" à / etc / default / fail2ban. Abaissé 10 Mo sur mon système.
pkoch
3

denyhosts est pour ssh. fail2ban est plus complet (HTTP, FTP, etc.). Les deux utilisent iptables dans les coulisses.

Ignacio Vazquez-Abrams
la source
Les deux "denyhosts" et "fail2ban" utilisent iptables pour accomplir leur comportement "bloquant", mais n'utilisent pas iptables pour limiter le taux. Ils analysent les journaux dans "utilisateur" et agissent sur les entrées de journal.
Evan Anderson
10
@Evan, denyhosts n'utilise pas iptables (par défaut). Il utilise des wrappers TCP et met à jour votre /etc/hosts.deny quand un système doit être banni.
Zoredache
@ Zoredache: Je reste corrigé. Ayant déjà utilisé "denyhosts" auparavant, j'ai émis une hypothèse erronée sur la façon dont il invoque sa fonctionnalité de "blocage". Néanmoins, en tant qu’outil d’analyse et de réaction des journaux utilisateur, je préférerais utiliser une solution strictement basée sur iptables pour "denyhosts".
Evan Anderson
1

Au lieu de jouer avec la configuration fastidieuse d'iptables ou de fail2ban, pourquoi ne pas laisser la communauté ouverte faire tout le travail pour vous et utiliser CSF / LFD à la place? Je peux le recommander au-dessus de toutes les autres options mentionnées. Voir http://configserver.com/cp/csf.html pour savoir ce qu’il peut faire pour vos serveurs. CSF ne nécessite pas de panneau de configuration, il offre une interface utilisateur simple, pour ceux qui ne veulent pas le faire par shell. Et c'est beaucoup de scripts Perl non-résidents stables et fiables.

Ben
la source
8
Cela ressemble plus à une publicité et passe sous silence la question.
Drew Khoury
Eh bien non, je n'ai pas passé sous silence la question. J'ai remis une alternative qui vous éviterait de devoir même vous embêter avec cette question. Sérieusement, CSF / LFD n'est pas simplement un autre système de contrôle de pare-feu, il est précisément issu du type de problèmes que nous avons ici. Pourquoi quelqu'un ne voudrait-il pas évoluer? Cela vous fait gagner beaucoup de temps, car d’autres l’ont déjà résolu. C'est pourquoi le CSF existe.
Ben
Pour ce que ça vaut, en tant que quelqu'un qui valorise la capacité de gain de mon temps, si le prix est correct, je préférerais de loin une solution "plug-and-play" à ce genre de choses, même si cela coûte quelques dollars. De cette façon, je n'ai pas à perdre de temps à apprendre des choses qui ne m'intéressent pas vraiment, mais à reconnaître l'importance de la protection.
David
1

fail2ban ne semble pas disposer d'un mécanisme permettant de reconnaître une connexion ssh réussie et de réinitialiser le nombre d'échecs.

Le filtre standard pour sshd (au moins sur mon installation Debian), calcule un nombre d'échecs pour chaque clé ssh que le client présente que le serveur rejette. Certains utilisateurs présentent de nombreuses clés à chaque connexion et sont régulièrement verrouillés, même si leur connexion a réussi une fois que quelques clés ont été utilisées.

À la suite de ce qui précède, je pense actuellement à abandonner fail2ban. À cet égard du moins, nierhosts est préférable. Cependant, ce n’est apparemment plus une bonne option et n’est plus pris en charge par les versions plus récentes de debian (des discussions à l’ adresse https://www.chrissearle.org/2015/06/16/replacing-denyhosts-with-fail2ban-for- debian / )

Je n'ai pas de bonne solution ici.

mc0e
la source
Il existe un problème similaire si vous utilisez l'authentification LDAP. Trop de connexions réussies vous verront bloqué: bugs.launchpad.net/ubuntu/+source/libpam-ldap/+bug/562388
Mike
Pour éviter que toutes les clés ne soient présentées, montrez à vos utilisateurs comment spécifier la clé à utiliser dans leur fichier ~ / .ssh / config.
BillThor
0

En fait, je pense que denyHost est capable d’empêcher de nombreux autres services que le service sshd. Dans son fichier de configuration - /etc/denyhosts.conf, il y a quelques lignes de code dites:

# BLOCK_SERVICE: the service name that should be blocked in HOSTS_DENY
#
# man 5 hosts_access for details
#
# eg.   sshd: 127.0.0.1  # will block sshd logins from 127.0.0.1
#
# To block all services for the offending host:  
BLOCK_SERVICE = ALL
# To block only sshd:
# BLOCK_SERVICE  = sshd

Donc, si nous définissons une BLOCK_SERVICEvariable ALLcomme ci-dessus, nous pouvons regarder notre service SSH.

MathNoob
la source
0

Denyhosts version 3.0: chaque fois qu’une adresse IP apparaît dans un fichier journal, Denyhosts ouvre le fichier hosts.deny et lit le tout pour faire correspondre l’adresse. À chaque fois. Rien n'est mis en cache en mémoire. Si vous avez un très gros fichier hosts.deny et que vous êtes soumis à de nombreuses sondes (de nombreuses entrées de fichier journal), Denyhosts devient un gros consommateur de CPU qui relit et relit le fichier hosts.deny pour chaque adresse IP affichée. Pas bon.

Si vous activez le support iptables, Denyhosts créera des listes énormes et lentes d’adresses IP bloquées. Denyhosts n'utilise pas ipset ou nftables pour créer des cartes IP efficaces.

Ian D. Allen
la source