<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Sigstore on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/sigstore/</link>
        <description>Recent content in Sigstore on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 02 Jun 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/sigstore/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Firmare gli artefatti con Sigstore</title>
        <link>https://www.matteobianchi.eu/p/firma-artefatti-sigstore/</link>
        <pubDate>Tue, 02 Jun 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/firma-artefatti-sigstore/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/firma-artefatti-sigstore/cover.png" alt="Featured image of post Firmare gli artefatti con Sigstore" /&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; richiede provenienza &lt;em&gt;firmata&lt;/em&gt;, e la
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/sbom-trasparenza/&#34; &gt;SBOM&lt;/a&gt; vale di più se firmata e legata all&amp;rsquo;artefatto. Ma la
firma crittografica aveva un problema pratico che l&amp;rsquo;ha resa rara: per firmare serve una chiave
privata, e custodire chiavi a lungo termine (rotazione, revoca, HSM, il rischio che trapelino) è un
onere che quasi nessun team si assumeva. &lt;strong&gt;Sigstore&lt;/strong&gt; elimina proprio quell&amp;rsquo;onere.&lt;/p&gt;
&lt;h2 id=&#34;lidea-firma-keyless&#34;&gt;L&amp;rsquo;idea: firma keyless
&lt;/h2&gt;&lt;p&gt;Sigstore permette di firmare &lt;em&gt;senza gestire una chiave privata a lungo termine&lt;/em&gt;. Il meccanismo:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    CI[Pipeline CI&amp;lt;br/&amp;gt;identità OIDC] --&amp;gt;|provami chi sei| F[Fulcio&amp;lt;br/&amp;gt;CA]
    F --&amp;gt;|certificato a vita&amp;lt;br/&amp;gt;brevissima ~minuti| CI
    CI --&amp;gt;|firma l&amp;#39;artefatto&amp;lt;br/&amp;gt;con quel cert| SIG[Firma]
    SIG --&amp;gt;|registra firma+cert| R[Rekor&amp;lt;br/&amp;gt;log pubblico&amp;lt;br/&amp;gt;a prova di manomissione]
    R --&amp;gt; V[Chiunque può&amp;lt;br/&amp;gt;verificare dopo]
    style R fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;La pipeline prova la propria identità via &lt;strong&gt;OIDC&lt;/strong&gt; (es. &amp;ldquo;sono la GitHub Action del repo X&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fulcio&lt;/strong&gt;, una CA, emette un certificato a vita &lt;em&gt;brevissima&lt;/em&gt; (minuti) legato a quell&amp;rsquo;identità.&lt;/li&gt;
&lt;li&gt;Si firma l&amp;rsquo;artefatto con quel certificato effimero; la chiave privata sparisce subito dopo.&lt;/li&gt;
&lt;li&gt;La firma e il certificato vengono registrati in &lt;strong&gt;Rekor&lt;/strong&gt;, un log pubblico, append-only, a prova
di manomissione (lo stesso principio del transparency log).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nessuna chiave da custodire: l&amp;rsquo;identità sostituisce la chiave a lungo termine, e il certificato vive
troppo poco per valere la pena di rubarlo.&lt;/p&gt;
&lt;h2 id=&#34;firmare-e-verificare-con-cosign&#34;&gt;Firmare e verificare con cosign
&lt;/h2&gt;&lt;p&gt;In pratica, dalla pipeline:&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;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# firma keyless: l&amp;#39;identità OIDC della CI diventa il firmatario&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cosign sign --yes registry.io/app@sha256:abc...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;c1&#34;&gt;# verifica: accetta solo artefatti firmati dall&amp;#39;identità attesa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cosign verify registry.io/app@sha256:abc... &lt;span class=&#34;se&#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;se&#34;&gt;&lt;/span&gt;  --certificate-identity &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://github.com/org/repo/.github/workflows/release.yml@refs/heads/main&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#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;se&#34;&gt;&lt;/span&gt;  --certificate-oidc-issuer &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://token.actions.githubusercontent.com&amp;#34;&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;La verifica è il punto che conta: non &amp;ldquo;è firmato?&amp;rdquo; ma &amp;ldquo;è firmato &lt;strong&gt;dall&amp;rsquo;identità che mi aspetto&lt;/strong&gt;?&amp;rdquo;.
Un artefatto firmato da un&amp;rsquo;identità sconosciuta va rifiutato esattamente come uno non firmato. cosign
firma e verifica allo stesso modo anche le &lt;strong&gt;SBOM&lt;/strong&gt; e le &lt;strong&gt;attestazioni&lt;/strong&gt; di provenienza SLSA,
allegandole all&amp;rsquo;immagine nel registry.&lt;/p&gt;
&lt;h2 id=&#34;dove-si-applica-nel-ciclo&#34;&gt;Dove si applica nel ciclo
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Al rilascio&lt;/strong&gt;: la pipeline firma l&amp;rsquo;immagine, la SBOM e la provenienza subito dopo la build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All&amp;rsquo;ingresso&lt;/strong&gt;: l&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/admission-control/&#34; &gt;admission control&lt;/a&gt; del cluster
verifica la firma e rifiuta ciò che non proviene dall&amp;rsquo;identità attesa. È qui che la firma smette di
essere decorativa e diventa un controllo di accesso.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;il-limite-la-firma-attesta-lorigine-non-la-bontà&#34;&gt;Il limite: la firma attesta l&amp;rsquo;origine, non la bontà
&lt;/h2&gt;&lt;p&gt;Una firma valida dice &amp;ldquo;questo artefatto viene davvero da chi dice&amp;rdquo; — non &amp;ldquo;questo artefatto è privo di
vulnerabilità&amp;rdquo;. Si può firmare perfettamente un&amp;rsquo;immagine piena di CVE. La firma risolve &lt;em&gt;autenticità e
integrità&lt;/em&gt;, non &lt;em&gt;qualità&lt;/em&gt;: va combinata con SCA, SBOM e policy, non le sostituisce.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se la firma usa l&#39;identità OIDC della pipeline invece di una chiave che custodisco io, non sto solo spostando la fiducia su GitHub/Fulcio/Rekor? Cosa impedisce a chi li compromette di firmare qualunque cosa?&lt;/summary&gt;
&lt;p&gt;Stai spostando la fiducia, sì, ma verso componenti progettati per essere difendibili e — soprattutto —
&lt;em&gt;osservabili&lt;/em&gt;, il che cambia la natura del rischio. Primo: la fiducia nell&#39;identità OIDC non è
peggiore di prima, è migliore. Con una chiave privata a lungo termine il rischio era una stringa che
poteva trapelare da un file di config, un backup, un laptop, e restare valida per mesi senza che nessuno
se ne accorgesse; con la firma keyless non esiste nessun segreto persistente da rubare, e il certificato
vive minuti. Un attaccante dovrebbe compromettere l&#39;identità della pipeline &lt;em&gt;nel momento&lt;/em&gt; della
build — il che è un problema di sicurezza della CI/CD che hai comunque, firma o no. Secondo, ed è il punto
di Rekor: ogni firma finisce in un log pubblico, append-only, a prova di manomissione. Se qualcuno
riuscisse a firmare un artefatto malevolo con la tua identità, quella firma sarebbe &lt;em&gt;pubblicamente
registrata&lt;/em&gt;, con l&#39;identità e l&#39;istante, visibile a te e a chiunque monitori il log — un attacco non
ripudiabile e rilevabile, non un furto silenzioso di chiave che scopri sei mesi dopo. Terzo, la verifica
è vincolata: non accetti &#34;una firma qualsiasi&#34;, accetti solo l&#39;identità esatta (quel repo, quel workflow,
quel branch), quindi compromettere &#34;GitHub in generale&#34; non basta, serve proprio la tua identità precisa.
Resta vero che Fulcio e Rekor sono radici di fiducia: se vengono compromessi a livello di infrastruttura,
il modello vacilla — ma sono gestiti come infrastruttura critica, replicati e monitorati, e puoi anche
operarne istanze tue. Il confronto corretto non è &#34;fiducia zero contro fiducia in Sigstore&#34;, è &#34;una chiave
privata fragile e silenziosa che custodisci male contro un&#39;identità effimera registrata pubblicamente&#34;:
la seconda sposta la fiducia su qualcosa di più piccolo, più breve nel tempo e, decisivo, verificabile a
posteriori da tutti.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Sigstore rende la firma pratica eliminando le chiavi da custodire: identità effimera via Fulcio, log
pubblico via Rekor, firma e verifica di immagini, SBOM e provenienza con cosign. La firma attesta
l&amp;rsquo;origine, non la qualità, e diventa un controllo solo quando qualcuno la &lt;em&gt;verifica&lt;/em&gt; all&amp;rsquo;ingresso. Con
artefatti verificabili in mano, il tema si sposta su dove tutto questo si orchestra e dove un
attaccante punterebbe per primo: la pipeline CI/CD stessa, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
