Skip to content

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.

Publié le 5 min de lecture

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

CheminContenuPourquoi
/var/log/auth.log*, /var/log/syslog*Journaux texte Debian, UbuntuSSH, sudo, PAM, cron, services
/var/log/secure*, /var/log/messages*Journaux texte RHEL, Rocky, Alma, FedoraIdem, avec des rotations datées (secure-20260913)
/var/log/journal/<machine-id>/*.journal, *.journal~Journal systemd persistantChamps fiables, microsecondes, numéros de séquence
/run/log/journal/<machine-id>/*.journalJournal volatilPerdu au redémarrage ; le seul journal sur certains hôtes
/var/log/audit/audit.log*auditdConnexions, sessions, programmes exécutés
/var/log/wtmp*, /var/log/btmp*, /var/log/lastlogEnregistrements de connexionSessions, échecs de connexion, dernière connexion par UID
/run/utmpSessions en coursHôte actif uniquement
/var/lib/wtmpdb/wtmp.db, /var/log/wtmp.dbwtmpdbopenSUSE, Debian 13
/var/lib/lastlog/lastlog2.dblastlog2util-linux 2.40+
/etc/localtime, /etc/timezoneFuseau horairePour les lignes syslog sans décalage
/etc/passwd, /etc/hostnameCorrespondance UID-nom, nom d’hôteAttribution

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-read ignore, avec un simple avertissement plutôt qu’un échec, les chemins qui n’existent pas sur cette distribution (pas de /etc/timezone sur RHEL, pas de /run/log/journal sur les hôtes à stockage persistant).
  • --sparse compte pour lastlog : c’est un fichier creux indexé par UID, qui peut sembler peser plusieurs gigaoctets lorsqu’un UID élevé s’est connecté. --sparse ne stocke que les blocs utilisés.
  • Les droits root sont nécessaires : auth.log, btmp, audit.log et 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>.journal oubliés ressemblent à des entrées supprimées.
  • Préservez les dates de modification. L’année des lignes syslog traditionnelles en est déduite. tar les 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.

Articles liés

Prouver que des journaux Linux ont été modifiés ou supprimés : trous de seqnum, lignes absentes d’auth.log, wtmp effacé, démons arrêtés, commandes d’effacement.
Comment les quatre familles de journaux Linux s’articulent dans une investigation, ce que chacune prouve, où elles divergent et comment les fusionner.
Analyse forensique des fichiers journal systemd sans journalctl : format, champs fiables, compression, trous de seqnum, fichiers .journal~ et champs d’heure.