<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Terraform on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/terraform/</link>
        <description>Recent content in Terraform on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 16 Jun 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/terraform/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Sicurezza dell&#39;Infrastructure as Code</title>
        <link>https://www.matteobianchi.eu/p/iac-security/</link>
        <pubDate>Tue, 16 Jun 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/iac-security/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/iac-security/cover.png" alt="Featured image of post Sicurezza dell&#39;Infrastructure as Code" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;La &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/sicurezza-pipeline-ci-cd/&#34; &gt;pipeline&lt;/a&gt; non costruisce solo applicazioni:
costruisce anche l&amp;rsquo;&lt;strong&gt;infrastruttura&lt;/strong&gt;, ormai definita come codice — Terraform, CloudFormation,
Pulumi, manifest Kubernetes. È una grande notizia per la sicurezza: se l&amp;rsquo;infrastruttura è codice,
possiamo analizzarla come codice, &lt;em&gt;prima&lt;/em&gt; del deploy. È anche un rischio nuovo: un errore in un
modulo riusato si replica identico su ogni ambiente, trasformando un singolo sbaglio in una falla
sistemica.&lt;/p&gt;
&lt;h2 id=&#34;lerrore-si-moltiplica&#34;&gt;L&amp;rsquo;errore si moltiplica
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    M[&amp;#34;modulo-storage.tf&amp;lt;br/&amp;gt;(acl = public-read)&amp;#34;] --&amp;gt; A[Ambiente dev]
    M --&amp;gt; B[Ambiente staging]
    M --&amp;gt; C[Ambiente prod]
    A --&amp;gt; X1[Bucket pubblico]
    B --&amp;gt; X2[Bucket pubblico]
    C --&amp;gt; X3[Bucket pubblico&amp;lt;br/&amp;gt;con dati reali]
    style X3 fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Un bucket reso pubblico in un modulo condiviso diventa &lt;em&gt;tre&lt;/em&gt; bucket pubblici. Il lato positivo è
speculare: correggere il modulo e ripassare lo scanner mette in sicurezza tutti gli ambienti in un
colpo. L&amp;rsquo;IaC amplifica sia gli errori sia le correzioni.&lt;/p&gt;
&lt;h2 id=&#34;cosa-trova-lo-scanning-delliac&#34;&gt;Cosa trova lo scanning dell&amp;rsquo;IaC
&lt;/h2&gt;&lt;p&gt;Gli scanner statici (Checkov, tfsec, Terrascan, KICS) applicano centinaia di regole, spesso allineate
ai &lt;strong&gt;CIS Benchmark&lt;/strong&gt;, cercando le configurazioni pericolose più comuni:&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-hcl&#34; data-lang=&#34;hcl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;resource&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;aws_s3_bucket_public_access_block&amp;#34; &amp;#34;ex&amp;#34;&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;n&#34;&gt;  bucket&lt;/span&gt;                  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;aws_s3_bucket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;id&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;n&#34;&gt;  block_public_acls&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;   # ← lo scanner segnala: accesso pubblico possibile
&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;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;  restrict_public_buckets&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;   # ← idem
&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;c1&#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;Difetti tipici: storage pubblico, security group con &lt;code&gt;0.0.0.0/0&lt;/code&gt; su porte di gestione, cifratura a
riposo disattivata, log disabilitati, ruoli IAM troppo ampi, assenza di tag. Sono &lt;em&gt;misconfiguration&lt;/em&gt;,
non bug di codice: il SAST non le vede, perché il &amp;ldquo;codice&amp;rdquo; qui descrive infrastruttura, non logica.&lt;/p&gt;
&lt;h2 id=&#34;dove-collocarlo&#34;&gt;Dove collocarlo
&lt;/h2&gt;&lt;p&gt;Come il SAST, l&amp;rsquo;IaC scanning dà il meglio presto e in modo incrementale:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pre-commit / IDE&lt;/strong&gt;: feedback immediato mentre si scrive il Terraform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull request&lt;/strong&gt;: gate che blocca il &lt;em&gt;nuovo&lt;/em&gt; rischio alto, con baseline sul debito esistente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-apply nella pipeline&lt;/strong&gt;: ultimo controllo prima di toccare l&amp;rsquo;infrastruttura reale, idealmente
anche sul &lt;em&gt;piano&lt;/em&gt; (&lt;code&gt;terraform plan&lt;/code&gt;) per vedere l&amp;rsquo;effetto concreto, non solo il sorgente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;il-problema-spesso-dimenticato-lo-state&#34;&gt;Il problema spesso dimenticato: lo state
&lt;/h2&gt;&lt;p&gt;Il file di &lt;strong&gt;state&lt;/strong&gt; di Terraform contiene spesso dati sensibili in chiaro: password generate,
chiavi, output. Va trattato come un segreto: backend remoto cifrato, accesso ristretto, mai
committato nel repository. È l&amp;rsquo;errore IaC meno appariscente e più comune, perché non riguarda una
risorsa ma il &lt;em&gt;meccanismo stesso&lt;/em&gt; che le gestisce.&lt;/p&gt;
&lt;h2 id=&#34;il-limite-lo-statico-non-vede-il-reale&#34;&gt;Il limite: lo statico non vede il reale
&lt;/h2&gt;&lt;p&gt;Lo scanning dell&amp;rsquo;IaC vede ciò che il codice &lt;em&gt;dichiara&lt;/em&gt;, non ciò che esiste davvero nel cloud. Le
modifiche manuali (il famigerato &amp;ldquo;clic in console&amp;rdquo;) creano &lt;strong&gt;drift&lt;/strong&gt;: la realtà diverge dal codice, e
lo scanner, che legge solo il codice, non se ne accorge. Servono controlli a runtime sul cloud (CSPM)
e la disciplina di non modificare mai l&amp;rsquo;infrastruttura fuori dall&amp;rsquo;IaC. Il &amp;ldquo;cosa è dichiarato pericoloso&amp;rdquo;
è però esprimibile come regola generale, e questo apre il tema del prossimo capitolo: le policy as code.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se lo scanner IaC non vede il drift e le modifiche manuali, posso fidarmi che un &#34;piano pulito&#34; significhi infrastruttura sicura?&lt;/summary&gt;
&lt;p&gt;No, e confondere le due cose è una delle illusioni di sicurezza più comuni con l&#39;IaC. Uno scanner che
passa sul tuo Terraform dimostra una cosa precisa e limitata: che &lt;em&gt;ciò che il codice descrive&lt;/em&gt; non
contiene le misconfigurazioni note alle sue regole. Non dimostra che l&#39;infrastruttura &lt;em&gt;reale&lt;/em&gt; sia
in quello stato, per tre motivi. Primo, il drift: qualcuno apre la console cloud e modifica a mano un
security group per &#34;sbloccare al volo&#34; un incidente, e non lo riporta mai nel codice; il tuo Terraform
resta pulito, il cloud no, e il prossimo apply potrebbe persino non toccare quella risorsa. Secondo, la
copertura: quasi nessuna infrastruttura è gestita al 100% da IaC — ci sono risorse create prima
dell&#39;adozione, risorse di altri team, cose fatte a mano &#34;temporaneamente&#34; tre anni fa; tutto ciò che non è
nel codice è invisibile allo scanner per definizione. Terzo, le regole hanno punti ciechi: lo scanner
trova le misconfigurazioni che conosce, non la logica di autorizzazione sbagliata o la combinazione
insolita di risorse che crea un percorso d&#39;attacco non previsto da nessuna singola regola. La risposta
corretta è usare due lenti complementari: lo scanning statico dell&#39;IaC come controllo &lt;em&gt;preventivo&lt;/em&gt;
sul codice prima del deploy (economico, precoce, ferma l&#39;errore prima che esista), e un controllo
&lt;em&gt;a runtime&lt;/em&gt; sul cloud reale — un CSPM che interroga le API del provider e confronta lo stato
effettivo con le policy — come rete che cattura drift, risorse fuori IaC e deviazioni. Più la disciplina
organizzativa di vietare le modifiche manuali e far passare ogni cambiamento dall&#39;IaC, così il drift
tende a zero. Un piano pulito è una condizione necessaria, non sufficiente: ti dice che non stai
&lt;em&gt;introducendo&lt;/em&gt; un problema noto, non che non ne hai già uno in produzione.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;IaC rende l&amp;rsquo;infrastruttura analizzabile prima del deploy: gli scanner trovano bucket pubblici,
security group aperti e cifratura mancante, e una correzione al modulo mette in sicurezza ogni
ambiente. Ma lo statico non vede il drift, e le regole predefinite non conoscono le &lt;em&gt;tue&lt;/em&gt; policy. Per
esprimere ed applicare regole su misura — nella pipeline e nel cluster — serve un motore di policy
generale. È il policy as code, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
