<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Quality Gates on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/quality-gates/</link>
        <description>Recent content in Quality Gates on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 18 Aug 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/quality-gates/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Security gates: bloccare senza strangolare</title>
        <link>https://www.matteobianchi.eu/p/security-gates/</link>
        <pubDate>Tue, 18 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/security-gates/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/security-gates/cover.png" alt="Featured image of post Security gates: bloccare senza strangolare" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Tutti i controlli della serie — &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/sast-analisi-statica/&#34; &gt;SAST&lt;/a&gt;,
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/sca-e-dipendenze/&#34; &gt;SCA&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/container-image-security/&#34; &gt;scanning immagini&lt;/a&gt;,
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/policy-as-code-pipeline/&#34; &gt;policy&lt;/a&gt; — a un certo punto devono decidere: &lt;em&gt;fermo o
no questa build?&lt;/em&gt; Quella decisione è il &lt;strong&gt;security gate&lt;/strong&gt;. Ed è il punto dove DevSecOps vive o muore
nella pratica: un gate progettato male non rende sicuri, rende &lt;em&gt;lenti&lt;/em&gt;, e un team rallentato trova il
modo di disattivarlo. L&amp;rsquo;obiettivo è un cancello che il team &lt;em&gt;non voglia&lt;/em&gt; aggirare.&lt;/p&gt;
&lt;h2 id=&#34;i-due-fallimenti-simmetrici&#34;&gt;I due fallimenti simmetrici
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    A[Gate troppo severo&amp;lt;br/&amp;gt;blocca su tutto] --&amp;gt; A1[Team frustrato&amp;lt;br/&amp;gt;→ disattiva o ignora&amp;lt;br/&amp;gt;→ sicurezza ZERO]
    B[Gate troppo lasco&amp;lt;br/&amp;gt;non blocca mai] --&amp;gt; B1[Decorativo&amp;lt;br/&amp;gt;→ il rischio passa&amp;lt;br/&amp;gt;→ sicurezza ZERO]
    style A1 fill:#fde2e4,stroke:#e63946
    style B1 fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Entrambi gli estremi portano allo stesso posto: zero sicurezza effettiva. Il gate utile vive nel
