Mode opératoire — Envoyer les journaux d’une machine Windows vers un serveur syslog, avec Fluent Bit

Document autonome. Partie théorique, puis mise en œuvre telle qu’elle a été réalisée et vérifiée le 21/10/2026 sur AD-Core-01 (Windows Server 2025 Core) et poste-win11 (Windows 11 Pro) — phase 14 du suivi, tâche 14.5. La méthode vaut pour toute machine Windows dont on veut centraliser les journaux. Le serveur de réception est décrit dans MO-15-Rsyslog-Galera.md. Contexte : Documentation-pfSense.md (étape 48.7).

Valeurs masquées. Aucun mot de passe ici.

Dernière mise à jour : 01/11/2026 (§6.2 : deux filtres contre le bruit des comptes machine et des services)


Sommaire

§Contenu
1Le besoin, et le choix de l’outil
2Théorie : les journaux Windows et ce qu’on en garde
3L’architecture retenue
4Télécharger et vérifier
5Vérifier le nom des champs avant d’écrire la configuration
6La configuration
7Le service Windows
8Vérifier l’arrivée
9Pièges et checklist

1 · Le besoin, et le choix de l’outil

Les machines Linux et pfSense envoient leurs journaux en syslog. Windows ne sait pas le faire : ses journaux (l’« Observateur d’événements ») restent sur la machine. Il faut un agent, un petit service qui lit ces journaux et les envoie.

OutilVerdict
NXLog Community Editionprévu au départ ; téléchargement réservé aux comptes connectés, authentification refusée (incident H-37)
Winlogbeat (Elastic)n’envoie pas en syslog, seulement vers Elasticsearch/Logstash : hors sujet
Fluent Bit libre (Apache 2.0), projet de la fondation CNCF, téléchargeable sans compte, empreintes publiées ; lit les journaux Windows et envoie en syslog TCP

2 · Théorie : les journaux Windows et ce qu’on en garde

Windows range ses événements en canaux (Channels) — Security, System, Application… Chaque événement a un numéro (EventID) et un niveau (1 critique, 2 erreur, 3 avertissement, 4 information ; 0 pour les audits de sécurité).

Un contrôleur de domaine écrit des milliers d’événements de sécurité par heure. On n’envoie donc qu’une sélection :

CanalCe qu’on gardeTable d’arrivée
Security4624 / 4625 connexion réussie / échouée · 4634 fermeture · 4648 connexion avec d’autres identifiants · 4672 droits d’administrateur utilisés · 4720 à 4726 comptes créés, activés, modifiés, réinitialisés, désactivés, supprimés · 4728 / 4732 / 4756 ajout à un groupe · 4740 compte verrouillé · 4771 échec Kerberos · 1102 journal effacéjournaux_auth (6 mois)
System et Applicationerreurs et avertissements (niveaux 1 à 3)journaux (6 mois)

Principe à retenir — on centralise ce qui sert à enquêter (qui s’est connecté, qui a changé quoi, qui a effacé) et ce qui casse (erreurs). Tout envoyer noierait l’information utile et remplirait la base.


3 · L’architecture retenue

 AD-Core-01 (ADM, 10.0.30.10) ─────────────┐
                                           ├── syslog RFC 5424, TCP 514 ──► srv-supervision (10.0.30.15) ──► Galera
 poste-win11 (USERS, 10.0.40.10) ─ pfSense ┘
                                   règle USERS → SRV_SUPERVISION : PORTS_SYSLOG
ÉlémentValeur
VersionFluent Bit 5.1.3, installeur .exe 64 bits
Dossier du programmeC:\Program Files\fluent-bit\
ConfigurationC:\ProgramData\fluent-bit\fluent-bit.conf + windows-vers-syslog.lua (copies de référence : scripts/supervision/windows/)
Servicefluent-bit, démarrage automatique, compte système
Pare-feuAD : rien (même VLAN) · poste : règle USERS USERS subnets → SRV_SUPERVISION : PORTS_SYSLOG, en tête de l’onglet

92-pfsense-regle-users-syslog


4 · Télécharger et vérifier

Contexte : PowerShell administrateur sur la machine Windows, qui a accès à Internet. Vérifier les droits : ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) → True (pas IsInRole('Administrators'), faux sur un Windows en français — H-27).

1. Télécharger l’installeur .exe et comparer son empreinte à celle publiée dans la documentation officielle (page Installation → Windows) :

