empêcher le bruteforce ssh avec iptables

Bonjour,

j’aimerais ne pas utiliser fail2ban sur ce coup là que je ne maitrise pas, c’est juste un serveur de backup je compte juste ouvrir le ssh à quelques ip et par sécurité bloquer plus de 3 tentatives de connection à la minute.

j’ai trouvé un petit script

[code]iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent \ --set

iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent
–update --seconds 60 --hitcount 4 -j DROP[/code]

si je comprends bien, je dois l’adapter à mon cas (spécifier une plage précise) de cette manière ?

[code]iptables -I INPUT -p tcp --dport 22 -i eth0 -m iprange --src-range IP1-IP2 state --state NEW -m recent
–set

iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent
–update --seconds 60 --hitcount 4 -j DROP
[/code]

Maintenant si je veux ajouter à la liste un deuxième groupe d’IP qui sont des IP de ping pour vérifier que le SSH est bien fonctionnel, comment je fait ca?

edit : mon policy est à DROP

Qu’entends-tu exactement par “des IP de ping pour vérifier que le SSH est bien fonctionnel” ?
Je suppose qu’il ne s’agit pas de ping ICMP mais au minimum de connexions sur le port SSH ?
As-tu besoin de limiter ces connexions-là ?

Avis personnel : je trouve que cette utilisation de “recent” a deux gros inconvénients pour la sécurité.

  1. Elle est sensible à l’usurpation d’adresse source, ce qui permet à un attaquant de faire bannir n’importe quelle adresse IP en l’usurpant.

  2. Le nombre d’adresses source mémorisées est limité (100 par défaut), ce qui permet à un attaquant, via l’usurpation d’adresse ou disposant d’un botnet suffisamment large, de se sortir de la liste en la saturant avec des adresses bidon.

edit : je mélange un peu les sujet désolé, je récapitule,
le monitoring ssh proposé gratuitement foire pas mal alors du coup j’aurais pas besoin d’autoriser la plage ip des “serveurs de “ping””. Je vais essayer de me passer d’eux et de pinger moi-même donc en résumé j’autorise en ssh seulement une plage d’IP + une ip fixe (je peux le faire sur la même ligne?).
Je pense qu’ils utilisent netcat pour vérifier l’ouverture du port.

La plage d’Ip que j’ai autorisé c’est la plage des IP dynamiques distribuées par mon FAI, en absence d’IP fixe en ce moment j’ai essayé de restreindre au mieux la plage IP mais comme ca fait pas mal d’adresse, il y a quand même la possibilité qu’une personne du même FAI bruteforce mon serveur au quel cas je serais totalement vulnérable, d’où la nécessité de quand même me prémunir contre le bruteforce ssh.

J’aurais bien utilisé fail2ban mais

  1. s’il y a une règle simple directement en iptables je préfèrerais l’utiliser ne serait-ce que pour l’apprentissage
  2. je connais pas vraiment le fonctionnement de fail2ban j’ai peur de créer un conflit avec mes règles iptables à un moment ou à un autre.

Bonjour;

Si tu veux une réelle protection en ssh, connecte toi par clefs (2048, 4096,…) exclusivement, déjà une 2048 est considérée comme quasi inviolable sauf a se donner des moyens totalement disproportionnés par rapport a ton serveur (avant que la nsa s’intéresse à ton serveur !!).

  • une fois les clefs testées tu mets “PasswordAuthentication no” dans ton sshd_config
  • …“PermitRootLogin without-password”…

A partir de là pas besoin de règles iptables, ni de fail2ban…tu peux très bien laisser le ssh sur le port 22…etc…ainsi que laisser tomber tous les autres conseils donnés ci et là pour sécuriser le ssh.

Sur mon serveur, je n’ai que quelques règles iptables de drop des ip connues de TMG…les ports ouverts faut bien qu’ils le restent car il y a un service derrière ; et les autres sont fermés par défaut de toute façon…

Seule chose importante, c’est de bien connaître son serveur et avec netstat de vérifier si tout ce qui est en écoute est légitime, de voir si certains trucs on ne peut pas les ramener en écoute locale, sinon désinstaller si on ne les utilise pas; et surtout faire ses mises à jour régulièrement.

