From b4ae92c03f74012b5aae58e60b6d22b31fb1cd8e Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sat, 3 Oct 2026 19:01:07 -0400 Subject: [PATCH] =?UTF-8?q?journaux=20:=20le=20bruit=20de=20sonde=20du=20c?= =?UTF-8?q?ourriel=20filtr=C3=A9=20;=20make=20appliquer=20accepte=20ARGS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - client_journal : sept stage.drop de plus pour Postfix (connect, lost connection after CONNECT, disconnect commands=0/0, SSL_accept error) et Dovecot LMTP ; phrase exacte, seulement depuis une machine sondeuse - éprouvé sur une heure réelle de Chezlepro (69 % jeté, 96 % sur edge-mta-01, le scanner externe reste visible) et avec le binaire Alloy 1.20.1 (9 lignes de sonde jetées, 7 légitimes reçues) - Makefile : appliquer passe ARGS, comme site-appliquer - CHANGELOG 63 : mesure des locataires ; cache de paquets du poste plus vieux qu'eux (alloy 1.19.2 / loki 3.7.7 contre 1.20.1 / 3.7.8) Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 49 +++++++++++++++++++ Makefile | 4 +- .../client_journal/templates/config.alloy.j2 | 44 +++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bda575..98c300e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,54 @@ # CHANGELOG — Set-OPS +## 2026-10-03 (63) — Les locataires mesurés : même bruit, et le courriel en ajoute + +**Demande de l'exploitant** : mesurer chez les deux locataires les défauts corrigés au site +(62), puis y appliquer les correctifs. + +**Mesuré (une heure, depuis chaque `obs-01`)** — identique chez Chezlepro et Technolibre : +sonde SSH 635 lignes/h **par machine** (environ 65 % de son journal) ; sonde TLS 53/h par +machine, environ 650 sur `obs-01` et `infra-pki-01` ; audit de `node_exporter` à 31-35 % ; +Loki qui se relit (100 à 186 lignes/h) ; aucune unité en échec, donc pas de reste à la +façon des hyperviseurs. Environ 500 000 lignes de journal par jour et par locataire. + +**Ce que le site n'avait pas : le courriel.** Postfix (`edge-mta-01`) écrit trois lignes par +connexion de sonde — `connect`, `lost connection after CONNECT`, `disconnect … commands=0/0` — +et une quatrième sur le port chiffré (`SSL_accept error`) : 7 000 lignes par heure, la +machine la plus bavarde de chaque locataire. Dovecot LMTP (`infra-mail-01`) en ajoute +environ 105, dont une sur deux étiquetée `Error`. **Fait** : sept `stage.drop` de plus, même +règle qu'en 62 — la phrase exacte, et seulement depuis une machine sondeuse. Une vraie session +venue de la flotte ne perd que sa ligne `connect from` (son `client=` et son `disconnect` +compté en `commands=N/M` restent) ; un échec TLS LMTP autre que « fermé avant de commencer » +passe. + +**Éprouvé avant d'écrire, deux fois.** Sur une heure de journaux réels de Chezlepro : 69 % de +lignes jetées (96 % sur `edge-mta-01`), et le balayeur externe (`censys-scanner.com`) reste +visible. Puis avec le binaire Alloy (v1.20.1, sur `edge-mta-01`) : un fichier de 16 lignes +témoins à travers le même `loki.process` vers `loki.echo` — les 9 lignes de sonde jetées, les +7 légitimes reçues (source externe, `[preauth]`, certificat refusé, scanner, vraie session +SMTP, vrai échec TLS LMTP, témoin de fin). + +**`make appliquer` accepte `ARGS`**, comme `site-appliquer` : simuler (`--check --diff`) +passe par la même porte que l'application. + +**Trouvé en simulant : le cache de paquets du poste est plus vieux que les locataires.** Ils +portent `alloy 1.20.1` et `loki 3.7.8` (tirés à la reconstruction du 2026-10-01) ; le cache +du poste fournit `1.19.2` et `3.7.7`. La simulation saute l'`apt-get install` : elle ne +montre rien. En réel, `paquets_tiers` tenterait une rétrogradation. Contournement pour ce +passage : `-e paquets_tiers_cache=/dev/null/aucun` — le rôle se dégrade comme prévu (aucun +manifeste, rien à déposer) et les paquets en place ne bougent pas. Remède de fond : `make +cacher-paquets` depuis le poste. + +**Non appliqué chez les locataires** : le déploiement depuis le poste a été refusé par le +contrôle des permissions de l'assistant ; il reste à lancer par l'exploitant (simulé chez +Chezlepro : 0 échec ; seuls changent la config Loki, la config Alloy et les règles d'audit). + +**Vu au passage, non traité** : Icinga Web ne trouve pas sa base de configuration chez les +deux locataires depuis leur reconstruction (`Please check if a db instance exists at all`, +145/h chez Chezlepro tant qu'une page de la vigie est ouverte). + +**Validation** : `ansible-lint` (0 violation), `make verifier` conforme (83/83). + ## 2026-10-03 (62) — Le site parlait trop dans ses journaux, et trois hyperviseurs échouaient en silence **Demande de l'exploitant** : analyser les journaux centralisés (Loki) et les événements diff --git a/Makefile b/Makefile index 655b92a..dbf4d1a 100644 --- a/Makefile +++ b/Makefile @@ -552,7 +552,9 @@ appliquer: ansible-runtime ## Applique un groupe a la flotte — GROUPE= exit 2; \ fi python3 scripts/inventory_host.py --inventaire $(INVENTAIRE_PRODUCTION) --dependances $(FICHIER_DEPENDANCES) verifier-dependances-groupe --groupe $(GROUPE) - ansible-playbook -i $(INVENTAIRE_PRODUCTION) "$(DOSSIER_PLAYBOOKS_GROUPES)/$(GROUPE).yml" --limit '$(GROUPE):&$(GROUPE_HOTES_ACTIFS)' + @# `ARGS` comme chez `site-appliquer` (2026-10-03) : simuler (`ARGS="--check --diff"`) + @# avant d'appliquer doit etre possible par la meme porte que l'application elle-meme. + ansible-playbook -i $(INVENTAIRE_PRODUCTION) "$(DOSSIER_PLAYBOOKS_GROUPES)/$(GROUPE).yml" --limit '$(GROUPE):&$(GROUPE_HOTES_ACTIFS)' $(ARGS) # ATTENDRE PLUTOT QUE CONSTATER (2026-08-27). `deployer` faisait un `ping` unique # (`_verifier-acces-hote`). Depuis que `creer-vm` ne guette plus le SSH — il prouve la diff --git a/roles/client_journal/templates/config.alloy.j2 b/roles/client_journal/templates/config.alloy.j2 index 5035839..26fbd1f 100644 --- a/roles/client_journal/templates/config.alloy.j2 +++ b/roles/client_journal/templates/config.alloy.j2 @@ -41,6 +41,50 @@ loki.process "sondes" { expression = "TLS handshake error from ({{ sondeurs }}):[0-9]+: EOF$" drop_counter_reason = "sonde_connectivite" } + + // LE COURRIEL PARLE PLUS QUE LES AUTRES (mesure chez les deux locataires, 2026-10-03). + // Postfix ecrit trois lignes par connexion de sonde — quatre sur le port chiffre — et + // faisait de `edge-mta-01` la machine la plus bavarde de chaque locataire (7 000 lignes + // par heure). Une VRAIE session venue de la flotte perd sa ligne `connect from`, rien + // d'autre : ses identifiants de file (`client=`), et son `disconnect` qui compte des + // commandes (`commands=N/M`, jamais `0/0`), restent. + stage.drop { + expression = "^connect from [^\\[ ]+\\[({{ sondeurs }})\\]$" + drop_counter_reason = "sonde_connectivite" + } + + stage.drop { + expression = "^(NOQUEUE: )?lost connection after CONNECT from [^\\[ ]+\\[({{ sondeurs }})\\]$" + drop_counter_reason = "sonde_connectivite" + } + + stage.drop { + expression = "^disconnect from [^\\[ ]+\\[({{ sondeurs }})\\] commands=0/0$" + drop_counter_reason = "sonde_connectivite" + } + + stage.drop { + expression = "^SSL_accept error from [^\\[ ]+\\[({{ sondeurs }})\\]: lost connection$" + drop_counter_reason = "sonde_connectivite" + } + + // Dovecot LMTP, en TLS des l'accueil : la sonde ferme avant la poignee. Seule la forme + // « fermee avant de commencer » est jetee ; toute autre raison d'echec TLS passe, et une + // livraison reelle se lit toujours a `saved mail to`. + stage.drop { + expression = "^lmtp\\([0-9]+\\): Connect from ({{ sondeurs }})$" + drop_counter_reason = "sonde_connectivite" + } + + stage.drop { + expression = "^lmtp\\([0-9]+\\): Error: lmtp-server: conn ({{ sondeurs }}):[0-9]+ \\[[0-9]+\\]: SSL handshake failed: Connection closed$" + drop_counter_reason = "sonde_connectivite" + } + + stage.drop { + expression = "^lmtp\\([0-9]+\\): Disconnect from ({{ sondeurs }}): SSL Initialization failed \\(state=GREETING\\)$" + drop_counter_reason = "sonde_connectivite" + } } {% endif %}