Où sont les journaux
| Système | Lire les journaux avec |
|---|---|
| Debian ou Ubuntu, avec systemd | sudo journalctl -u ssh |
| Red Hat ou Fedora, avec systemd | sudo journalctl -u sshd |
| Debian ou Ubuntu avec rsyslog | /var/log/auth.log |
| Famille Red Hat avec rsyslog | /var/log/secure |
Un fichier peut manquer, et c'est normal : Debian n'installe plus rsyslog par défaut depuis la version 12, donc un système Debian récent n'a souvent que le journal systemd.
Avec journalctl
sudo journalctl -u ssh --since today
sudo journalctl -u ssh --since "2 hours ago" --grep 'Accepted|Failed|Invalid'
sudo journalctl -u ssh -f
-f suit les nouvelles lignes au fur et à mesure, ce qui aide quand vous testez une connexion.
Avec les fichiers texte
sudo grep Accepted /var/log/auth.log
sudo grep -E 'Failed password|Invalid user' /var/log/auth.log
Les lignes plus anciennes peuvent se trouver dans /var/log/auth.log.1 et dans les fichiers compressés à côté. Depuis OpenSSH 9.8, ces lignes portent le nom sshd-session et non sshd : un filtre ou un script qui cherche sshd[ ne trouve rien sur un système actuel.
Ce que signifient les lignes
Toutes sont de vraies lignes d'un serveur de test, avec l'adresse modifiée.
sshd-session[1329]: Accepted publickey for user from 203.0.113.10 port 43594 ssh2: ED25519 SHA256:NxFS05Q+k1zf...
sshd-session[1339]: Accepted password for user from 203.0.113.10 port 43598 ssh2
Quelqu'un s'est connecté. Ce sont les lignes à lire en premier. La première montre quelle clé a été utilisée. Voir comment révoquer une clé si vous en trouvez une que vous ne voulez pas.
sshd-session[1311]: Failed password for user from 203.0.113.10 port 33598 ssh2
Un mot de passe erroné pour un compte qui existe.
sshd-session[1317]: Invalid user admin from 203.0.113.10 port 50898
sshd-session[1317]: Failed password for invalid user admin from 203.0.113.10 port 50898 ssh2
Une tentative sur un compte qui n'existe pas sur ce système. C'est à quoi ressemble la plupart des devinettes automatisées.
sshd-session[1326]: Connection closed by authenticating user user 203.0.113.10 port 43590 [preauth]
Le client a abandonné pendant la connexion. Avec des connexions par clé, cela signifie généralement qu'une clé a été proposée sans être acceptée. Par défaut, le journal ne dit pas laquelle.
sshd-session[1317]: error: maximum authentication attempts exceeded for invalid user admin from 203.0.113.10 port 50898 ssh2 [preauth]
Le client a dépassé MaxAuthTries et a été déconnecté.
Compter les tentatives par adresse et par utilisateur
# Which addresses
sudo grep -E 'Failed password|Invalid user' /var/log/auth.log \
| grep -oE 'from [0-9a-f.:]+' | sort | uniq -c | sort -rn | head -20
# Which user names they try
sudo grep -oE 'Invalid user [^ ]+' /var/log/auth.log \
| awk '{print $3}' | sort | uniq -c | sort -rn | head -20
Une seule tentative produit généralement à la fois une ligne Failed et une ligne Invalid user : considérez les nombres comme une indication. Avec le journal systemd, commencez le premier pipeline ainsi :
sudo journalctl -u ssh --since today --no-pager | grep -E 'Failed password|Invalid user' \
| grep -oE 'from [0-9a-f.:]+' | sort | uniq -c | sort -rn | head -20
Voir qui est connecté maintenant
who
w
Les deux listent les sessions avec un terminal. Une commande lancée avec ssh server somecommand, un transfert de fichiers ou un tunnel n'apparaît pas. Pour voir toutes les connexions, y compris celles-là :
sudo ss -tnp state established '( sport = :22 )'
Changez 22 si votre serveur utilise un autre port. Nous avons vu la connexion dans cette liste alors que who n'affichait rien.
Sessions passées : last et lastb
last -a -n 20
sudo lastb -a -n 20
last lit les connexions passées et lastb les échouées. -a place l'adresse dans la dernière colonne. Deux limites sont apparues dans nos tests :
lastn'a montré que les sessions avec un terminal. Une connexion qui a seulement lancé une commande n'a rien laissé : les fichiers de journal sont donc le registre le plus complet.- Sur Debian 13, ces commandes ont disparu. Le paquet
util-linuxn'inclut pluslastnilastb. Installezwtmpdbetlibpam-wtmpdbpour retrouverlast, ce qui a fonctionné dans notre test, pour les sessions postérieures à l'installation. Pour les échecs, il n'existe pas de remplaçant qui lise l'ancien fichier. Les notes de version suggèrentlslogins --failed, mais il n'a rien affiché dans notre test : utilisez les journaux.
Voir quelle clé a été refusée
Pour journaliser aussi l'empreinte des clés qui échouent, mettez ceci dans un fichier de /etc/ssh/sshd_config.d/ et rechargez :
LogLevel VERBOSE
sshd-session[1376]: Failed publickey for user from 203.0.113.10 port 43612 ssh2: RSA SHA256:R3PypHnQ7AMz...
Que faire de ce que vous trouvez
- Beaucoup d'échecs depuis beaucoup d'adresses : c'est courant sur tout serveur ouvert à Internet. Si le serveur n'accepte que les clés, les essais de mots de passe ne peuvent pas réussir. Voir comment désactiver la connexion par mot de passe et, pour réduire le bruit, fail2ban.
- Une ligne
Acceptedque vous ne savez pas expliquer : prenez cela au sérieux. Notez l'heure, l'adresse et la clé. Supprimez cet accès, regardez ce que le compte a fait, et si vous n'êtes pas sûr de ce qui s'est passé, reconstruisez le serveur à partir d'un état propre.
Quelqu'un qui a root peut modifier les journaux locaux : pour les serveurs importants, envoyez-les aussi vers une autre machine.
Pour rendre inutiles les essais de mots de passe, générez une clé SSH Ed25519 et n'acceptez que les clés.
Questions
Comment voir les tentatives de connexion SSH échouées ?
Sur les systèmes avec systemd, lancez sudo journalctl -u ssh --grep 'Failed|Invalid' (sshd sur Red Hat). Avec les journaux texte, cherchez 'Failed password' dans /var/log/auth.log ou /var/log/secure avec grep. sudo lastb liste les échecs là où il est installé.
Où se trouve le journal SSH sous Ubuntu ?
Dans le journal, à lire avec sudo journalctl -u ssh, et dans /var/log/auth.log quand rsyslog est présent, ce qui est le cas par défaut sous Ubuntu.
Beaucoup de connexions SSH échouées, est-ce un problème ?
Sur un serveur public, c'est le bruit de fond normal des robots, et ils ne peuvent pas réussir si seules les clés sont acceptées. La ligne qui demande une action est un Accepted que vous ne pouvez pas expliquer.
Sources
- journalctl(1), systemd
- Notes de version de Debian 13, points à connaître
- Notes de version de Debian 12, changements de la journalisation système
- sshd_config(5), LogLevel