[Net.ServicePointManager]::SecurityProtocol='Tls12'; $f="$env:TEMP\fluent-bit-5.1.3-win64.exe"; Invoke-WebRequest "https://packages.fluentbit.io/windows/fluent-bit-5.1.3-win64.exe" -OutFile $f -UseBasicParsing; if ((Get-FileHash $f -Algorithm SHA256).Hash -eq '5B293C3AA4068DF8967F28CB57E14BF08461C465ABB84EAA035B719F34367D3E') { 'EMPREINTE CONFORME' } else { 'EMPREINTE DIFFERENTE : NE PAS INSTALLER' }

EMPREINTE CONFORME. Pour une autre version, reprendre l’empreinte sur la page officielle.

Pas le .msi : aucune empreinte n’est publiée pour lui (son .sha256 répond 404, incident H-36). On n’installe pas un fichier qu’on ne peut pas vérifier.

93-ad-fluent-bit-empreinte-conforme

2. Installer sans question et préparer le dossier

Start-Process $f -ArgumentList '/S' -Wait; New-Item -ItemType Directory -Force C:\ProgramData\fluent-bit | Out-Null; Test-Path 'C:\Program Files\fluent-bit\bin\fluent-bit.exe'

True.


5 · Vérifier le nom des champs avant d’écrire la configuration

La documentation de l’entrée winevtlog ne liste pas les champs des événements. Plutôt que de les supposer, on les affiche :

& 'C:\Program Files\fluent-bit\bin\fluent-bit.exe' -i winevtlog -p channels=System -p read_existing_events=true -p "event_query=*[System[(Level=2 or Level=3)]]" -o stdout

Ctrl+C après 2 ou 3 secondes. Champs constatés le 21/10 :

{"ProviderName"=>"Service Control Manager", "EventID"=>7034, "Level"=>2, "Channel"=>"System",
 "Computer"=>"AD-Core-01.sio.internal", "Message"=>"Le service OpenSSH SSH Server s'est terminé…", …}

Les accents s’affichent mal dans la console (termin├®) : c’est l’affichage de la console, les données sont justes (vérifié en base, §8).


6 · La configuration

6.1 fluent-bit.conf

SectionRôle
[INPUT] winevtlog Tag windows.securitecanal Security, filtré par Event_Query sur la liste d’EventID du §2 ; position de lecture gardée dans securite.sqlite
[INPUT] winevtlog Tag windows.systemecanaux System,Application, Level=1 or 2 or 3 ; position dans systeme.sqlite
[FILTER] luale script de préparation (§6.2)
[OUTPUT] syslogMode tcp, Syslog_Format rfc5424, Host 10.0.30.15, Port 514, Syslog_Maxsize 8000, Retry_Limit no_limits ; champs : hote → machine, ProviderName → programme, gravite, facilite, Message

Sans Read_Existing_Events, Fluent Bit ne relit pas l’historique : seuls les nouveaux événements partent.

6.2 windows-vers-syslog.lua

TransformationPourquoi
niveau Windows → gravité syslog (1→2, 2→3, 3→4, sinon 6)« Erreur » vaut 3, comme sous Linux
canal Security → catégorie 10 (authpriv)il ira dans journaux_auth côté serveur, sans rien changer à rsyslog
Computer → nom court (AD-Core-01)même nom que dans Prometheus
EventID nnnn : en tête du messagerechercher « tous les 4625 » facilement
retours à la ligne → espacesles messages Windows font plusieurs lignes ; en syslog TCP, un retour à la ligne couperait le message en morceaux

Les deux filtres contre le bruit (30/10 et 01/11)

La mesure sur 48 h (≈ 24 800 événements de sécurité par jour sur l’AD, 32 Mo) a montré que l’essentiel ne dit rien d’utile : des ouvertures (4624), fermetures (4634) et privilèges (4672) faits par Windows pour lui-même. Le script les écarte avant l’envoi (return -1 : l’enregistrement est jeté) :

FiltreÉvénements écartésComment le script le reconnaîtEffet mesuré
1ceux des comptes machinele compte de la « Nouvelle ouverture de session » finit par $ (AD-CORE-01$)− 50 %
2ceux du compte Système au démarrage d’un servicecompte Système (ou SYSTEM) et type d’ouverture 5, ou événement 4672≈ 10 % de plus ; plus aucun après le redémarrage de l’agent
local bruit = { [4624] = true, [4634] = true, [4672] = true }
local systeme = { ["Syst\195\168me"] = true, ["SYSTEM"] = true }   -- « Système » en UTF-8

Restent tous les échecs (4625), les 4648, les comptes humains, les créations de comptes, 4740 et 1102.