mezzo, e ci sta grazie a tre principi.&lt;/p&gt;
&lt;h2 id=&#34;1-baseline-blocca-il-nuovo-non-il-vecchio&#34;&gt;1. Baseline: blocca il nuovo, non il vecchio
&lt;/h2&gt;&lt;p&gt;Un repository esistente ha un &lt;em&gt;debito&lt;/em&gt; di problemi preesistenti. Un gate che pretende di azzerarlo
prima di accettare qualsiasi commit blocca tutto il lavoro: inaccettabile. La &lt;strong&gt;baseline&lt;/strong&gt; separa il
debito dalla regressione:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Problemi esistenti (baseline)  →  tracciati, pianificati, NON bloccano
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Problemi NUOVI introdotti dalla PR  →  BLOCCANO
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# risultato: non peggiori mai, e riduci il debito quando puoi, senza fermare tutto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Così il gate garantisce che la situazione non peggiori a ogni commit, mentre il debito si riduce in
modo pianificato, non in un big-bang che paralizza.&lt;/p&gt;
&lt;h2 id=&#34;2-severità-e-contesto-non-conteggio&#34;&gt;2. Severità e contesto, non conteggio
&lt;/h2&gt;&lt;p&gt;Bloccare su &amp;ldquo;qualunque finding&amp;rdquo; produce rumore e aggiramento. Si blocca su ciò che conta: severità
&lt;strong&gt;alta/critica&lt;/strong&gt;, raggiungibile, su servizi esposti. La soglia va tarata sul rischio del servizio —
un servizio internet-facing che tratta dati sensibili ha un gate più stretto di un tool interno. Il
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/vulnerability-management-triage/&#34; &gt;vulnerability management&lt;/a&gt; dà i criteri per
decidere cosa è &amp;ldquo;alto&amp;rdquo; davvero.&lt;/p&gt;
&lt;h2 id=&#34;3-eccezioni-tracciate-non-aggiramenti-nascosti&#34;&gt;3. Eccezioni tracciate, non aggiramenti nascosti
&lt;/h2&gt;&lt;p&gt;A volte bisogna rilasciare &lt;em&gt;nonostante&lt;/em&gt; un finding: un falso positivo, un rischio accettato
consapevolmente, un&amp;rsquo;urgenza. Se l&amp;rsquo;unico modo è disattivare il gate, prima o poi resta disattivato. Il
gate maturo offre una &lt;strong&gt;via di eccezione esplicita&lt;/strong&gt;: si marca il finding come accettato, con un
responsabile, una motivazione e una scadenza, e resta &lt;em&gt;tracciato&lt;/em&gt;. La differenza tra un&amp;rsquo;eccezione
tracciata e un aggiramento nascosto è tutta: la prima è una decisione di rischio visibile e
revisionabile, la seconda è un buco che nessuno ricorda.&lt;/p&gt;
&lt;h2 id=&#34;fail-closed-o-fail-open&#34;&gt;Fail closed o fail open?
&lt;/h2&gt;&lt;p&gt;Cosa succede se il &lt;em&gt;controllo stesso&lt;/em&gt; fallisce (lo scanner va in errore, il servizio di policy è
giù)? Per i controlli di sicurezza critici, &lt;strong&gt;fail closed&lt;/strong&gt; (blocca) è il default prudente: meglio
una build ferma che un&amp;rsquo;immagine non verificata in produzione. Per i controlli informativi,
&lt;strong&gt;fail open&lt;/strong&gt; (passa con warning) evita che un problema infrastrutturale blocchi tutta la consegna.
La scelta va fatta &lt;em&gt;consapevolmente&lt;/em&gt; per ogni gate, non subita come comportamento accidentale dello
strumento.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; la via di eccezione tracciata non diventa inevitabilmente la scorciatoia che tutti usano per far passare qualsiasi cosa, svuotando il gate dall&#39;interno?&lt;/summary&gt;
&lt;p&gt;Può diventarlo, ma solo se la progetti come un timbro invece che come una decisione — e la differenza
sta in quattro dettagli concreti. Primo, l&#39;eccezione deve costare &lt;em&gt;abbastanza&lt;/em&gt; da non essere la via
di minor resistenza: richiede un&#39;approvazione di qualcuno diverso da chi la chiede (il principio dei
quattro occhi), una motivazione scritta che diventa un record, non un flag silenzioso in un file. Se
accettare un rischio è più scomodo che risolverlo per i casi facili, i casi facili si risolvono. Secondo,
l&#39;eccezione deve &lt;em&gt;scadere&lt;/em&gt;: non &#34;accettato per sempre&#34; ma &#34;accettato fino al 30 del mese prossimo&#34;,
dopodiché il gate torna a bloccare. Questo impedisce al debito di eccezioni di accumularsi
silenziosamente — ogni eccezione è un impegno a tempo, non un condono. Terzo, le eccezioni devono essere
&lt;em&gt;visibili e misurate&lt;/em&gt;: un cruscotto che mostra quante eccezioni attive ci sono, su quali servizi,
chi le ha approvate, quando scadono. Nel momento in cui le eccezioni diventano un numero che qualcuno
guarda — e un trend che cresce è un segnale d&#39;allarme discusso nelle metriche di sicurezza — smettono di
essere invisibili e quindi di essere abusate. Quarto, va distinta l&#39;eccezione (rischio accettato
consapevolmente) dalla soppressione del falso positivo (il finding non è reale): la seconda migliora la
taratura dello strumento ed è sana, la prima è una decisione di rischio che va pesata. Il punto di fondo:
la via di eccezione non è una debolezza del gate, è ciò che lo rende &lt;em&gt;sostenibile&lt;/em&gt; e quindi
mantenuto. Un gate senza via di uscita viene disattivato alla prima emergenza legittima, e una volta
disattivato protegge zero. Un gate con eccezioni tracciate, approvate, a scadenza e misurate rimane
acceso, e il rischio residuo è &lt;em&gt;noto e gestito&lt;/em&gt; invece che nascosto. Preferisci cento eccezioni
che puoi contare e far scadere, o un gate spento di cui nessuno parla più?&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il security gate utile è un equilibrio: blocca il nuovo rischio alto grazie alla baseline, decide per
severità e contesto invece che per conteggio, offre eccezioni tracciate invece di aggiramenti, e
sceglie fail-closed o fail-open consapevolmente. Un gate che il team vuole tenere acceso vale più di
uno perfetto che viene disattivato. Ma &amp;ldquo;rischio alto&amp;rdquo; finora è stato un&amp;rsquo;etichetta: come si misura e si
confronta davvero una vulnerabilità contro le altre? È il vulnerability management, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