Après, chacun ses convictions sur ce sujet, souvent considéré comme délicat…

+1 pour les clefs.
Les tentatives, tu ne les éviteras pas.
Ce dont il convient de se préserver, c’est les réussites.
Depuis maintenant 2 ans passés, j’ai supprimé fail2ban et je n’ai rien remarqué au niveau des intrusions.
Ma règle :
MDP utilisateur : béton
MDP root : béton armé
SSH : jeu de clefs avec pass-phrase en plusieurs langues et ajout de caractères spéciaux.
Port inchangé.

Je vous remercie, mais du coup avec une clé je peux autoriser les connexion en root ou il vaut mieux pas?
puis il y a aussi le spoofing qui m’inquiète

Je viens de tester chez moi et soit avec ‘sudo’, soit en #, ça m’est refusé.
Maintenant, je ne me souviens plus comment j’ai installé mes pass-phrases, 2 ans, c’est trop vieux :017

# ssh TRUC ssh: Could not resolve hostname zm: No address associated with hostname

EDIT :
de toute façon, SSH s’utilise en tant qu’user.
C’est une fois que tu es connecté sur la cible que tu fais ce que tu veux et/ou ce que tu peux.

@vger
A partir du moment que tu as une barrière solide à la connexion (les clefs étant dans le summum); je ne vois pas ce qui empêche de se connecter en root, pas plus que de garder le port 22 par défaut…même si il y en a qui taperont à la porte, tant qu’ils y restent, en quoi ça dérange ?..les logs …en quoi ça dérange ???

Tous ces trucs bling-bling glanés dans les différents tutos du web, ça fait longtemps que j’en ai fait mon deuil, quand on réfléchit un peu, ils ne servent pas à grand choses à part avoir de faux positifs, un faux sentiment de sécurité, s’auto bannir de son propre serveur…etc…bref plus d’emmerdes que de positif…

Ces trucs bling-bling alourdissent le serveur et sont totalement inutiles si l’on prend les précautions de connexions en amont; ils sont plus destinés à ceux qui utilisent des mots de passe lights (ne mélangeant pas les caractères, utilisant des mots du dico, et bien souvent trop courts, car ils se doivent d’être mémorisables).

[quote=“ricardo”]
EDIT :
de toute façon, SSH s’utilise en tant qu’user.
C’est une fois que tu es connecté sur la cible que tu fais ce que tu veux et/ou ce que tu peux.[/quote]

oui oui c’est vrai je me rappelle maintenant que quand je souhaitais utiliser le sftp en tant que route c’était parce que je pouvais pas faire de copier coller entre la console dans virtualbox et windows. C’est vrai ca ne sert donc plus à rien.

A mon avis il suffit de générer une clé puis de dire à ssh où elle se trouve? je n’ai plus qu’à chercher des tuto, si tu en as un sous la main jluc56 je suis preneur.

Salut,

De mémoire, Pascal n’utilises pas [mono]fail2ban[/mono], de toute façon avec sa maîtrise du réseau (entre autres), il peut se le permettre.

Cela dit, [mono]fail2ban[/mono] fait tout cela par défaut, dès l’installation.

En [mono]/etc/fail2ban/jail.conf[/mono] tu peux déclarer ces ip légitimes, ici :

Pour le reste, il te suffit d’ajuster les [mono]jail[/mono]s correspondantes, à savoir [mono][sshd][/mono] et [mono][sshd-ddos][/mono] ainsi que ces variables temporelles.

[ul][li] [mono]bantime =[/mono][/li]
[li] [mono]findtime =[/mono][/li]
[li] [mono]maxretry =[/mono][/li][/ul]

vger : Je ne dis pas de ne pas utiliser ces règles iptables, mais si tu décides de le faire, que ce soit en connaissance de cause et en étant conscient de leurs limites et faiblesses.

Non, il faut une règle pour chaque adresse, intervalle ou préfixe.

Quant à fail2ban, ne l’utilisant pas et le connaissant très peu je ne sais pas s’il est capable de limiter les connexions même réussies.

