83 votes

Des centaines d'échecs de connexion ssh

Chaque nuit, je reçois des centaines, voire des milliers, d'échecs de connexion ssh sur mon serveur RedHat 4. Pour des raisons de pare-feu depuis des sites distants, je dois utiliser le port standard. Y a-t-il quelque chose que je devrais faire pour bloquer cela ? Je remarque que beaucoup d'entre elles proviennent de la même adresse IP. Ne devrait-il pas les arrêter au bout d'un moment ?

70voto

Evan Anderson Points 140581

Vous pouvez utiliser iptables pour limiter le débit des nouvelles connexions entrantes sur le port SSH. Il faudrait que je voie toute votre configuration iptables pour vous donner une solution clé en main, mais vous parlez essentiellement d'ajouter des règles comme :

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

Ces règles supposent que vous acceptez les connexions ESTABLISHED plus tôt dans la table (afin que seules les nouvelles connexions soient concernées par ces règles). Les nouvelles connexions SSH se heurteront à ces règles et seront marquées. En 60 secondes, 5 tentatives à partir d'une seule adresse IP entraîneront l'abandon des nouvelles connexions entrantes à partir de cette adresse IP.

Cela a bien fonctionné pour moi.

Edit : Je préfère cette méthode à "fail2ban" parce qu'il n'y a pas de logiciel supplémentaire à installer, et que cela se passe totalement en mode noyau. Elle ne gère pas l'analyse des fichiers journaux comme le fera "fail2ban", mais si votre problème ne concerne que SSH, je n'utiliserais pas quelque chose en mode utilisateur qui nécessite l'installation de logiciels et qui est plus complexe.

1 votes

J'aime cette solution et j'ai l'intention de la mettre en place ce soir, une fois que j'aurai éteint les feux d'aujourd'hui.

3 votes

Il ralentit les attaques et je le recommande, mais comme il existe des botnets d'analyse distribués, ce n'est pas la panacée. Il y aura toujours des connexions non valides provenant de botnets effectuant des scans distribués contre vous. Il n'y a pas grand-chose que vous puissiez faire à ce sujet, à moins d'utiliser une sorte de système de "frappe de port" pour faire apparaître le port SSH à distance lorsque vous voulez vous connecter.

1 votes

+1 pour la suggestion de @Evan concernant le "port knocking". Quelques informations : linux.die.net/man/1/knockd . Mais ne le faites pas à la manière de la page de manuel (c'est-à-dire en ajoutant/supprimant des règles iptables), mais utilisez plutôt -m condition iptables match à la place.

39voto

Kyle Brandt Points 81077

fail2ban peut y contribuer en bloquant les adresses IP dont le nombre de tentatives de connexion échouées est trop élevé.

13 votes

Je n'aime pas que des outils/scripts lisent les journaux et lancent des commandes au nom de l'utilisateur sysadmin

4 votes

@asdmin, oui, surtout quand ils ont un si beau palmarès ...

25voto

KPWINC Points 11174

Je vous recommanderais d'utiliser un port non standard pour SSH si vous le pouvez (par exemple, le port 10222), mais puisque vous avez mentionné que vous ne pouvez pas le faire, je vous recommanderais d'utiliser quelque chose comme DenyHosts.

http://denyhosts.sourceforge.net/

Excellent paquet, facile à installer et à configurer.

6 votes

Je ne sais pas pourquoi les gens upvote ce ; SSH est sur un port standard 22. Cela signifie que lorsque vous êtes sur un réseau étranger, vous ne comptez pas sur le fait qu'ils aient ouvert un port non standard à travers le pare-feu sortant. La vraie solution à ce problème est documentée ci-dessus, soit en limitant le nombre de connexions répétées via votre pare-feu entrant, soit en désactivant les connexions par mot de passe.

1 votes

OpenSSH 6.7 tombe Support de tcpwrappers c'est ce que denyhosts utilise.

15voto

David Mackintosh Points 14093

Bien qu'il soit agréable de pouvoir se connecter à votre système par ssh à partir d'emplacements arbitraires sur Internet, il existe des systèmes automatisés d'attaque par mot de passe qui se verrouillent sur un port ssh ouvert et appliquent diverses attaques par compte utilisateur et par dictionnaire contre votre système. Ces attaques peuvent être agréables à lire dans le résumé de votre journal de nuit et constituent un gaspillage de votre bande passante.

Si vous disposez d'un serveur web sur le même système, vous pouvez utiliser des wrappers php et tcp pour restreindre le trafic entrant de ssh aux systèmes connus, et vous donner une clé back-door pour vous permettre d'accéder à des systèmes arbitraires sur Internet.

Voici comment faire :

refuser toutes les connexions ssh dans /etc/hosts.deny :

# /etc/hosts.deny fragment
sshd:  all

Autorisez les systèmes connus par IP dans /etc/hosts.allow, et ajoutez un fichier pour l'accès temporaire :

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Créez un fichier php sur votre serveur Web et donnez-lui un nom non évident comme my-sshd-access.php :

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

Pardonnez le code php - je l'ai piqué ailleurs, donc il pourrait probablement être nettoyé de fond en comble. Tout ce qu'il fait est d'ajouter l'adresse IP du système qui y accède au fichier /etc/hosts.allow.temporary-sshd-access, qui est lu par sshd (du fait de son inclusion par /etc/hosts.allow) au moment de la connexion.

Maintenant, lorsque vous êtes sur un système arbitraire sur le web et que vous voulez vous connecter à ce système, utilisez d'abord un navigateur web et cliquez sur ce fichier (ou utilisez wget ou équivalent) :

$ wget http://your.system.name/my-sshd-access.php

Vous devriez maintenant être en mesure de vous connecter à votre système. S'il s'agit d'un endroit d'où vous vous connecterez fréquemment, il serait trivial de lire le contenu du fichier /etc/hosts.allow.temporary-sshd-access et d'ajouter l'adresse IP de façon permanente à /etc/hosts.allow.

0 votes

Pour plus de sécurité, exécutez cette page sur https.

0 votes

Si vous modifiez le script pour qu'il ne sorte pas le contenu du fichier "adresse IP temporaire autorisée", il n'y aura rien à renifler pour un éventuel sniffeur. Vous pouvez alors l'exécuter sur http au lieu de https.

0 votes

L'"adresse IP temporaire autorisée" est toujours celle du demandeur (c'est-à-dire la vôtre). Je ne pense pas que cela ait une importance dans un sens ou dans l'autre. Https signifie que l'URL demandée est cryptée, ce qui signifie qu'il n'est pas trivial de la renifler sur le fil.

9voto

jammus Points 1796

Vous pouvez consulter denyhosts également.

FYI : OpenSSH 6.7 tombe. Support de tcpwrappers ce qui signifie que denyhosts n'est probablement pas la solution pour les nouvelles installations.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X