Collecter les journaux Linux : tar, UAC, Velociraptor
Quoi collecter pour une investigation sur les journaux Linux et comment : tar sur un hôte actif, export journalctl, ausearch, UAC, Velociraptor ou image disque.
En bref. En root, archivez /var/log (journaux texte, journal, audit, wtmp/btmp/lastlog), le journal volatil de /run/log/journal et quatre fichiers de contexte : /etc/localtime, /etc/timezone, /etc/passwd et /etc/hostname. Gardez chaque rotation et chaque fichier .journal~, conservez l’arborescence, calculez l’empreinte de l’archive. Une seule commande tar suffit ; UAC et Velociraptor le font à grande échelle.
La liste des fichiers
| Chemin | Contenu | Pourquoi |
|---|---|---|
/var/log/auth.log*, /var/log/syslog* | Journaux texte Debian, Ubuntu | SSH, sudo, PAM, cron, services |
/var/log/secure*, /var/log/messages* | Journaux texte RHEL, Rocky, Alma, Fedora | Idem, avec des rotations datées (secure-20260913) |
/var/log/journal/<machine-id>/*.journal, *.journal~ | Journal systemd persistant | Champs fiables, microsecondes, numéros de séquence |
/run/log/journal/<machine-id>/*.journal | Journal volatil | Perdu au redémarrage ; le seul journal sur certains hôtes |
/var/log/audit/audit.log* | auditd | Connexions, sessions, programmes exécutés |
/var/log/wtmp*, /var/log/btmp*, /var/log/lastlog | Enregistrements de connexion | Sessions, échecs de connexion, dernière connexion par UID |
/run/utmp | Sessions en cours | Hôte actif uniquement |
/var/lib/wtmpdb/wtmp.db, /var/log/wtmp.db | wtmpdb | openSUSE, Debian 13 |
/var/lib/lastlog/lastlog2.db | lastlog2 | util-linux 2.40+ |
/etc/localtime, /etc/timezone | Fuseau horaire | Pour les lignes syslog sans décalage |
/etc/passwd, /etc/hostname | Correspondance UID-nom, nom d’hôte | Attribution |
Les fichiers de fuseau horaire comptent plus qu’il n’y paraît. Une ligne RFC 3164 traditionnelle comme Sep 14 10:02:11 n’a ni année ni fuseau : sans /etc/localtime, toute conversion en UTC est une supposition.
Hôte actif : une seule commande tar
En root sur l’hôte :
sudo tar -C / -czf /tmp/linux-logs.tar.gz --ignore-failed-read --sparse \
var/log run/log/journal etc/localtime etc/timezone etc/passwd etc/hostname
Copiez ensuite l’archive sur votre poste :
scp user@host:/tmp/linux-logs.tar.gz .
Remarques sur les options :
--ignore-failed-readignore, avec un simple avertissement plutôt qu’un échec, les chemins qui n’existent pas sur cette distribution (pas de/etc/timezonesur RHEL, pas de/run/log/journalsur les hôtes à stockage persistant).--sparsecompte pourlastlog: c’est un fichier creux indexé par UID, qui peut sembler peser plusieurs gigaoctets lorsqu’un UID élevé s’est connecté.--sparsene stocke que les blocs utilisés.- Les droits root sont nécessaires :
auth.log,btmp,audit.loget le journal ne sont pas lisibles par un utilisateur ordinaire.
Écrire l’archive dans /tmp modifie le disque de la cible. Si c’est inacceptable, écrivez sur un support externe monté ou transmettez l’archive en flux via SSH.
Si vous ne pouvez exécuter que journalctl
Le format d’export de journalctl est sans perte et conserve tous les champs :
sudo journalctl -o export > journal.export
sudo journalctl -D /mnt/evidence/var/log/journal -o export > journal.export # depuis une image montée
-o json fonctionne aussi. Les fichiers journal bruts restent préférables : l’export correspond à ce que journalctl a pu lire, alors que les fichiers conservent les numéros de séquence, les en-têtes et les fins de fichier endommagées, là où apparaissent les entrées supprimées. Passez toujours -D lorsque vous lisez des éléments de preuve : sans cette option, journalctl lit le journal de la machine d’analyse elle-même.
Tous les journaux d’audit dans un seul fichier
sudo ausearch --input-logs --raw > audit.log
--input-logs lit l’emplacement des journaux dans auditd.conf, y compris les fichiers audit.log.N tournés, et --raw conserve les enregistrements d’origine, y compris les champs ENRICHED après le séparateur 0x1D. Sur un hôte actif, sauvegardez aussi les règles chargées : auditctl -l et auditctl -s. Les règles chargées peuvent différer de /etc/audit/rules.d/.
UAC
UAC (Unix-like Artifacts Collector) est un script shell qui fonctionne sur presque tous les Unix. Avec uniquement les artefacts de journalisation :
sudo ./uac -a files/logs/var_log.yaml,files/logs/run_log.yaml,files/system/etc.yaml,files/system/utmp.yaml /tmp
-a prend une liste de fichiers d’artefacts séparés par des virgules. La sortie est uac-<host>-linux-<date>.tar.gz, que Linux Log Parser ouvre directement. Vous pouvez aussi utiliser le profil de triage standard, qui inclut les mêmes journaux et bien plus :
sudo ./uac -p ir_triage /tmp
UAC fournit les profils ir_triage, full, offline et offline_ir_triage. Les profils offline sont destinés à une image montée plutôt qu’à un système en fonctionnement.
Velociraptor
Collectez les fichiers bruts avec Generic.Collectors.File, à partir de la racine /, depuis l’interface graphique, une chasse (hunt), un collecteur hors ligne ou la ligne de commande :
velociraptor artifacts collect Generic.Collectors.File \
--args Root=/ --args collectionSpec=$'Glob\nvar/log/**\nrun/log/journal/**\netc/localtime\netc/timezone\netc/passwd\netc/hostname' \
--output linux-logs.zip
Déposez le ZIP obtenu tel quel dans l’outil. Velociraptor propose aussi des artefacts d’analyse comme Linux.Forensics.Journal, Linux.Sys.LastUserLogin, Linux.Syslog.SSHLogin et Linux.Ssh.AuthorizedKeys. Ils sont utiles pour chasser sur tout un parc, mais ils renvoient des lignes, pas des fichiers : impossible de les réanalyser ou d’y rechercher plus tard des trous de séquence. Collectez aussi les fichiers.
Machine éteinte ou image disque
Montez le système de fichiers racine en lecture seule (idéalement sans rejouer le journal ext4), puis archivez les mêmes chemins :
sudo mount -o ro /dev/sdX1 /mnt/evidence # ou une image montée en lecture seule
tar -C /mnt/evidence -czf ~/linux-logs.tar.gz --ignore-failed-read --sparse \
var/log etc/localtime etc/timezone etc/passwd etc/hostname
Le journal volatil de /run/log/journal et /run/utmp n’existent que sur un système en fonctionnement. Si l’hôte a été éteint et que journald était volatil, le journal est perdu ; l’acquisition de la mémoire est alors la seule autre voie.
Pièges
- Prenez chaque rotation.
auth.log.1,auth.log.2.gz,secure-20260913,wtmp.1,audit.log.4: c’est dans l’historique le plus ancien que se trouve généralement le premier accès. - Prenez les fichiers
.journal~. Ce sont des journaux renommés après un arrêt non propre ou une corruption détectée, et ils couvrent souvent l’incident. - Collectez les journaux utilisateur. journald numérote les entrées sur l’ensemble des fichiers d’une machine : des fichiers
user-<UID>.journaloubliés ressemblent à des entrées supprimées. - Préservez les dates de modification. L’année des lignes syslog traditionnelles en est déduite.
tarles conserve ; une copie via certains outils de partage de fichiers, non. - Notez l’heure. logrotate peut s’exécuter pendant la collecte. Calculez l’empreinte de l’archive et notez quand elle a été créée.
- Vérifiez l’architecture. Les enregistrements wtmp font 384 octets sur x86_64 mais 400 octets sur aarch64 ; notez celle de l’hôte.
Étape suivante
Déposez l’archive, l’archive UAC, le ZIP Velociraptor ou le dossier dans Linux Log Parser. Le guide de référence explique l’apport de chaque source, et l’investigation pas à pas montre une analyse complète. La fiche sur le journal et la fiche sur auth.log détaillent les chemins par distribution.