Etablir une connexion TCP en usurpant une adresse IP est très difficile sur internet (on peut envoyer des paquets mais on ne reçoit pas les réponses, donc on doit les deviner). fail2ban se base sur les logs produits par de vraies connexions établies et non de simples paquets, il est donc moins sensible au spoofing que les règles iptables ci-dessus.

Ils sont fermés jusqu’au jour où ils sont ouverts de façon non désirée (compromission, maladresse…). C’est là que le blocage des ports qui ne sont pas censés être ouverts se révèle utile.

[quote=“ricardo”]Je viens de tester chez moi et soit avec ‘sudo’, soit en #, ça m’est refusé.

# ssh TRUC ssh: Could not resolve hostname zm: No address associated with hostname[/quote]
Il ne s’agit pas d’exécuter ssh depuis un shell root sur la machine locale mais d’ouvrir une session SSH en root sur la machine distante.
Dans ta commande, deux problèmes :

  • échec de résolution de nom de la machine cible, peut-être un alias défini dans ~/.ssh.
  • avec une authentification par clé il y aurait peut-être aussi eu un problème de clé privée introuvable car elle se trouve dans le répertoire de ton utilisateur normal et non dans celui de root.

Bonjour;
@vger
Des tutos pour générer des clefs, t’en trouveras plein sur le net; moi je fais ainsi pour générer à la fois une clef privée compatible linux et une autre compatible windows :

login user sudo apt-get install -y putty-tools ###nécessaire que si l'on veut générer une clef privée pour la connexion depuis un poste sous windows avec putty mkdir -p ~/.ssh ssh-keygen -f ~/.ssh/id_rsa -t rsa -b 4096 -N 'ma-passephrase_compliquée_mais_mémorisable' puttygen ~/.ssh/id_rsa -O private -o ~/.ssh/user.ppk ##saisir 'ma-passephrase_compliquée_mais_mémorisable'.si clef pour windows cat ~/ssh/id_rsa.pub >> ~/.ssh/authorized_keys mv ~/.ssh/id_rsa vers ma clef usb par exemple ###Pour me connecter depuis un poste linux...à mettre dans le dossier .ssh de l'user distant devant se connecter (chmod 600); ou via "ssh-copy-id -i ~/.ssh/id_dsa.pub userdist@serveurdist.fr" mv ~/.ssh/user.ppk vers ma clef usb par exemple ###pour me connecter depuis un poste windows avec putty ou pageant chmod 700 ~/.ssh chmod 600 ~/.ssh/*

Ne garder dans le dossier .ssh que le fichier “authorized_keys” (seul nécessaire),voir id_rsa.pub; mais enlever dans tous les cas “id_rsa” et “user.ppk”, mais les conserver précieusement…ce sont les clefs du sésame; et passer “PasswordAuthentication no” une fois les clefs testées pour chaque user.

A partir de là, ça ne t’apportera rien de réserver l’accès à certaines ip avec des règles iptables ou un “AllowUsers user@ip” …etc…; c’est souvent beaucoup de contraintes pour un bénéfice nul si tu te connectes exclusivement par clef, car pour pouvoir se connecter, il faut disposer à la fois de la clef privée qui a elle toute seule est quasi inviolable et de sa passphrase qui sert de double sécurité pour en protéger son accès…autant dire que tout le reste à côté ce ne sont que des gadgets…

On pense au départ que l’on va se connecter toujours à partir des mêmes ip; mais un jour tu te retrouves chez quelqu’un par exemple, et que tu voudrais lui monter un truc présent sur ton serveur, eh bien, tu te retrouves comme un con, car l’ip de ton collègue ne sera pas acceptée…ça m’est déjà arrivé…ben oui, j’ai testé aussi ce type de gadgets…
J’ai toujours une clef usb avec mes clefs, + un autre exemplaire sur un cloud au cas ou je n’ai pas ma clef usb avec moi: il suffit que je m’y connecte pour récupérer les clefs ssh, et au moins je peux me connecter de n’importe ou, au cas ou ça arrive.

