<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Monitoring - Tag - arleo.eu</title><link>https://www.arleo.eu/en/tags/monitoring/</link><description>Monitoring - Tag - arleo.eu</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 28 May 2026 23:45:41 +0200</lastBuildDate><atom:link href="https://www.arleo.eu/en/tags/monitoring/" rel="self" type="application/rss+xml"/><item><title>CSP A+ on Hugo + Cloudflare: from hash-based to origin allowlist, auto-monitoring and hardening</title><link>https://www.arleo.eu/en/posts/csp-a-plus-hugo-cloudflare-origin-allowlist/</link><pubDate>Thu, 28 May 2026 23:45:41 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/en/posts/csp-a-plus-hugo-cloudflare-origin-allowlist/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/csp-a-plus-hugo-cloudflare-origin-allowlist-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="context">Context</h2>
<p>arleo.eu runs on Hugo (KVM VM) → OpenResty (NUC) → Cloudflare (CDN/WAF). Goal: <strong>A+ score on Mozilla Observatory</strong> with a strict CSP that resists edge-side injections.</p>
<p>The journey went through three strategies over a few weeks — nonces, hashes, then origin allowlist — before landing on a stable, automated solution.</p>
<hr>
<h2 id="act-1-why-hash-based-failed">Act 1: why hash-based failed</h2>
<p>The initial idea seemed solid: Hugo Pipes externalizes all JS with SRI, we list the hashes in the CSP, clean result. In practice, two problems made the approach impossible.</p>]]></description></item><item><title>SRI on Hugo: automated hashes, auto-update and BetterStack alerting</title><link>https://www.arleo.eu/en/posts/sri-cdn-hugo-automate/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><author>Jmr</author><guid>https://www.arleo.eu/en/posts/sri-cdn-hugo-automate/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/sri-cdn-hugo-automate-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="why-sri">Why SRI?</h2>
<p>When your site loads resources from a third-party CDN — FontAwesome, Mermaid, Animate.css — you&rsquo;re trusting an external party you have no control over. If jsdelivr.net gets compromised, or if a supposedly immutable version is silently mutated, your site can become an attack vector.</p>
<p><strong>Subresource Integrity</strong> (SRI) solves this cleanly: every <code>&lt;link&gt;</code> or <code>&lt;script&gt;</code> tag carries an <code>integrity=&quot;sha256-…&quot;</code> attribute that the browser verifies before executing the resource. If the hash doesn&rsquo;t match, the browser blocks the load.</p>]]></description></item><item><title>CrowdSec Log Pipeline with Vector: Filtering Noise and Capturing Real Bans</title><link>https://www.arleo.eu/en/posts/crowdsec-vector-pipeline/</link><pubDate>Wed, 15 Apr 2026 19:02:00 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/en/posts/crowdsec-vector-pipeline/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/crowdsec-vector-pipeline-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="-in-short">⚡ In short</h2>
<p>The initial Vector pipeline was flooding BetterStack with ~500 events/24h, of which 434 were CAPI pulls with no local monitoring value. This work reconfigures the Vector filter to keep only high-value bans (<code>cscli</code>) and fixes a major blind spot: actual nginx-lua bouncer bans were not appearing anywhere in BetterStack.</p>
<h2 id="-why">🧠 Why</h2>
<p>This homelab&rsquo;s security stack relies on three components working together:</p>
<ul>
<li><strong>nginx</strong> with the CrowdSec lua bouncer (<code>lua-resty-crowdsec</code>) for real-time request blocking</li>
<li><strong>CrowdSec</strong> for threat detection and ban decision management</li>
<li><strong>Vector</strong> centralizing logs to BetterStack for monitoring</li>
</ul>
<p>After setting up the initial pipeline, two problems quickly became apparent. First, the signal was drowned in noise: out of 500 events/24h, 434 came from the hourly community CAPI pull and 66 from third-party lists — neither represents a threat detected on <em>this</em> infrastructure. Second, actual lua bouncer bans (real-time blocks in nginx) were not appearing anywhere in BetterStack, creating a blind spot on real security activity.</p>]]></description></item><item><title>Normalizing nginx and CrowdSec Logs in BetterStack with Vector</title><link>https://www.arleo.eu/en/posts/vector-logs-harmonisation-betterstack/</link><pubDate>Fri, 10 Apr 2026 21:04:00 +0200</pubDate><author>Jmr</author><guid>https://www.arleo.eu/en/posts/vector-logs-harmonisation-betterstack/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/vector-logs-harmonisation-betterstack-featured.jpg" referrerpolicy="no-referrer">
            </div><h2 id="-in-short">⚡ In short</h2>
<p>Two problems coexisted in BetterStack: <code>mcp-oauth.access.log</code> logs arrived as unreadable raw JSON, and CrowdSec logs produced visual duplicates. This work normalizes all logs so they display as structured clickable tags, with correct timestamps and without parasitic fields.</p>
<h2 id="-why">🧠 Why</h2>
<p>BetterStack displays logs as highlighted clickable tags in the Live Tail when JSON fields are properly structured. Before this work, observation was degraded on two fronts:</p>
<ul>
<li><code>mcp-oauth.access.log</code> logs arrived as unreadable raw JSON (custom format incompatible with Vector&rsquo;s nginx parser) — fields <code>nginx.client</code>, <code>nginx.path</code>, <code>nginx.status</code> were not extracted</li>
<li>CrowdSec and CF WAF logs arrived as plain text with duplicates (<code>Ban ban | ... | Ban ban</code>)</li>
</ul>
<p>The goal was to normalize all logs in BetterStack to display like standard nginx logs:</p>]]></description></item></channel></rss>