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
- Enregistrez le script :
sudo nano /usr/local/bin/ssh-monitor.sh sudo chmod +x /usr/local/bin/ssh-monitor.sh
- Installez un MTA (ex.
sendmail
,postfix
,msmtp
) pour les alertes e-mail. - 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
- 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
Auteur/autrice
sdgadmin@tux.ovh
Publications similaires


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

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