Idem pour fail2ban; à quoi ça sert de bannir une ip qui de toute façon ne pourra pas rentrer ??? suffit de se poser les bonnes questions pour s’en rendre compte de l’inutilité pour le ssh si connexions exclusives par clefs !!!
il y en a qui poussent même la parano à rendre les ip bannies persistantes, en les rechargeant à chaque redémarrage de fail2ban, et au bout de quelques mois se retrouvent avec des milliers d’ip qui sont à charger…bonjour les ressources…pour un bénéfice encore une fois nul!!!

Après, chacun fait ce qu’il veut, mais vaut mieux se poser les bonnes questions sur la réelle utilité de tous ces gadgets, et sur la contre-partie des contraintes qu’ils engendrent.

@PascalHambourg
Pour les ports fermés par défaut…un petit coup ne netstat régulièrement (et surtout après chaque update upgrade ou installation) pour voir si tout est légitime suffit à mes yeux, a chaque fois que je regarde, je ne vois jamais rien de nouveau; et de plus généralement un serveur une fois installé à part les maj, on n’y touche pas beaucoup…et je pense qu’en cas de compromission, de toute façon même si les ports inutilisés sont fermés avec iptables, cette compromission se servira tout simplement d’un ports déjà ouvert sur le serveur, et comme on ne peut pas tous les fermer au risque de ne plus jouir des services, je ne suis pas franchement convaincu…

C’est aussi pour ce genre de situation que j’évite les restrictions d’adresse source sur certains services.

Principalement à diminuer le bruit dans les logs, je dirais.

Un cas où ces mesures peuvent être efficaces, néanmoins : une faille pas encore corrigée dans sshd qui permettrait, par exemple, de casser un mot de passe en 1000 tentatives.

[quote]Principalement à diminuer le bruit dans les logs
[/quote]
Comme dit plus haut, ça ne m’a jamais empêcher de dormir, tant que ce ne sont que des logs de tentatives…
Et tant que personne ne peut rentrer, je ne vois pas l’intérêt de s’encombrer avec ce soft surtout pour le ssh avec connexion/clefs exclusivement; à la limite je serais plus tenté de l’utiliser pour surveiller et limiter les tentatives d’intrusion sur le 80 ou le 443, ou autres ports ouverts avec service … qui seraient restreints que par mot de passe.

Même avec 1000000000000² et même plus de tentatives de mots de passe, explique moi comment un hacker pourrait rentrer avec une connexion exclusivement autorisée par clefs: “PasswordAuthentication no” dans ton sshd_config; j’ai soif d’apprendre…

Quant aux failles, c’est surtout les MAJ qu’il faut faire régulièrement pour les corriger au plus vite et s’en prémunir, et surtout ne jamais installer des paquets exotiques qui ne sont pas issus des dépôts officiels…la sécurité démarre surtout par une bonne hygiène et une bonne connaissance de ses ports en écoute.

Et si malgré tout ça il y a compromission, et que le mal est installé, vaut mieux repartir à zéro sur des bases saines, et ce ne sont pas des règles iptables sur des ports inutilisés qui vont protéger, pas plus que certains autres gadgets…si le mal est déjà en place…

C’est comme ça que je pratique, mais à chacun ses convictions…

Par exemple en exploitant une faille comme celle découverte en 2008 dans le générateur de clé d’openssl utilisé par SSH qui faisait qu’il ne pouvait générer qu’un nombre réduit (de l’ordre de 100000 apparemment) de clés différentes. Si ta clé fait partie de cette liste et si tu laisses un attaquant essayer toutes ces clés une par une, il finira par la trouver en un temps raisonnable. Si tu le bloques au bout de quelques essais, il ne la trouvera jamais à moins d’avoir énormément de chance.

Il arrive qu’une faille ne soit pas encore publiée et corrigée mais déjà exploitée (“0-day”).

En attendant, le blocage des ports inutilisés sert au minimum à limiter les conséquences, pas seulement en cas de compromission mais aussi en cas de maladresse. Toutes les failles ne donnent pas les droits root à l’attaquant, donc si ça peut empêcher ta machine compromise d’être transformée en zombie ou relais de spam, c’est toujours ça de gagné. Tu n’es pas tout seul sur internet.

