<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>CI/CD on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/ci/cd/</link>
        <description>Recent content in CI/CD 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/ci/cd/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>DevSecOps in pratica: la serie</title>
        <link>https://www.matteobianchi.eu/p/devsecops-la-serie/</link>
        <pubDate>Tue, 10 Mar 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/devsecops-la-serie/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/devsecops-la-serie/cover.png" alt="Featured image of post DevSecOps in pratica: la serie" /&gt;&lt;h2 id=&#34;perché-questa-serie&#34;&gt;Perché questa serie
&lt;/h2&gt;&lt;p&gt;Per anni la sicurezza è arrivata alla fine: un audit a ridosso del rilascio, una lista di
vulnerabilità da sistemare &lt;em&gt;dopo&lt;/em&gt; che il codice era già scritto, un cancello che rallentava la
consegna senza renderla più sicura. &lt;strong&gt;DevSecOps&lt;/strong&gt; ribalta questo ordine: la sicurezza entra in ogni
fase del ciclo di vita, automatizzata, misurata e trattata come responsabilità di tutti — non come
il compito di un team separato alla fine della catena.&lt;/p&gt;
&lt;p&gt;Questa serie è un percorso pratico in &lt;strong&gt;30 capitoli&lt;/strong&gt;. Non un elenco di strumenti, ma un modo di
pensare: ogni controllo il più presto possibile (&lt;em&gt;shift left&lt;/em&gt;), ogni artefatto verificabile, ogni
decisione di rischio esplicita. Gli strumenti cambiano ogni due anni; i principi no.&lt;/p&gt;
&lt;h2 id=&#34;come-è-organizzata&#34;&gt;Come è organizzata
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    C[Cultura&amp;lt;br/&amp;gt;shift-left] --&amp;gt; D[Design&amp;lt;br/&amp;gt;threat model]
    D --&amp;gt; B[Build&amp;lt;br/&amp;gt;SAST/SCA/segreti]
    B --&amp;gt; A[Artefatti&amp;lt;br/&amp;gt;SBOM/firma/SLSA]
    A --&amp;gt; P[Deploy&amp;lt;br/&amp;gt;pipeline/IaC/policy]
    P --&amp;gt; R[Runtime&amp;lt;br/&amp;gt;K8s/admission/Falco]
    R --&amp;gt; O[Operate&amp;lt;br/&amp;gt;vuln mgmt/IR/metriche]
    O --&amp;gt; C
    style C fill:#fde2e4,stroke:#e63946
    style R fill:#e8f0fe,stroke:#4361ee
&lt;/pre&gt;

&lt;p&gt;Il filo conduttore segue il viaggio del codice: nasce da una &lt;strong&gt;cultura&lt;/strong&gt; e da un &lt;strong&gt;design&lt;/strong&gt; sicuri,
viene &lt;strong&gt;costruito&lt;/strong&gt; con controlli automatici, impacchettato in &lt;strong&gt;artefatti&lt;/strong&gt; verificabili, portato in
produzione da una &lt;strong&gt;pipeline&lt;/strong&gt; governata, difeso a &lt;strong&gt;runtime&lt;/strong&gt; e &lt;strong&gt;operato&lt;/strong&gt; con misure e risposta
agli incidenti. Poi si ricomincia: DevSecOps è un ciclo, non una linea.&lt;/p&gt;
&lt;h2 id=&#34;i-capitoli&#34;&gt;I capitoli
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fondamenta&lt;/strong&gt; — Cos&amp;rsquo;è DevSecOps, il Secure SDLC, il threat modeling nel ciclo, la gestione dei
segreti.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt; — SAST, SCA e dipendenze, DAST, IAST/RASP, fuzzing: trovare i difetti mentre si scrive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supply chain&lt;/strong&gt; — SBOM, SLSA, firma degli artefatti: fidarsi solo di ciò che si può verificare.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipeline e deploy&lt;/strong&gt; — Sicurezza della CI/CD, IaC security, policy as code nella pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime&lt;/strong&gt; — Sicurezza delle immagini, hardening di Kubernetes, admission control, runtime
security, segreti e identità dei workload.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operate&lt;/strong&gt; — Patch management, security gates, vulnerability management, logging e detection,
incident response, compliance as code, metriche e cultura.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;a-chi-si-rivolge&#34;&gt;A chi si rivolge
&lt;/h2&gt;&lt;p&gt;A chi scrive codice e vuole capire dove la sicurezza tocca il suo lavoro; a chi gestisce pipeline e
cluster e deve renderli difendibili; a chi guida team e vuole misurare il rischio invece di
subirlo. Diamo per note le basi di Git, container e CI/CD; tutto il resto lo costruiamo insieme.&lt;/p&gt;
&lt;p&gt;DevSecOps non rallenta la consegna: la rende &lt;em&gt;ripetibile&lt;/em&gt;. Un rilascio sicuro e automatizzato è più
veloce di un audit manuale fatto nel panico la sera prima. Partiamo dal perché, nel primo capitolo.&lt;/p&gt;
</description>
        </item>
        <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>
        <item>
        <title>Sicurezza della pipeline CI/CD</title>
        <link>https://www.matteobianchi.eu/p/sicurezza-pipeline-ci-cd/</link>
        <pubDate>Tue, 09 Jun 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/sicurezza-pipeline-ci-cd/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/sicurezza-pipeline-ci-cd/cover.png" alt="Featured image of post Sicurezza della pipeline CI/CD" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/supply-chain-slsa/&#34; &gt;SLSA&lt;/a&gt; e &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/firma-artefatti-sigstore/&#34; &gt;Sigstore&lt;/a&gt;
