Sécurisez votre serveur SSH

1. Désactiver l’accès SSH direct au compte root ainsi que l’authentication par mot de passe

⚠️ Avant de désactiver les mots de passe, vérifier la connexion via clé SSH

Dans /etc/ssh/sshd_config, modifier :

PermitRootLogin no
PasswordAuthentication no

script de surveillance et blocage automatique des IP malveillantes

Les tentatives de brute-force SSH sont omniprésentes dès qu’un serveur Linux est exposé à Internet.

  • Surveiller les échecs de connexion SSH
  • Bloquer automatiquement les IP abusives via iptables
  • Vous alerter par e-mail en cas de bannissement

ssh-monitor.sh

Placez ce code dans /usr/local/bin/ssh-monitor.sh et rendez-le exécutable (chmod +x).

#!/usr/bin/env bash

# -------------------------------------------------------------------
# /usr/local/bin/ssh-monitor.sh
# Surveillance des échecs SSH et blocage automatique des IP trop actives
# -------------------------------------------------------------------

# Configuration
LOGFILE="/var/log/auth.log"           # Fichier de log SSH
STATEFILE="/var/tmp/ssh-monitor.state"  # Pour mémoriser la position lue
THRESHOLD=5                            # Seuil d'échecs avant blocage
ADMIN_EMAIL="admin@votredomaine.tld"   # Destinataire des alertes
BAN_CHAIN="SSH-BAN"                    # Chaîne iptables dédiée

# Création et liaison de la chaîne iptables
iptables -L $BAN_CHAIN >/dev/null || iptables -N $BAN_CHAIN
iptables -C INPUT -j $BAN_CHAIN >/dev/null || iptables -I INPUT -j $BAN_CHAIN

# Initialisation du statefile si nécessaire
: > "$STATEFILE" 2>/dev/null || echo "0" > "$STATEFILE"

# Lecture incrémentale du log
LAST_POS=$(cat "$STATEFILE")
CUR_POS=$(stat --format=%s "$LOGFILE")
[[ $CUR_POS -lt $LAST_POS ]] && LAST_POS=0

tail --bytes=+$((LAST_POS + 1)) "$LOGFILE" \
  | grep "Failed password for" \
  > /tmp/ssh-fails.$$

echo "$CUR_POS" > "$STATEFILE"

# Comptage et blocage
awk '{ for(i=1;i<=NF;i++) if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i }' /tmp/ssh-fails.$$ \
  | sort | uniq -c | while read count ip; do
    if (( count >= THRESHOLD )); then
      if ! iptables -C $BAN_CHAIN -s "$ip" -j DROP >/dev/null; then
        iptables -A $BAN_CHAIN -s "$ip" -j DROP
        echo -e "Subject: [ALERTE SSH] IP bannie : $ip\n\n$(date)\nL'IP $ip a généré $count échecs SSH et a été bloquée." \
          | sendmail "$ADMIN_EMAIL"
      fi
    fi
done

# Nettoyage
rm -f /tmp/ssh-fails.$$

Comment fonctionne le script ?

1. Configuration

LOGFILE : fichier de logs SSH (/var/log/auth.log sur Debian/Ubuntu).
THRESHOLD : nombre d’échecs avant blocage automatique.
ADMIN_EMAIL : destinataire des e-mails d’alerte.
BAN_CHAIN : chaîne personnalisée iptables.

2. Chaîne iptables dédiée

Le script crée une chaîne SSH-BAN puis l’insère en tête de la chaîne INPUT : ainsi tous les paquets entrants sont filtrés par SSH-BAN avant le reste de la configuration.

3. Lecture incrémentale

Pour éviter de reparcourir tout le fichier de log à chaque passage, on mémorise la dernière position lue dans STATEFILE. Si le log est tourné (rotation), on repart de zéro.

4. Extraction et comptage

Le script filtre les lignes contenant « Failed password for », extrait les adresses IPv4, puis trie et compte les occurrences.
Les IP dépassant le seuil défini sont alors ciblées.

5. Blocage et notification

Pour chaque IP abusive, on ajoute une règle DROP dans la chaîne SSH-BAN (si elle n’y figure pas déjà), puis on envoie un mail d’alerte via sendmail.

6. Nettoyage

Le fichier temporaire de collecte des échecs est supprimé à la fin de l’exécution (/tmp/ssh-fails.$PID).

Mise en place

  1. Enregistrez le script : sudo nano /usr/local/bin/ssh-monitor.sh sudo chmod +x /usr/local/bin/ssh-monitor.sh
  2. Installez un MTA (ex. sendmail, postfix, msmtp) pour les alertes e-mail.
  3. Créez une tâche cron pour exécuter le script chaque minute : sudo crontab -e Ajoutez la ligne : * * * * * /usr/local/bin/ssh-monitor.sh
  4. Vérifiez périodiquement votre chaîne de blocage : sudo iptables -L SSH-BAN -n --line-numbers

Conclusion

Ce script Bash offre une protection simple et efficace contre les attaques de brute-force SSH

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Thème : Superposition par Kaira. CopyLerft 2025