Dans

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 *

Auteur/autrice

sdgadmin@tux.ovh

Publications similaires

Dans

awstats-viewer

une application Yunohost qui affiche les stats d’AWStats,

Lire la suite
Dans

CHAT CONTROL est de retour

Chat Control est un projet de règlement de l’Union européenne proposé par la Commission le 11 mai 2022 afin d’instaurer un cadre...

Lire la suite

Lenovo Yoga Pro 9i

Configuration Lenovo Yoga Pro 9i Linux soundcard speaker

Lire la suite
Dans

CachyOS

CachyOS Présentation de CachyOS Présentation de CachyOS CachyOS est une distribution Linux cutting edge (avant-gardiste) basée sur Arch Linux, conçue pour offrir...

Lire la suite
Dans

PI-Hole

Qu’est-ce que Pi-hole ? Pi-hole est un serveur DNS récursif local qui intercepte les requêtes DNS vers des domaines tiers utilisés pour...

Lire la suite