<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Admission Control on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/admission-control/</link>
        <description>Recent content in Admission Control on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 14 Jul 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/admission-control/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Admission control: il buttafuori del cluster</title>
        <link>https://www.matteobianchi.eu/p/admission-control/</link>
        <pubDate>Tue, 14 Jul 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/admission-control/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/admission-control/cover.png" alt="Featured image of post Admission control: il buttafuori del cluster" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/kubernetes-hardening/&#34; &gt;hardening&lt;/a&gt; definisce &lt;em&gt;come&lt;/em&gt; dovrebbe girare un pod. Ma
chi impedisce che qualcuno applichi comunque un manifest che viola quelle regole? L&amp;rsquo;&lt;strong&gt;admission
control&lt;/strong&gt; è la risposta: il punto, lungo il percorso di ogni richiesta all&amp;rsquo;API server, in cui si può
&lt;em&gt;rifiutare&lt;/em&gt; o &lt;em&gt;modificare&lt;/em&gt; un oggetto &lt;strong&gt;prima&lt;/strong&gt; che venga persistito e schedulato. È l&amp;rsquo;ultima porta —
e la più efficace, perché agisce su &lt;em&gt;tutto&lt;/em&gt; ciò che entra nel cluster, da qualunque fonte.&lt;/p&gt;
&lt;h2 id=&#34;dove-si-inserisce&#34;&gt;Dove si inserisce
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    U[kubectl / CI / operator] --&amp;gt;|crea pod| API[API server]
    API --&amp;gt; AUTH[AuthN/AuthZ&amp;lt;br/&amp;gt;RBAC]
    AUTH --&amp;gt; MUT[Mutating&amp;lt;br/&amp;gt;webhook]
    MUT --&amp;gt; VAL[Validating&amp;lt;br/&amp;gt;webhook&amp;lt;br/&amp;gt;= PEP]
    VAL --&amp;gt;|conforme| ETCD[(etcd → schedulato)]
    VAL -.non conforme.-&amp;gt; REJ[RIFIUTATO&amp;lt;br/&amp;gt;con motivazione]
    style VAL fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Dopo l&amp;rsquo;autenticazione e RBAC, la richiesta passa da due tipi di webhook:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mutating&lt;/strong&gt;: &lt;em&gt;modifica&lt;/em&gt; l&amp;rsquo;oggetto. Es. inietta automaticamente un security context sicuro, aggiunge