rendono la build verificabile, ma restano un presupposto: che la pipeline stessa non sia già
compromessa. Ed è un bersaglio ideale. La CI/CD legge il codice sorgente, custodisce i segreti di
produzione, e ha il diritto di &lt;strong&gt;deployare&lt;/strong&gt;. Chi controlla la pipeline non ha bisogno di bucare la
produzione: ci arriva passando dalla porta principale. Eppure è spesso l&amp;rsquo;ambiente meno indurito di
tutti.&lt;/p&gt;
&lt;h2 id=&#34;perché-è-un-bersaglio-così-ricco&#34;&gt;Perché è un bersaglio così ricco
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    P[Pipeline CI/CD] --&amp;gt; C[Accesso a TUTTO&amp;lt;br/&amp;gt;il codice sorgente]
    P --&amp;gt; S[Segreti di produzione:&amp;lt;br/&amp;gt;cloud, registry, DB]
    P --&amp;gt; D[Diritto di DEPLOY&amp;lt;br/&amp;gt;in produzione]
    P --&amp;gt; X[Esegue codice&amp;lt;br/&amp;gt;da PR non fidate]
    style P fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Un solo ambiente concentra accesso al codice, segreti potenti e privilegi di deploy. E in più esegue
codice fornito da altri: un contributo esterno, una dipendenza di build, uno script in un workflow.
Questa combinazione — alti privilegi &lt;em&gt;ed&lt;/em&gt; esecuzione di codice non fidato — è esattamente ciò che si
evita in ogni altro sistema.&lt;/p&gt;
&lt;h2 id=&#34;i-controlli-che-contano&#34;&gt;I controlli che contano
&lt;/h2&gt;&lt;h3 id=&#34;1-runner-effimeri&#34;&gt;1. Runner effimeri
&lt;/h3&gt;&lt;p&gt;Un runner persistente accumula stato tra una build e l&amp;rsquo;altra: segreti in cache, file lasciati,
processi. Un job malevolo può lasciare una backdoor che colpisce i job successivi. I &lt;strong&gt;runner
effimeri&lt;/strong&gt; nascono puliti per ogni job e muoiono subito dopo: niente stato da avvelenare. È anche un
requisito per i livelli alti di SLSA.&lt;/p&gt;
&lt;h3 id=&#34;2-minimo-privilegio-dei-token&#34;&gt;2. Minimo privilegio dei token
&lt;/h3&gt;&lt;p&gt;Il token di un job dovrebbe potere &lt;em&gt;esattamente&lt;/em&gt; ciò che serve a quel job e nulla più:&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;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# GitHub Actions: permessi espliciti e minimi per job&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;permissions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;contents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;read     &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# legge il codice, non lo scrive&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;id-token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;write    &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# per OIDC (firma / deploy), niente segreti statici&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# tutto il resto: negato di default&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&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;Il default di molte pipeline è l&amp;rsquo;opposto: un token onnipotente usato da ogni job. Restringere per job
limita il danno di un singolo step compromesso.&lt;/p&gt;
&lt;h3 id=&#34;3-oidc-invece-di-chiavi-statiche&#34;&gt;3. OIDC invece di chiavi statiche
&lt;/h3&gt;&lt;p&gt;Mettere le chiavi cloud di lungo termine nei secret della CI è un rischio permanente. Con &lt;strong&gt;OIDC&lt;/strong&gt; la
pipeline prova la propria identità al cloud provider e riceve credenziali &lt;em&gt;temporanee&lt;/em&gt; per quel job:
niente chiave statica da rubare, stesso principio della firma keyless di Sigstore.&lt;/p&gt;
&lt;h3 id=&#34;4-difesa-dai-workflow-da-pr-non-fidate&#34;&gt;4. Difesa dai workflow da PR non fidate
&lt;/h3&gt;&lt;p&gt;Le pull request da fork sono codice ostile potenziale. Regole essenziali: non dare i segreti ai
workflow innescati da PR esterne, richiedere l&amp;rsquo;approvazione manuale prima di eseguirli, e &lt;strong&gt;fissare le
action a un hash&lt;/strong&gt; (&lt;code&gt;uses: actions/checkout@&amp;lt;sha&amp;gt;&lt;/code&gt;), non a un tag mutabile che un attaccante potrebbe
spostare.&lt;/p&gt;
&lt;h2 id=&#34;la-disciplina-delle-action-di-terze-parti&#34;&gt;La disciplina delle action di terze parti
&lt;/h2&gt;&lt;p&gt;Ogni &lt;code&gt;uses:&lt;/code&gt; nella pipeline è codice di terzi con l&amp;rsquo;accesso del job. Un tag come &lt;code&gt;@v3&lt;/code&gt; può essere
ri-puntato dall&amp;rsquo;autore (o da chi lo compromette) a codice diverso. Fissare all&amp;rsquo;hash del commit rende
immutabile ciò che gira, e va trattato come una dipendenza qualsiasi: inventariato, aggiornato con
giudizio, verificato.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; fissare ogni action a un hash e dare permessi minimi a ogni job sembra tanta frizione; con decine di repository, non diventa ingestibile?&lt;/summary&gt;
&lt;p&gt;La frizione è reale ma è un costo di configurazione una tantum, mentre il rischio che elimina è
permanente e si realizza nel modo peggiore — e la soluzione alla scala non è rinunciarvi, è
automatizzarlo. Prendi il pinning all&#39;hash: sì, un tag è più comodo di uno sha, ma un tag è
&lt;em&gt;mutabile&lt;/em&gt;, e la storia recente è piena di action e pacchetti il cui tag è stato ripuntato a codice
malevolo dopo che migliaia di pipeline lo usavano già — con l&#39;accesso completo del job, inclusi i segreti.
Il pinning trasforma &#34;eseguo qualunque cosa ci sia dietro v3 oggi&#34; in &#34;eseguo esattamente questo commit
che ho verificato&#34;. Alla scala di decine di repo non lo fai a mano: lo fai con gli stessi strumenti che
già usi per le dipendenze — Renovate o Dependabot aggiornano gli hash con pull request testate, esattamente
come fanno con le librerie, così resti aggiornato senza fidarti ciecamente di un tag. Lo stesso per i
permessi minimi: non li scrivi repo per repo, li imponi con una policy organizzativa — permessi di default
a sola lettura a livello di org, template di workflow condivisi, e un controllo in pipeline (anche OPA)
che segnala i job con permessi eccessivi. Il punto è che la pipeline è l&#39;ambiente a più alto privilegio
che hai: concentra codice, segreti e diritto di deploy. È esattamente il posto dove la frizione di
configurazione è giustificata, perché un singolo step compromesso qui non è un bug in un servizio, è
l&#39;accesso a tutti i servizi. La domanda da ribaltare è: con decine di repository che possono deployare in
produzione, puoi permetterti che &lt;em&gt;non&lt;/em&gt; siano induriti?&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;La pipeline concentra codice, segreti e diritto di deploy, ed esegue codice non fidato: va trattata
come l&amp;rsquo;ambiente più critico, non il più trascurato. Runner effimeri, token a privilegio minimo, OIDC
al posto delle chiavi statiche e action fissate all&amp;rsquo;hash sono i controlli base. Una classe di
protezione merita un capitolo a sé, perché gran parte dell&amp;rsquo;infrastruttura oggi nasce da codice:
l&amp;rsquo;Infrastructure as Code e i suoi rischi, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