excusez moi de minimiser dans votre conversation, mais je vais juste oser deux questions:

  1. pourquoi ne pas bloquer avec iptables, le port 22 , comme ça, pas de log sur les tentatives de brute force ssh?
  2. pourquoi ne pas utiliser un autre port que le port 22 pour ssh?
    Cela diminue (mais ne réduit pas à zéro) le nombre de tentative de connexions intempestive, non?

Cordialement.

[quote=“rsuinux”]excusez moi de minimiser dans votre conversation, mais je vais juste oser deux questions:

  1. pourquoi ne pas bloquer avec iptables, le port 22 , comme ça, pas de log sur les tentatives de brute force ssh?
  2. pourquoi ne pas utiliser un autre port que le port 22 pour ssh?
    Cela diminue (mais ne réduit pas à zéro) le nombre de tentative de connexions intempestive, non?

Cordialement.[/quote]

1 - Tu bloque le port SSH ? okay et tu le réouvre comment (hormis avec du port knocking :005 ), et tu connecte comment finalement pour administrer ?

2 - Utiliser autre chose que le port 22 limitera essentiellement les points d’attaques des scripts les plus basique en rien elle ne dissimulera le port SSH, ce n’est donc clairement pas une solution.

J’accepte de t’excuser si tu t’immisces dans la conversation, mais pas si tu la minimises.

En fait ce sont deux parties de la même question, car si tu bloques le port 22 sans le remplacer par un autre, ssh ne sert à rien.
Alors oui, changer de port va réduire le nombre d’attaques, en particulier celles des robots qui n’ont aucune chance de réussir et ne font que polluer les logs. En revanche cela ne protège pas plus contre une attaque ciblée.

[quote=“rsuinux”]excusez moi de minimiser dans votre conversation, mais je vais juste oser deux questions:

  1. pourquoi ne pas bloquer avec iptables, le port 22 , comme ça, pas de log sur les tentatives de brute force ssh?
  2. pourquoi ne pas utiliser un autre port que le port 22 pour ssh?
    Cela diminue (mais ne réduit pas à zéro) le nombre de tentative de connexions intempestive, non?

Cordialement.[/quote]
Pour compléter les autres réponses, tu peux lire les débats ici : security.stackexchange.com/quest … ux-servers

En gros, ça te servira surtout à alléger tes logs de toutes les tentatives de bots. Mais si quelqu’un te scanne ([mono]nmap -v -sV -p 1-65535 ton.ip[/mono] par exemple), il pourra toujours trouver le port sur lequel SSH écoute.
Autre chose, je ne retrouve plus ma source, mais j’avais lu que les x premiers ports (1-x) étaient “plus sécurisés” que les autres, par l’OS lui-même, et que ce n’était donc pas nécessairement une bonne idée de changer SSH de port. À faire confirmer par quelqu’un de plus compétent que moi.

Fail2ban se débrouille bien pour ne pas perturber tes règles iptables. Dans le cas de SSH, il créé une chaine (fail2ban-SSH) et insère une première règle iptables pour que les paquets sur le port 22 passent par cette chaine (qui va contenir les bans). La chaine renvoie ensuite un RETURN et va donc repasser par tes règles.

-N fail2ban-SSH
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
[tes règles iptables]
-A fail2ban-SSH -s [ip bannie 1] -j DROP
-A fail2ban-SSH -s [ip bannie 2] -j DROP
-A fail2ban-SSH -s [ip bannie 3] -j DROP
-A fail2ban-SSH -j RETURN

Du coup, tu peux faire tes règles iptables sans te soucier de fail2ban.

[quote=“PascalHambourg”]

Principalement à diminuer le bruit dans les logs, je dirais.

Un cas où ces mesures peuvent être efficaces, néanmoins : une faille pas encore corrigée dans sshd qui permettrait, par exemple, de casser un mot de passe en 1000 tentatives.[/quote]

Un autre cas où ça m’a été utile, c’était des bots un peu trop violents qui ont pris tous les slots SSH disponibles. J’arrivais néanmoins à me connecter en retentant plusieurs fois d’affilé. J’aurais pu augmenter le [mono]MaxStartup[/mono], mais les bots auraient alors pu être encore plus bourrin.