web-dev-qa-db-fra.com

Comment arrêter / empêcher la force brute SSH

Je suis très nouveau dans l'administration des réseaux, veuillez donc noter que je ne suis pas encore expérimenté.

J'ai un serveur racine Ubuntu avec panneau plesk.

Hier, mes amis et moi avons remarqué que la qualité de la parole sur notre TS3 était très mauvaise. J'ai envoyé des pings au serveur et il y a eu une perte de paquets très élevée. Après cela, j'ai googlé un peu et découvert qu'il y a un auth.log. Je l'ai téléchargé et j'ai fait défiler un peu, puis j'ai trouvé ceci:

May 13 10:01:27 rs204941 sshd[9351]: input_userauth_request: invalid user student [preauth]
May 13 10:01:27 rs204941 sshd[9351]: pam_unix(sshd:auth): check pass; user unknown
May 13 10:01:27 rs204941 sshd[9351]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=112.220.198.102 
May 13 10:01:29 rs204941 sshd[9351]: Failed password for invalid user student from 112.220.198.102 port 39806 ssh2
May 13 10:01:29 rs204941 sshd[9351]: Received disconnect from 112.220.198.102: 11: Bye Bye [preauth]
May 13 10:01:31 rs204941 sshd[9353]: Invalid user student from 112.220.198.102

Il semble que quelqu'un ait essayé de se connecter à plusieurs reprises via SSH. J'ai fait défiler un peu et j'ai vu que cette personne essayait d'utiliser de nombreux noms d'utilisateur différents: student, tech, psi, news,...

Des centaines de ces connexions ont été affichées dans le fichier.

J'ai recherché les statistiques de trafic sur le site Web de mon centre de données. Ce n'était qu'à 17 Mo par heure. J'ai une dorsale 100Mbit, donc le transfert de données lui-même ne semble pas être le problème.

Pour le moment, je ne peux en aucun cas accéder au serveur.

Ma question est: comment puis-je obtenir à nouveau l'accès, comment puis-je supprimer cette attaque et empêcher les attaques suivantes?

23
user219534

Comment y accéder?

La raison pour laquelle vous ne pouvez pas accéder à votre compte n'est pas claire.

Si votre ordinateur est attaqué ou soumis à une charge élevée, vous devriez parler à votre fournisseur de la restriction d'accès (restrictions IP) ou de la mise hors ligne du serveur (se déconnecter d'Internet).

Vous pourriez également avoir besoin d'un accès hors bande avec lequel votre fournisseur pourra vous aider.

Si quelqu'un a compromis votre serveur, vous devrez peut-être restaurer à partir de sauvegardes ou utiliser une image de récupération.

Comment empêcher les attaques sur votre serveur, en particulier SSH

meilleure façon d'empêcher les ouvertures de session par force brute?

Ne les laissez pas accéder à votre machine en premier lieu! Il existe de nombreuses façons d'arrêter les tentatives de force brute avant qu'elles n'atteignent votre hôte, ou même au niveau SSH.

Cela dit, protéger votre système d'exploitation avec quelque chose comme fail2ban est une excellente idée. 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 qui écrit des 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 que vous devez envisager pour empêcher les connexions par force brute:

