Artefacts SSH : authorized_keys, known_hosts, logs sshd
Artefacts OpenSSH sous Linux (authorized_keys, known_hosts, configuration, clés d'hôte, logs sshd) : accès distant, persistance par clé et mouvement latéral.
- Emplacement
- ~/.ssh/authorized_keys
- Prouve
- Quelles clés peuvent se connecter à un compte, vers où un utilisateur s'est connecté, et qui s'est connecté en SSH et d'où
- Horodatages
- Fichiers de clés : horodatages du système de fichiers uniquement ; journaux : heure locale syslog ou usec du journal depuis l'epoch Unix (UTC)
- Accès
- root (ou le titulaire du compte pour son propre ~/.ssh) ; groupe adm/systemd-journal pour les journaux
- Rétention
- Fichiers de clés jusqu'à suppression ; lignes de journal selon la rotation syslog et les limites du journal
- Collecte
- UAC, Velociraptor, cp -a, journalctl
Outils
Comparer tous les outils- Hash ExtractorNavigateur
- Linux Log ParserNavigateur
- ssh-keygenCLI · intégré à Linux
- VelociraptorPlateforme · open source
- UACCLI · open source
- grep / zgrepCLI · intégré à Linux
Ce que c'est
OpenSSH laisse des traces aux deux extrémités d'une connexion. Côté serveur, authorized_keys détermine quelles clés publiques peuvent se connecter à un compte, sshd_config fixe les règles, et sshd journalise chaque tentative acceptée ou échouée. Côté client, known_hosts enregistre les serveurs auxquels un utilisateur s'est connecté et ~/.ssh/config les nomme souvent. Ensemble, ils répondent aux deux questions centrales de la plupart des intrusions Linux : comment l'attaquant est-il entré, et où est-il allé ensuite.
Ajouter une clé à authorized_keys est l'une des techniques de persistance Linux les plus courantes (MITRE ATT&CK T1098.004), car elle survit aux réinitialisations de mot de passe.
Où il se trouve
| Artefact | Chemin | Remarques |
|---|---|---|
| Clés autorisées | ~/.ssh/authorized_keys, ~/.ssh/authorized_keys2 | AuthorizedKeysFile par défaut ; vérifiez chaque répertoire personnel, y compris /root et les comptes de service |
| Hôtes connus | ~/.ssh/known_hosts, /etc/ssh/ssh_known_hosts | Liste des serveurs côté client |
| Sauvegarde avant hachage | ~/.ssh/known_hosts.old | Laissé par ssh-keygen -H lors du hachage d'un fichier |
| Configuration client | ~/.ssh/config, /etc/ssh/ssh_config, /etc/ssh/ssh_config.d/ | Alias d'hôtes, utilisateurs, hôtes de rebond, clés |
| Clés utilisateur | ~/.ssh/id_*, ~/.ssh/id_*.pub | Notez uniquement leur présence et leurs empreintes |
| Scripts par connexion | ~/.ssh/rc, /etc/ssh/sshrc | Exécutés par sshd avant le shell de l'utilisateur |
| Environnement utilisateur | ~/.ssh/environment | Lu uniquement si PermitUserEnvironment l'autorise |
| Configuration serveur | /etc/ssh/sshd_config, /etc/ssh/sshd_config.d/*.conf | Drop-ins via Include dans les paquets actuels de Debian, Ubuntu et Fedora/RHEL 9 |
| Clés d'hôte | /etc/ssh/ssh_host_{rsa,ecdsa,ed25519}_key(.pub) | Identifient le serveur ; des clés régénérées changent les empreintes vues par les clients |
| Journaux | /var/log/auth.log (Debian/Ubuntu), /var/log/secure (famille RHEL), journal systemd | Facility AUTH par défaut ; les configurations de la famille RHEL définissent AUTHPRIV |
Ce qu'il prouve
- Capacité d'accès : toute clé présente dans
authorized_keyspeut se connecter sous ce compte, sous réserve de ses options et desshd_config. - Connexions effectives : les lignes
Accepted publickeyouAccepted passwordprouvent une authentification réussie, avec IP source, port et (pour les clés) l'empreinte de la clé. - Tentatives :
Failed password,Invalid useret lignes similaires révèlent la force brute et les essais de noms d'utilisateur. - Mouvement sortant :
known_hostset~/.ssh/configmontrent que le compte s'est connecté à d'autres hôtes, même sans historique du shell. - Non prouvé : le commentaire d'une clé (
user@host) est un texte libre rédigé par celui qui a créé la clé. Les entrées deknown_hostsne portent pas de date et ne montrent pas qu'une connexion a réussi, seulement qu'une clé d'hôte a été acceptée.
Champs clés
Options d'authorized_keys (séparées par des virgules, avant le type de clé) :
| Option | Signification |
|---|---|
command="..." | Impose une commande pour cette clé ; la requête d'origine est dans SSH_ORIGINAL_COMMAND |
from="pattern" | Restreint les hôtes/adresses source (CIDR autorisé) |
environment="NAME=value" | Définit des variables si PermitUserEnvironment est activé |
no-pty, no-port-forwarding, no-agent-forwarding, no-X11-forwarding, no-user-rc | Restrictions |
restrict | Toutes les restrictions à la fois ; assouplissable avec pty, port-forwarding, etc. |
permitopen=, permitlisten=, tunnel= | Contrôles de redirection et de tunnel |
expiry-time="YYYYMMDD[HHMM[SS]][Z]" | La clé cesse de fonctionner après cette date |
cert-authority, principals= | Fait confiance à une AC plutôt qu'à une clé unique |
known_hosts : [marker] hostnames keytype base64key [comment]. Les entrées hachées commencent par |1| (sel et HMAC) : les noms d'hôte ne sont donc pas lisibles directement. Debian et Ubuntu livrent HashKnownHosts yes dans /etc/ssh/ssh_config ; la valeur par défaut en amont est no.
Directives de sshd_config : AuthorizedKeysFile, AuthorizedKeysCommand, AuthorizedPrincipalsFile, TrustedUserCAKeys, PermitRootLogin (par défaut prohibit-password), PasswordAuthentication, PermitUserEnvironment (par défaut no), ForceCommand, blocs Match, LogLevel (par défaut INFO), SyslogFacility.
Lignes de journal (processus sshd, et depuis OpenSSH 9.8 aussi sshd-session ; depuis 10.0, certains messages peuvent aussi provenir de sshd-auth) :
Accepted publickey for deploy from 198.51.100.7 port 51522 ssh2: ED25519 SHA256:<fingerprint>
Accepted password for deploy from 203.0.113.50 port 40318 ssh2
Failed password for invalid user admin from 203.0.113.50 port 40022 ssh2
Invalid user admin from 203.0.113.50 port 40022
Horodatages
Les fichiers de clés et de configuration n'ont que des horodatages du système de fichiers : le mtime d'authorized_keys change à chaque ajout ou retrait de clé, et le ctime ne peut pas être modifié avec touch. Les fichiers syslog (auth.log, secure) utilisent le fuseau horaire local et, dans le format classique, pas d'année ; le journal stocke __REALTIME_TIMESTAMP en microsecondes depuis le 1970-01-01 UTC. Les valeurs expiry-time sans Z sont interprétées dans le fuseau horaire du système.
Rétention
Les fichiers de clés et de configuration restent jusqu'à leur modification. La rétention des journaux dépend de logrotate (rotation hebdomadaire avec quatre générations, un réglage Debian courant pour auth.log) et des limites de taille du journal ; voir syslog et auth.log et journal systemd. known_hosts ne fait que grossir, sauf si un utilisateur lance ssh-keygen -R ou le modifie.
Collecte
UAC dispose d'artefacts dédiés pour authorized_keys*, known_hosts, les clés publiques et ~/.ssh/rc, et collecte /etc/ssh avec /etc. Velociraptor fournit Linux.Ssh.AuthorizedKeys, Linux.Ssh.KnownHosts et Linux.Syslog.SSHLogin.
R=/mnt/evidence
tar -C "$R" -czf ssh.tgz etc/ssh root/.ssh home/*/.ssh 2>/dev/null # includes private keys: handle as sensitive
journalctl -D "$R"/var/log/journal _COMM=sshd -o short-iso # add _COMM=sshd-session on newer OpenSSH
Traitez les clés privées d'hôte et d'utilisateur comme des preuves sensibles : relevez les empreintes, restreignez l'accès, ne les réutilisez jamais.
Analyse
# fingerprint every authorized key, then match against "Accepted publickey" lines
for f in /mnt/evidence/root/.ssh/authorized_keys* /mnt/evidence/home/*/.ssh/authorized_keys*; do
echo "== $f"; ssh-keygen -l -f "$f"; done
grep -hE 'sshd(-session|-auth)?\[[0-9]+\]: (Accepted|Failed|Invalid user)' /mnt/evidence/var/log/auth.log* /mnt/evidence/var/log/secure*
zgrep -h 'Accepted' /mnt/evidence/var/log/auth.log.*.gz
# test a candidate hostname against a hashed known_hosts
ssh-keygen -F 10.0.0.12 -f /mnt/evidence/home/alice/.ssh/known_hosts
Linux Log Parser lit dans le navigateur auth.log / secure, syslog, les fichiers du journal, audit.log et wtmp / btmp / lastlog, et les fusionne en une seule chronologie avec les sessions de connexion reconstituées ; rien n'est envoyé.
Conseils d'investigation
- Rapprochez l'empreinte
SHA256:de chaque ligneAccepted publickeyd'une ligne de clé précise : vous identifiez ainsi la clé utilisée par un attaquant même si les commentaires sont faux. - Cherchez un
AuthorizedKeysFilepointant vers un chemin inhabituel, ou unAuthorizedKeysCommand, danssshd_configet dans chaque drop-in : des clés peuvent se trouver hors de~/.ssh. - Les clés
command=et~/.ssh/rcexécutent du code à chaque connexion ; une optionfrom=peut révéler l'infrastructure de l'attaquant. - Les parsers ou règles SIEM qui ne reconnaissent que
sshd[manquent les lignes étiquetéessshd-sessionousshd-authdes OpenSSH récents (leLinux.Syslog.SSHLoginde Velociraptor filtre sur le programmesshd). - Un
known_hostshaché peut quand même être testé contre les IP candidates de votre dossier avecssh-keygen -F. - Des clés d'hôte modifiées (nouveau ctime sur
/etc/ssh/ssh_host_*) peuvent indiquer un serveur reconstruit ou cloné. - Corrélez les connexions acceptées avec wtmp/lastlog et l'historique du shell de l'utilisateur.