<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>#docker — Blog d'Ange Bonkoski</title><link>https://journal.ange-bonkoski.fr/tags/docker/</link><description>Journal de mon homelab et write-ups de labs de cybersécurité.</description><language>fr</language><copyright>Ange Bonkoski, licence CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/deed.fr)</copyright><lastBuildDate>Mon, 19 Oct 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://journal.ange-bonkoski.fr/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Mon coffre de mots de passe ne répondait plus, et le réseau n'y était pour rien</title><link>https://journal.ange-bonkoski.fr/journal/le-reseau-n-y-etait-pour-rien/</link><pubDate>Mon, 19 Oct 2026 09:00:00 +0200</pubDate><guid>https://journal.ange-bonkoski.fr/journal/le-reseau-n-y-etait-pour-rien/</guid><category>homelab</category><category>vaultwarden</category><category>docker</category><category>diagnostic</category><description>&lt;p&gt;Le 20 septembre, mon gestionnaire de mots de passe auto-hébergé a&#10;cessé de fonctionner… à moitié. Le coffre s&amp;rsquo;ouvrait parfaitement dans le&#10;navigateur. Mais l&amp;rsquo;extension Firefox affichait une erreur obscure, et&#10;l&amp;rsquo;application iPhone refusait de se connecter.&lt;/p&gt;&#10;&lt;p&gt;J&amp;rsquo;ai passé des heures à chercher dans la mauvaise direction. Cet article&#10;raconte comment j&amp;rsquo;en suis sorti, et surtout la petite expérience qui a&#10;tout débloqué.&lt;/p&gt;&#10;&lt;h2 id="le-contexte"&gt;Le contexte&lt;/h2&gt;&#10;&lt;p&gt;J&amp;rsquo;héberge &lt;strong&gt;Vaultwarden&lt;/strong&gt; sur mon serveur maison. C&amp;rsquo;est une réécriture&#10;légère du serveur de &lt;strong&gt;Bitwarden&lt;/strong&gt; : on garde les applications officielles&#10;de Bitwarden (extension, application mobile), mais elles parlent à mon&#10;serveur plutôt qu&amp;rsquo;à celui de l&amp;rsquo;éditeur.&lt;/p&gt;&#10;&lt;p&gt;À l&amp;rsquo;époque, le trafic passait par Cloudflare, puis par un reverse proxy,&#10;avant d&amp;rsquo;arriver au conteneur.&lt;/p&gt;&#10;&lt;h2 id="le-symptôme"&gt;Le symptôme&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Le coffre web&lt;/strong&gt; : fonctionne.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;L&amp;rsquo;extension Firefox&lt;/strong&gt; : &lt;code&gt;KDF config response does not contain a valid KDF type&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;L&amp;rsquo;application iOS&lt;/strong&gt; : « Nous ne sommes pas en mesure de traiter votre demande ».&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Le KDF (&lt;em&gt;key derivation function&lt;/em&gt;) est la fonction qui transforme le mot de&#10;passe maître en clé de chiffrement. Le client demande au serveur quels&#10;paramètres utiliser, puis fait le calcul lui-même. L&amp;rsquo;erreur disait donc :&#10;« la réponse du serveur ne ressemble pas à ce que j&amp;rsquo;attends ».&lt;/p&gt;&#10;&lt;h2 id="pourquoi-jai-accusé-le-réseau"&gt;Pourquoi j&amp;rsquo;ai accusé le réseau&lt;/h2&gt;&#10;&lt;p&gt;Ma première intuition : quelque chose entre le client et le serveur&#10;abîmait la réponse. C&amp;rsquo;était plausible, car proxys et CDN modifient parfois&#10;le trafic au passage. J&amp;rsquo;ai donc testé, une par une :&lt;/p&gt;&#10;&#10;&lt;div class="tableau" role="region" aria-label="Tableau" tabindex="0"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th class="aligne-left"&gt;Piste testée&lt;/th&gt;&#10; &lt;th class="aligne-left"&gt;Résultat&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Désactiver les protections anti-robots de Cloudflare&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Règle de pare-feu applicatif pour laisser tout passer&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Purger le cache Cloudflare&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Désactiver HTTP/3 et le 0-RTT&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Vérifier la compression de la réponse&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;JSON propre une fois décompressé&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Corriger l&amp;rsquo;adresse publique déclarée dans la configuration&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Vrai défaut, mais pas suffisant&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Chaque test prenait du temps, et aucun ne changeait rien.&lt;/p&gt;&#10;&lt;h2 id="le-friend-test"&gt;Le &lt;em&gt;friend test&lt;/em&gt;&lt;/h2&gt;&#10;&lt;p&gt;J&amp;rsquo;ai fini par emprunter le téléphone d&amp;rsquo;un proche. Il n&amp;rsquo;avait jamais été&#10;connecté à mon réseau, ni à mon compte iCloud, ni à mon Firefox. J&amp;rsquo;y ai&#10;installé l&amp;rsquo;application Bitwarden, je l&amp;rsquo;ai pointée vers mon serveur…&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Même erreur, exactement.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Ce test a éliminé d&amp;rsquo;un coup toutes mes hypothèses réseau. Un problème&#10;propre à mon infrastructure, à mon cache ou à mes appareils n&amp;rsquo;aurait pas&#10;touché un téléphone neuf. Le problème venait de ce que &lt;strong&gt;tous&lt;/strong&gt; les clients&#10;avaient en commun : la version de l&amp;rsquo;application.&lt;/p&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&lt;div class="encadre encadre-lecon" role="note"&gt;&#10; &lt;p class="encadre-titre"&gt;&#10; &#10; &#10; &lt;svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M9 18h6"/&gt;&lt;path d="M10 22h4"/&gt;&lt;path d="M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2z"/&gt;&lt;/svg&gt;&#10; &#10; &lt;span&gt;Le friend test&lt;/span&gt;&#10; &lt;/p&gt;&#10; &#10; &lt;div class="encadre-contenu"&gt;&#10; &lt;p&gt;Quand tout semble suspect, reproduisez le problème sur un appareil qui ne&#10;partage &lt;strong&gt;rien&lt;/strong&gt; avec les vôtres. S&amp;rsquo;il plante pareil, ce n&amp;rsquo;est ni votre&#10;réseau, ni votre configuration locale.&lt;/p&gt;&#10;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 id="la-vraie-cause--un-contrat-de-version-rompu"&gt;La vraie cause : un contrat de version rompu&lt;/h2&gt;&#10;&lt;p&gt;Pourquoi le coffre web, lui, fonctionnait-il ? Parce que Vaultwarden sert&#10;&lt;strong&gt;sa propre&lt;/strong&gt; interface web, compilée avec lui, à la même version. Elle&#10;comprend forcément ses réponses. C&amp;rsquo;était le pire témoin possible.&lt;/p&gt;&#10;&lt;p&gt;L&amp;rsquo;extension et l&amp;rsquo;application, elles, sont publiées par Bitwarden et mises à&#10;jour automatiquement par les magasins d&amp;rsquo;applications, sans aucun lien avec&#10;mon serveur. Bitwarden avait fait évoluer la structure de la réponse KDF.&#10;Les clients avaient adopté le nouveau format ; mon serveur ne le parlait&#10;pas encore. Il fallait une version plus récente de Vaultwarden.&lt;/p&gt;&#10;&lt;h2 id="pourquoi-la-mise-à-jour-na-pas-marché-du-premier-coup"&gt;Pourquoi la mise à jour n&amp;rsquo;a pas marché du premier coup&lt;/h2&gt;&#10;&lt;p&gt;J&amp;rsquo;ai lancé la mise à jour du conteneur… et rien n&amp;rsquo;a changé. En relisant&#10;mon fichier Compose, j&amp;rsquo;ai trouvé ceci :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;vaultwarden/server:1.36.0@sha256:&amp;lt;empreinte&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker peut désigner une image de deux façons :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;par une &lt;strong&gt;étiquette&lt;/strong&gt; (&lt;code&gt;1.36.0&lt;/code&gt;, &lt;code&gt;latest&lt;/code&gt;) : un nom qui peut pointer vers&#10;une autre image demain ;&lt;/li&gt;&#10;&lt;li&gt;par une &lt;strong&gt;empreinte&lt;/strong&gt; (&lt;code&gt;sha256:…&lt;/code&gt;) : l&amp;rsquo;identifiant exact d&amp;rsquo;une image,&#10;qui ne change jamais.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Quand les deux sont présentes, &lt;strong&gt;l&amp;rsquo;empreinte l&amp;rsquo;emporte&lt;/strong&gt;. J&amp;rsquo;avais beau&#10;télécharger de nouvelles versions, Docker relançait toujours la même image&#10;figée. Une fois l&amp;rsquo;empreinte retirée et une version récente demandée,&#10;l&amp;rsquo;extension et l&amp;rsquo;application se sont reconnectées immédiatement.&lt;/p&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&lt;div class="encadre encadre-attention" role="note"&gt;&#10; &lt;p class="encadre-titre"&gt;&#10; &#10; &#10; &lt;svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/&gt;&lt;path d="M12 9v4"/&gt;&lt;path d="M12 17h.01"/&gt;&lt;/svg&gt;&#10; &#10; &lt;span&gt;Épingler n&amp;#39;est pas une erreur, l&amp;#39;oublier si&lt;/span&gt;&#10; &lt;/p&gt;&#10; &#10; &lt;div class="encadre-contenu"&gt;&#10; &lt;p&gt;Figer une image par son empreinte est une bonne pratique de sécurité : on&#10;sait exactement ce qui tourne. Le piège, c&amp;rsquo;est de l&amp;rsquo;avoir fait sans s&amp;rsquo;en&#10;souvenir. Depuis, chaque service a une politique d&amp;rsquo;image écrite : figé (et&#10;mis à jour à la main) ou suivi automatiquement.&lt;/p&gt;&#10;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 id="ce-que-jen-retiens"&gt;Ce que j&amp;rsquo;en retiens&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Vérifier la compatibilité client/serveur avant de chercher dans le&#10;réseau.&lt;/strong&gt; Quand des clients mis à jour automatiquement cassent, la version&#10;est le premier suspect.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Choisir un bon témoin.&lt;/strong&gt; Un client livré avec le serveur ne prouve rien&#10;sur les autres.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Lire le fichier réel avant de mettre à jour.&lt;/strong&gt; Ce que je croyais avoir&#10;configuré et ce qui était écrit n&amp;rsquo;étaient pas la même chose.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Changer une seule chose à la fois.&lt;/strong&gt; C&amp;rsquo;est ce qui m&amp;rsquo;a permis de repérer&#10;le seul vrai défaut parmi mes essais.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>CrowdSec, et le test qui ne prouvait rien</title><link>https://journal.ange-bonkoski.fr/journal/crowdsec-le-test-qui-ne-prouvait-rien/</link><pubDate>Sun, 18 Oct 2026 12:00:00 +0200</pubDate><guid>https://journal.ange-bonkoski.fr/journal/crowdsec-le-test-qui-ne-prouvait-rien/</guid><category>homelab</category><category>crowdsec</category><category>détection</category><category>docker</category><category>discord</category><description>&lt;p&gt;J&amp;rsquo;ai installé &lt;strong&gt;CrowdSec&lt;/strong&gt; sur mon homelab pour une raison simple : je&#10;voulais savoir si quelqu&amp;rsquo;un s&amp;rsquo;en prenait à mon serveur. L&amp;rsquo;installation&#10;s&amp;rsquo;est bien passée. Les alertes, elles, n&amp;rsquo;arrivaient pas sur Discord. Et la&#10;commande censée les tester me répondait… rien. Ni succès, ni erreur.&lt;/p&gt;&#10;&lt;p&gt;Cet article raconte comment j&amp;rsquo;ai trouvé la panne, et pourquoi la leçon&#10;dépasse largement CrowdSec.&lt;/p&gt;&#10;&lt;h2 id="crowdsec-en-deux-minutes"&gt;CrowdSec en deux minutes&lt;/h2&gt;&#10;&lt;p&gt;CrowdSec est un outil de détection d&amp;rsquo;intrusion. Il fonctionne comme une&#10;chaîne :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journaux → analyseurs → scénarios → alerte → notification&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(SSH, web) (lisent (reconnaissent (décision) (Discord)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; chaque ligne) une attaque)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;Il &lt;strong&gt;lit les journaux&lt;/strong&gt; du serveur : ici, les connexions SSH et les&#10;accès au reverse proxy.&lt;/li&gt;&#10;&lt;li&gt;Des &lt;strong&gt;analyseurs&lt;/strong&gt; découpent chaque ligne (adresse IP, utilisateur,&#10;résultat).&lt;/li&gt;&#10;&lt;li&gt;Des &lt;strong&gt;scénarios&lt;/strong&gt; reconnaissent un comportement suspect, par exemple&#10;une rafale d&amp;rsquo;échecs de connexion SSH depuis la même adresse en&#10;quelques secondes : une attaque par force brute.&lt;/li&gt;&#10;&lt;li&gt;Une &lt;strong&gt;alerte&lt;/strong&gt; est créée, et un &lt;strong&gt;plugin&lt;/strong&gt; l&amp;rsquo;envoie ailleurs, ici vers&#10;un salon Discord privé.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;CrowdSec peut aussi &lt;strong&gt;bloquer&lt;/strong&gt; les adresses fautives, grâce à un composant&#10;séparé (un &lt;em&gt;bouncer&lt;/em&gt;). Je ne l&amp;rsquo;ai pas installé, volontairement : mon&#10;serveur n&amp;rsquo;a aucun port ouvert sur Internet, donc aucune attaque extérieure&#10;ne peut l&amp;rsquo;atteindre. Mon but était d&amp;rsquo;apprendre la chaîne de détection et de&#10;surveiller ce qui se passe, pas de risquer de me bloquer moi-même.&lt;/p&gt;&#10;&lt;h2 id="le-symptôme"&gt;Le symptôme&lt;/h2&gt;&#10;&lt;p&gt;CrowdSec propose une commande pour tester une notification :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cscli notifications &lt;span class="nb"&gt;test&lt;/span&gt; http_default&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Elle s&amp;rsquo;exécutait sans erreur. Sa sortie montrait le plugin qui démarre,&#10;puis qui s&amp;rsquo;arrête. Et sur Discord : rien. J&amp;rsquo;ai relancé plusieurs fois, en&#10;modifiant la configuration entre deux essais. Toujours rien.&lt;/p&gt;&#10;&lt;h2 id="séparer-les-couches"&gt;Séparer les couches&lt;/h2&gt;&#10;&lt;p&gt;Quand une chaîne de plusieurs maillons ne fonctionne pas, deviner ne sert à&#10;rien. J&amp;rsquo;ai testé chaque maillon &lt;strong&gt;seul&lt;/strong&gt;, en partant du bout.&lt;/p&gt;&#10;&lt;h3 id="maillon-1--discord-reçoit-il-quoi-que-ce-soit-"&gt;Maillon 1 : Discord reçoit-il quoi que ce soit ?&lt;/h3&gt;&#10;&lt;p&gt;Un webhook Discord est une simple adresse à laquelle on envoie un message.&#10;On peut donc le tester sans CrowdSec. Problème : l&amp;rsquo;image de CrowdSec ne&#10;contient pas &lt;code&gt;curl&lt;/code&gt;. Plutôt que d&amp;rsquo;installer quoi que ce soit, j&amp;rsquo;ai utilisé&#10;un &lt;strong&gt;conteneur jetable&lt;/strong&gt; qui ne contient que &lt;code&gt;curl&lt;/code&gt; et disparaît après&#10;usage :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm --env-file .env curlimages/curl &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sh -c &lt;span class="s1"&gt;&amp;#39;curl -s -o /dev/null -w &amp;#34;%{http_code}\n&amp;#34; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; -H &amp;#34;Content-Type: application/json&amp;#34; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; -d &amp;#34;{\&amp;#34;content\&amp;#34;:\&amp;#34;Test du webhook\&amp;#34;}&amp;#34; &amp;#34;$DISCORD_WEBHOOK&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Réponse : &lt;code&gt;204&lt;/code&gt;, et le message est apparu sur Discord. Le webhook&#10;fonctionnait. Le problème était donc &lt;strong&gt;en amont&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;h3 id="maillon-2--crowdsec-lit-il-le-bon-fichier-"&gt;Maillon 2 : CrowdSec lit-il le bon fichier ?&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;cscli notifications list&lt;/code&gt; indiquait bien &lt;code&gt;http_default&lt;/code&gt; comme actif. Mais&#10;« actif » voulait seulement dire qu&amp;rsquo;&lt;strong&gt;un&lt;/strong&gt; fichier portait ce nom. En&#10;regardant le fichier réellement présent &lt;strong&gt;dans le conteneur&lt;/strong&gt;, sa date et&#10;sa taille, j&amp;rsquo;ai compris : c&amp;rsquo;était le fichier &lt;strong&gt;par défaut&lt;/strong&gt; livré avec&#10;l&amp;rsquo;image, pas le mien. Ma configuration n&amp;rsquo;avait jamais été chargée.&lt;/p&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&lt;div class="encadre encadre-lecon" role="note"&gt;&#10; &lt;p class="encadre-titre"&gt;&#10; &#10; &#10; &lt;svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M9 18h6"/&gt;&lt;path d="M10 22h4"/&gt;&lt;path d="M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2z"/&gt;&lt;/svg&gt;&#10; &#10; &lt;span&gt;« Actif » n&amp;#39;est pas « chargé »&lt;/span&gt;&#10; &lt;/p&gt;&#10; &#10; &lt;div class="encadre-contenu"&gt;&#10; &lt;p&gt;Une commande qui liste une configuration ne prouve pas que c&amp;rsquo;est &lt;strong&gt;la&#10;vôtre&lt;/strong&gt;. Allez voir le fichier réellement utilisé par le programme : sa&#10;date de modification et sa taille disent la vérité.&lt;/p&gt;&#10;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h3 id="maillon-3--la-commande-de-test-teste-t-elle-vraiment-quelque-chose-"&gt;Maillon 3 : la commande de test teste-t-elle vraiment quelque chose ?&lt;/h3&gt;&#10;&lt;p&gt;En corrigeant le fichier, j&amp;rsquo;ai aussi compris pourquoi le test restait&#10;muet. La commande démarre le plugin, lui confie le message… et s&amp;rsquo;arrête&#10;avant que l&amp;rsquo;envoi ait eu le temps de se faire. Ma configuration ajoutait&#10;en plus un délai de regroupement de 60 secondes avant chaque envoi : le&#10;test ne pouvait &lt;strong&gt;jamais&lt;/strong&gt; aboutir. J&amp;rsquo;ai retiré ce délai, et j&amp;rsquo;ai cessé de&#10;me fier à cette commande.&lt;/p&gt;&#10;&lt;h2 id="la-vraie-preuve--une-vraie-alerte"&gt;La vraie preuve : une vraie alerte&lt;/h2&gt;&#10;&lt;p&gt;Pour prouver que toute la chaîne fonctionne, il faut un test qui la&#10;&lt;strong&gt;traverse&lt;/strong&gt; entièrement, comme le ferait une vraie attaque. J&amp;rsquo;ai donc&#10;créé une décision manuelle contre une adresse fictive :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cscli decisions add --ip 203.0.113.99 --reason &lt;span class="s2"&gt;&amp;#34;test de bout en bout&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;alerte est arrivée sur Discord en quelques secondes. Puis j&amp;rsquo;ai supprimé&#10;cette décision de test.&lt;/p&gt;&#10;&lt;p&gt;Pourquoi &lt;code&gt;203.0.113.99&lt;/code&gt; ? Parce que cette plage (&lt;code&gt;203.0.113.0/24&lt;/code&gt;) est&#10;&lt;strong&gt;réservée à la documentation&lt;/strong&gt; : elle n&amp;rsquo;appartient à personne. C&amp;rsquo;est une&#10;bonne habitude, dans un test comme dans un article, pour ne jamais viser&#10;l&amp;rsquo;adresse de quelqu&amp;rsquo;un par erreur.&lt;/p&gt;&#10;&lt;h2 id="le-piège-suivant--les-adresses-privées"&gt;Le piège suivant : les adresses privées&lt;/h2&gt;&#10;&lt;p&gt;J&amp;rsquo;ai voulu aller plus loin et simuler une vraie attaque par force brute&#10;SSH depuis mon propre PC. Rien ne s&amp;rsquo;est déclenché. Normal : par défaut,&#10;CrowdSec &lt;strong&gt;ignore&lt;/strong&gt; les adresses privées (le réseau local, Docker,&#10;Tailscale). Une attaque venant de l&amp;rsquo;intérieur passe donc sous ses radars.&lt;/p&gt;&#10;&lt;p&gt;Pour vérifier qu&amp;rsquo;un scénario reconnaît bien une ligne de journal, CrowdSec&#10;propose &lt;code&gt;cscli explain&lt;/code&gt;. On lui donne une fausse ligne avec une adresse de&#10;documentation, et il montre chaque étape : quel analyseur l&amp;rsquo;a lue, quels&#10;scénarios se sont activés.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cscli explain --type syslog &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --log &lt;span class="s2"&gt;&amp;#34;Oct 18 10:00:00 serveur sshd[1234]: Failed password for invalid user test from 203.0.113.5 port 4242 ssh2&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ce-que-jen-retiens"&gt;Ce que j&amp;rsquo;en retiens&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Un test qui ne dit rien ne prouve rien.&lt;/strong&gt; Ni succès ni erreur, ce&#10;n&amp;rsquo;est pas « ça marche ».&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Tester chaque maillon seul, en partant du bout.&lt;/strong&gt; Le webhook, puis le&#10;fichier, puis le plugin : chaque étape élimine une hypothèse.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Préférer une vraie alerte à une commande de test.&lt;/strong&gt; Elle emprunte le&#10;même chemin qu&amp;rsquo;une attaque réelle.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Connaître les angles morts de son outil.&lt;/strong&gt; Ignorer les adresses&#10;privées est un choix raisonnable, mais il faut le savoir.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Un secret peut fuiter par un message d&amp;rsquo;erreur.&lt;/strong&gt; Une erreur d&amp;rsquo;envoi&#10;peut afficher l&amp;rsquo;adresse complète du webhook, qui suffit à quiconque pour&#10;écrire dans mon salon Discord. Avant de partager un journal, je masque&#10;toujours ce genre d&amp;rsquo;information.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>