SSH:

  • Ne pas autoriser root à se connecter
  • Ne pas autoriser les mots de passe ssh (utiliser l'authentification par clé privée)
  • N'écoutez pas sur toutes les interfaces
  • Créez une interface réseau pour SSH (par exemple eth1), qui est différente de l'interface à partir de laquelle vous servez les demandes (par exemple eth0)
  • N'utilisez pas de noms d'utilisateur courants
  • Utiliser une liste d'autorisation et autoriser uniquement les utilisateurs qui nécessitent un accès SSH
  • Si vous avez besoin d'un accès Internet ... Restreignez l'accès à un ensemble fini d'adresses IP. Une IP statique est idéale, mais le verrouiller à x.x.0.0/16 est meilleur que 0.0.0.0/0
  • Si possible, trouvez un moyen de vous connecter sans accès à Internet, de cette façon, vous pouvez 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 comme fail2ban pour attraper toutes les attaques par force brute
  • Assurez-vous que le système d'exploitation est toujours à jour, en particulier les packages de sécurité et ssh

Application:

  • Assurez-vous que votre application est toujours à jour, en particulier les packages de sécurité
  • Verrouillez les pages "admin" de votre application. La plupart des conseils ci-dessus s'appliquent également à la zone d'administration de votre application.
  • Mot de passe Protégez votre zone d'administration, quelque chose comme htpasswd pour la console Web projettera toutes les vulnérabilités sous-jacentes des applications et créera une barrière supplémentaire à l'entrée
  • Verrouillez les autorisations de fichier. Les "dossiers de téléchargement" sont connus pour être des points d'entrée de toutes sortes de choses désagréables.
  • Pensez à placer votre application derrière un réseau privé et à exposer uniquement votre équilibreur de charge frontal et un jumpbox (il s'agit d'une configuration typique dans AWS à l'aide de VPC)
39
Drew Khoury

comment puis-je supprimer cette attaque et empêcher les attaques suivantes

Habituellement, je change le port ssh par défaut de 22 en un autre comme 1122. Cela empêche de nombreuses attaques automatiques du bot, mais une simple analyse de port peut le détecter. En tous cas:

vi /etc/ssh/sshd_config

et modifiez Port 22 en Port 1122 , mais cela ne suffit pas.

Règles IPTables automatiques sur bruteforce

j'utilise log2iptables https://github.com/theMiddleBlue/log2iptables à la place Fail2ban, car c'est un simple script Bash qui analyse tout fichier journal avec une expression régulière et exécutez iptables. Par exemple, lorsque 5 correspondances se produisent, log2iptables supprime l'adresse IP spécifique. C'est cool car utilisez l'API Telegram et pouvez m'envoyer un message sur mon téléphone quand il trouve un problème :)

j'espère que cela vous aidera!

4
theMiddle

Je viens de mettre cela ensemble, d'exécuter toutes les 15 minutes en tant que cronjob, etc.:

for z in `grep Invalid /var/log/auth.log | awk '{ print $NF }' | sort | uniq`
do
  count1=`grep $z /etc/hosts.deny | wc -l`
  count2=`grep Invalid /var/log/auth.log | grep $z | wc -l`
  if [ $count1 -eq 0 -a $count2 -gt 10 ] ; then
    current=`egrep "^ssh" /etc/hosts.deny | sed 's/sshd[ :,]*//'`
    Sudo cp /etc/hosts.deny.bak /etc/hosts.deny
    Sudo chmod 666 /etc/hosts.deny
    if [ $current ] ; then
      echo "sshd : $current , $z" >> /etc/hosts.deny
    else
      echo "sshd : $z" >> /etc/hosts.deny
    fi
    Sudo chmod 644 /etc/hosts.deny
  fi
done
2
Mark

Solution automatisée pour Centos/RHEL pour bloquer les mauvais acteurs

Voici un script pour Centos pour vérifier les échecs de connexion ssh pour les comptes d'utilisateurs non valides et les mauvais mots de passe pour les comptes valides. Si l'IP source nous a frappé plus de 3 fois et n'est pas déjà sur la liste de refus, elle est ajoutée à la liste de refus. Je l'exécute toutes les 15 minutes depuis le crontab de root. J'ai également interdit les connexions root via ssh, donc la combinaison garde les choses assez silencieuses.

     #/bin/bash
     # Save a copy of the existing hosts.deny file for safety
     cp /etc/hosts.deny /etc/hosts.deny.bak
     # Get a list of the offending IP addresses and process them
     for z in `grep "Invalid\|Failed" /var/log/secure | awk '{ print $NF }' | sort | uniq`
     do
     # Get the number of times this IP hit us
     hits=`grep "Invalid\|Failed" /var/log/secure* | grep $z | wc -l`
     # Check whether this IP is already blocked
     blocked=`grep $z /etc/hosts.deny | wc -l`
     # If they hit us more than 3 times and are not already on the deny list
     # add them to the deny list
     if [ $hits -gt 3 -a $blocked -eq 0 ]
     then
          echo "sshd : $z" >> /etc/hosts.deny
     fi
     done
0
David Lash

Ceci est ma solution alternative pour les attaques SSH. L'idée est de continuer à fermer le démon SSH s'il n'est pas utilisé. Pas de port ouvert, pas d'attaque. Tu peux l'essayer. C'est open source https://github.com/indy99/nnet_port_guard

0
indy99