Deux pièges d’écriture : dans un message Windows français, l’espace avant les deux-points est souvent une espace insécable (octets \194\160, H-54) ; et un 4624 cite deux comptes (le demandeur, puis la nouvelle session) : on lit celui qui suit « Nouvelle ouverture de session ».

Filtrer à la source plutôt que dans la base : ce qui n’est pas envoyé ne coûte ni réseau, ni réplication, ni sauvegarde. On n’écarte que ce qu’on sait inutile, jamais un échec.

Après une modification du .lua, le recopier (§6.3), le valider (--dry-run) puis Restart-Service fluent-bit sur chaque machine Windows.

144-fluent-bit-filtre-deploye-windows.png : le second filtre déployé le 01/11 sur poste-win11 (en haut) et AD-Core-01 (en bas) : configuration test is successful, service Running.

144-fluent-bit-filtre-deploye-windows

6.3 Copier et valider

Depuis le PC (OpenSSH serveur actif sur les machines Windows du lab), dans annexes\scripts\supervision\windows :

scp fluent-bit.conf windows-vers-syslog.lua "<compte>@<adresse>:C:/ProgramData/fluent-bit/"

<compte> : Administrateur pour l’AD ; pour le poste, son compte local admin (ou l’administrateur du domaine sio\Administrateur).

Sur la machine :

& 'C:\Program Files\fluent-bit\bin\fluent-bit.exe' -c C:\ProgramData\fluent-bit\fluent-bit.conf --dry-run

configuration test is successful.


7 · Le service Windows

New-Service -Name fluent-bit -DisplayName 'Fluent Bit (journaux vers srv-supervision)' -BinaryPathName '"C:\Program Files\fluent-bit\bin\fluent-bit.exe" -c "C:\ProgramData\fluent-bit\fluent-bit.conf"' -StartupType Automatic | Out-Null; Start-Service fluent-bit; Start-Sleep 5; Get-Service fluent-bit | Format-Table Name, Status, StartType -AutoSize

fluent-bit Running Automatic. Le service tourne sous le compte système, seul autorisé à lire le journal Security.


8 · Vérifier l’arrivée

Sur srv-supervision, compte en lecture seule :

mariadb -h 127.0.0.1 -u grafana_lecture -p -e "SELECT hote, programme, COUNT(*) FROM syslog.journaux_auth WHERE hote IN ('AD-Core-01','poste-win11') GROUP BY hote, programme;"

sur un contrôleur de domaine, des événements Microsoft-Windows-Security-Auditing arrivent en une minute, messages EventID 4624 : L'ouverture de session…, accents lisibles.

Un poste au repos peut ne rien produire de la sélection pendant longtemps. Provoquer un événement à coup sûr :

eventcreate /T ERROR /ID 999 /L APPLICATION /SO TestSupervision /D "Test : journal Windows vers srv-supervision"
mariadb -h 127.0.0.1 -u grafana_lecture -p -e "SELECT recu_le, hote, programme, gravite, LEFT(message,100) FROM syslog.journaux WHERE message LIKE '%journal Windows vers%' ORDER BY id DESC LIMIT 3;"

poste-win11 | TestSupervision | 3 | EventID 999 : Test : … (validé le 21/10).

Volume : l’AD a envoyé ~800 événements de sécurité en quelques minutes, surtout son compte machine (AD-CORE-01$). Mesuré sur 48 h, puis réduit par les filtres du §6.2.


9 · Pièges et checklist

PiègeSymptômeOù c’est documenté
.msi sans empreinte404 sur le .sha256H-36
NXLog CE sous comptetéléchargement impossibleH-37
Test d’administrateur par nom de groupeFalse sur un Windows françaisH-27
scp lancé depuis C:\WINDOWS\system32stat local … No such file§6.3 : se placer dans le dossier des fichiers
admin-win11 pris pour un compteconnexion refuséec’est le nom de l’identifiant Termix ; le compte local s’appelle admin
Poste silencieuxrien en base§8 : eventcreate
Compte illisible dans le messagefiltre sans effetespace insécable : H-54
 PowerShell administrateur (test par WindowsBuiltInRole)
 .exe téléchargé, EMPREINTE CONFORME, installé en /S
 Champs vérifiés par l'essai stdout
 fluent-bit.conf + .lua dans C:\ProgramData\fluent-bit ; --dry-run successful
 Service fluent-bit Running / Automatic
 Poste en zone USERS : règle pfSense PORTS_SYSLOG en tête
 Arrivée vérifiée en base (eventcreate pour un poste calme)

La règle à retenir en une phrase : un agent vérifié, une sélection d’événements utiles, un message par ligne — et Windows rejoint les autres dans la même base.