label, imposta limiti di risorse di default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validating&lt;/strong&gt;: &lt;em&gt;accetta o rifiuta&lt;/em&gt;. È il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/pdp-pep-il-motore-delle-policy/&#34; &gt;PEP&lt;/a&gt;
del cluster: valuta l&amp;rsquo;oggetto contro le policy e, se viola, lo blocca con un messaggio.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cosa-si-applica-qui&#34;&gt;Cosa si applica qui
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;admission control è dove le promesse dei capitoli precedenti diventano enforcement reale:&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;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&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;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Rifiuta se:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - immagine NON firmata da identità attesa   (verifica Sigstore/cosign)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - immagine con CVE critici o senza SBOM
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - container privilegiato / runAsRoot / hostPath pericolosi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - manca il limite di risorse, usa tag :latest, namespace sbagliato
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Muta per imposizione:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - aggiungi securityContext sicuro di default, label owner, networkpolicy
&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 della firma è l&amp;rsquo;esempio più nitido: la &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/firma-artefatti-sigstore/&#34; &gt;firma&lt;/a&gt;
diventa un &lt;em&gt;controllo d&amp;rsquo;accesso&lt;/em&gt; solo quando un validating webhook la verifica e rifiuta ciò che non
proviene dall&amp;rsquo;identità attesa. Senza admission control, firmare è teatro.&lt;/p&gt;
&lt;h2 id=&#34;kyverno-e-opa-gatekeeper&#34;&gt;Kyverno e OPA Gatekeeper
&lt;/h2&gt;&lt;p&gt;Due approcci allo stesso ruolo di PEP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kyverno&lt;/strong&gt;: le policy sono risorse Kubernetes in YAML, native per chi già conosce i manifest.
Nessun linguaggio nuovo da imparare; fa anche mutazione e generazione di risorse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OPA Gatekeeper&lt;/strong&gt;: porta &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/policy-as-code-pipeline/&#34; &gt;OPA e Rego&lt;/a&gt; nel cluster.
Più potente ed espressivo, a costo di imparare Rego, e con il vantaggio di condividere lo &lt;em&gt;stesso&lt;/em&gt;
linguaggio di policy tra pipeline e cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pipeline-e-cluster-due-reti-non-una&#34;&gt;Pipeline e cluster: due reti, non una
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;admission control e il controllo in pipeline si rafforzano a vicenda. La pipeline cattura presto e
dà feedback allo sviluppatore (shift-left); l&amp;rsquo;admission control cattura &lt;em&gt;tutto&lt;/em&gt; ciò che arriva
all&amp;rsquo;API, incluso ciò che bypassa la pipeline — un &lt;code&gt;kubectl apply&lt;/code&gt; manuale, un operator, un attaccante
con credenziali. Fare entrambi significa feedback precoce &lt;strong&gt;e&lt;/strong&gt; enforcement inaggirabile.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se già controllo tutto in pipeline — scansione immagini, firma, policy Rego — perché aggiungere l&#39;admission control nel cluster? Non è controllare due volte la stessa cosa?&lt;/summary&gt;
&lt;p&gt;È controllare la stessa &lt;em&gt;regola&lt;/em&gt; in due punti con garanzie diverse, e la differenza è tutta in
ciò che ciascun punto può garantire. La pipeline ha un presupposto fatale come unico controllo: che ogni
cosa che arriva nel cluster sia passata &lt;em&gt;dalla&lt;/em&gt; pipeline. Nella realtà non è così. Un operatore
sotto incidente fa un &lt;code&gt;kubectl apply&lt;/code&gt; a mano per &#34;sistemare al volo&#34;; un operator o un
controller crea pod dinamicamente senza passare da nessuna CI; un Helm chart di terze parti installa
risorse che la tua pipeline non ha mai visto; un attaccante che ha ottenuto credenziali valide parla
direttamente con l&#39;API server — e nessuno di questi percorsi tocca la pipeline. Tutto ciò che la pipeline
verifica diventa irrilevante per qualunque oggetto che entra da una porta diversa. L&#39;admission control
chiude proprio questo: sta sull&#39;API server, quindi vede &lt;em&gt;ogni&lt;/em&gt; richiesta di creazione o modifica,
da qualunque fonte, e applica la policy lì, nell&#39;unico collo di bottiglia che nessuno può aggirare senza
compromettere l&#39;API stessa. Questo non rende inutile la pipeline, anzi: i due hanno scopi complementari.
La pipeline è veloce, dà feedback allo sviluppatore riga per riga sulla pull request, fa fallire la build
quando il contesto è fresco — è prevenzione e insegnamento (shift-left). L&#39;admission control è tardivo e
muto per lo sviluppatore ma &lt;em&gt;inaggirabile&lt;/em&gt; — è enforcement. Il modello corretto è lo stesso
principio (&#34;solo immagini firmate&#34;) espresso una volta e applicato in due punti: in pipeline per fermare
presto e bene, all&#39;ammissione per fermare comunque. Togliere la pipeline ti lascia l&#39;enforcement senza
feedback precoce; togliere l&#39;admission control ti lascia il feedback con un enforcement pieno di buchi.
Li vuoi entrambi perché difendono da fallimenti diversi.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;admission control è il buttafuori del cluster: mutating webhook che impongono default sicuri,
validating webhook che rifiutano ciò che viola le policy — immagini non firmate, container
privilegiati, configurazioni fuori norma. È dove firma e policy diventano enforcement inaggirabile, a
complemento della pipeline. Ma tutti i controlli visti finora sono &lt;em&gt;preventivi&lt;/em&gt;: agiscono prima che il
codice giri. Qualcosa passerà comunque, e allora serve vedere e reagire a ciò che accade &lt;em&gt;mentre&lt;/em&gt;
succede. È la runtime security, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
