<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Namespaces on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/namespaces/</link>
        <description>Recent content in Namespaces on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 09 Jun 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/namespaces/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Namespaces e isolamento</title>
        <link>https://www.matteobianchi.eu/p/namespaces-e-isolamento/</link>
        <pubDate>Tue, 09 Jun 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/namespaces-e-isolamento/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/namespaces-e-isolamento/cover.png" alt="Featured image of post Namespaces e isolamento" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Finora abbiamo confinato i processi con permessi, capabilities e MAC — ma condividendo la stessa vista
del sistema. I &lt;strong&gt;namespaces&lt;/strong&gt; fanno un passo oltre: danno a un processo una vista &lt;em&gt;privata&lt;/em&gt; di una
risorsa, come se avesse un sistema tutto suo. Un processo in un PID namespace vede solo i propri
processi; in un network namespace, una propria pila di rete. È il meccanismo con cui si costruiscono i
&lt;strong&gt;container&lt;/strong&gt; — e capirlo demistifica cosa sono davvero (non macchine virtuali, ma processi isolati dal
kernel) e come usarli per isolare un servizio.&lt;/p&gt;
&lt;h2 id=&#34;i-tipi-di-namespace&#34;&gt;I tipi di namespace
&lt;/h2&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;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;8
&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;PID     → albero dei processi privato (dentro, il tuo processo è PID 1; non vede gli altri)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NET     → interfacce, routing, firewall propri
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MNT     → tabella dei mount privata (propria vista del filesystem)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;UTS     → hostname proprio
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;IPC     → memoria condivisa / code di messaggi separate
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;USER    → mappatura UID/GID propria (root &amp;#34;dentro&amp;#34; ≠ root &amp;#34;fuori&amp;#34;) ← chiave per la sicurezza
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CGROUP  → vista dei cgroup propria
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TIME    → clock boot/monotonic propri
&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;h2 id=&#34;vederli-e-crearli-a-mano&#34;&gt;Vederli e crearli a mano
&lt;/h2&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;lnt&#34;&gt;3
&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;/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;lsns                               &lt;span class=&#34;c1&#34;&gt;# elenca i namespace attivi e i processi che li usano&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /proc/&lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;/ns/                 &lt;span class=&#34;c1&#34;&gt;# i namespace del tuo shell corrente&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&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;# crea un processo con PID e mount namespace nuovi (serve privilegio o userns)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unshare --pid --mount --fork --mount-proc bash
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps aux        &lt;span class=&#34;c1&#34;&gt;# dentro: vedi pochissimi processi — sei &amp;#34;solo&amp;#34; nel tuo PID namespace&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;h2 id=&#34;il-user-namespace-root-finto&#34;&gt;Il user namespace: root &amp;ldquo;finto&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Il più interessante per la sicurezza è il &lt;strong&gt;user namespace&lt;/strong&gt;: permette a un utente non privilegiato di
avere i poteri di root &lt;em&gt;dentro&lt;/em&gt; il namespace, mentre &lt;em&gt;fuori&lt;/em&gt; resta un utente normale. Così un processo
può fare operazioni &amp;ldquo;da root&amp;rdquo; nel suo mondo isolato senza essere root sul sistema 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;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&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;# root dentro, utente normale fuori: nessun privilegio reale acquisito&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unshare --user --map-root-user bash
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id        &lt;span class=&#34;c1&#34;&gt;# dentro: uid=0(root) — ma è root solo in questo namespace&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 fondamento dei &lt;strong&gt;container rootless&lt;/strong&gt; (Podman rootless): il container &amp;ldquo;crede&amp;rdquo; di avere root, ma sul
sistema ospite è confinato ai privilegi di un utente normale. Un&amp;rsquo;enorme riduzione del rischio rispetto
ai container che girano come root reale.&lt;/p&gt;
&lt;h2 id=&#34;systemd-nspawn-un-container-leggero&#34;&gt;systemd-nspawn: un container leggero
&lt;/h2&gt;&lt;p&gt;systemd include un gestore di container minimale, utile per isolare un servizio o testare in un
ambiente separato senza installare Docker/Podman.&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;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&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;# avvia una shell in un container basato su una directory (un &amp;#34;chroot potenziato&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;systemd-nspawn -D /var/lib/machines/test
&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;# con isolamento di rete e utenti:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemd-nspawn -D /var/lib/machines/test --private-network -U
&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;h2 id=&#34;il-legame-con-lhardening&#34;&gt;Il legame con l&amp;rsquo;hardening
&lt;/h2&gt;&lt;p&gt;I namespaces sono il motivo per cui il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/systemd-hardening-servizi/&#34; &gt;sandboxing di systemd&lt;/a&gt; funziona: direttive come &lt;code&gt;PrivateTmp&lt;/code&gt;, &lt;code&gt;ProtectHome&lt;/code&gt;,
&lt;code&gt;PrivateNetwork&lt;/code&gt; creano namespace dedicati per il servizio. E spiegano perché un container &lt;strong&gt;non è una
barriera di sicurezza perfetta&lt;/strong&gt;: condivide il kernel con l&amp;rsquo;host, quindi una vulnerabilità del kernel
può permettere la fuga. I container isolano, ma il confinamento forte richiede comunque capabilities
ridotte, seccomp e MAC — gli stessi strumenti dei capitoli precedenti, applicati dentro il container.&lt;/p&gt;
&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;I namespaces danno viste private di PID, rete, mount e utenti: sono il mattone dei container e del
sandboxing systemd, e i user namespace permettono root &amp;ldquo;finto&amp;rdquo; senza privilegi reali. Isolamento a
parte, resta un ultimo livello da indurire — quello più profondo, dove vivono i parametri del sistema
stesso: il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/kernel-hardening-sysctl/&#34; &gt;kernel hardening con sysctl&lt;/a&gt;, prossimo
capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
