<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Systemd on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/systemd/</link>
        <description>Recent content in Systemd on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 10 Mar 2026 09:00:00 +0100</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/systemd/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Sandboxing dei servizi con systemd</title>
        <link>https://www.matteobianchi.eu/p/systemd-hardening-servizi/</link>
        <pubDate>Tue, 10 Mar 2026 09:00:00 +0100</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/systemd-hardening-servizi/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/systemd-hardening-servizi/cover.png" alt="Featured image of post Sandboxing dei servizi con systemd" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Un servizio non-root compromesso è meno grave di uno root — ma può comunque leggere dati, scrivere
dove non dovrebbe, aprire connessioni, tentare escalation. La difesa in profondità dice: assumi che il
servizio &lt;em&gt;verrà&lt;/em&gt; bucato, e limita cosa potrà fare allora. systemd offre per questo uno dei sandbox più
semplici da attivare in tutto Linux: &lt;strong&gt;poche righe nella unit&lt;/strong&gt; mettono il processo in un recinto di
filesystem, privilegi e syscall. Eppure è tra le funzioni meno usate. Rimediamo.&lt;/p&gt;
&lt;h2 id=&#34;misurare-prima-systemd-analyze-security&#34;&gt;Misurare prima: systemd-analyze security
&lt;/h2&gt;&lt;p&gt;systemd ti dà un voto di esposizione per ogni servizio. Parti da qui per sapere dove intervenire.&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;systemd-analyze security                      &lt;span class=&#34;c1&#34;&gt;# classifica TUTTI i servizi per esposizione&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemd-analyze security nginx.service        &lt;span class=&#34;c1&#34;&gt;# dettaglio: quali protezioni mancano&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;# Overall exposure level: 8.6 UNSAFE  →  l&amp;#39;obiettivo è portarlo verso &amp;#34;OK/GOOD&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;h2 id=&#34;le-direttive-che-contano&#34;&gt;Le direttive che contano
&lt;/h2&gt;&lt;p&gt;Si aggiungono nel blocco &lt;code&gt;[Service]&lt;/code&gt;, idealmente via drop-in (&lt;code&gt;systemctl edit myapp.service&lt;/code&gt;) così non
tocchi la unit originale.&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;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;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;11
&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;# systemctl edit myapp.service  → crea override.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NoNewPrivileges=true          # il processo e i figli NON possono acquisire nuovi privilegi (blocca SUID/escalation)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ProtectSystem=strict          # tutto il filesystem in sola lettura...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ReadWritePaths=/var/lib/myapp # ...tranne i percorsi che dichiari esplicitamente
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ProtectHome=true              # /home, /root, /run/user invisibili al servizio
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PrivateTmp=true               # /tmp privato e separato (niente attacchi via file temporanei condivisi)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PrivateDevices=true           # niente accesso ai device fisici
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CapabilityBoundingSet=        # azzera tutte le capabilities (vedi cap. 16)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RestrictAddressFamilies=AF_INET AF_INET6   # solo socket di rete IP, niente AF_NETLINK ecc.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SystemCallFilter=@system-service   # consenti solo le syscall tipiche di un servizio (seccomp)
&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;Ciascuna chiude una categoria di abusi: &lt;code&gt;NoNewPrivileges&lt;/code&gt; spegne il trucco del SUID; &lt;code&gt;ProtectSystem=strict&lt;/code&gt;
rende impossibile scrivere binari di sistema; &lt;code&gt;PrivateTmp&lt;/code&gt; isola i file temporanei; &lt;code&gt;SystemCallFilter&lt;/code&gt;
blocca intere famiglie di syscall (es. quelle per caricare moduli kernel) che un servizio normale non
usa mai.&lt;/p&gt;
&lt;h2 id=&#34;un-esempio-completo&#34;&gt;Un esempio completo
&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;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;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&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;# /etc/systemd/system/myapp.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ExecStart=/usr/local/bin/myapp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;User=myapp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Group=myapp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# --- sandbox ---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NoNewPrivileges=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ProtectSystem=strict
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ProtectHome=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PrivateTmp=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PrivateDevices=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ReadWritePaths=/var/lib/myapp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CapabilityBoundingSet=
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SystemCallFilter=@system-service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SystemCallArchitectures=native
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LockPersonality=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MemoryDenyWriteExecute=true   # niente memoria contemporaneamente scrivibile ed eseguibile (ostacola exploit)
&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;&lt;code&gt;DynamicUser=true&lt;/code&gt; è un bonus: fa girare il servizio sotto un utente &lt;em&gt;effimero&lt;/em&gt; creato al volo e distrutto
allo stop — zero account da gestire, isolamento massimo (usalo solo con servizi che non hanno bisogno di
un UID stabile).&lt;/p&gt;
&lt;h2 id=&#34;applicare-e-verificare&#34;&gt;Applicare e verificare
&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;/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;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl restart myapp.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemd-analyze security myapp.service     &lt;span class=&#34;c1&#34;&gt;# il voto deve essere migliorato&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;journalctl -u myapp -e                      &lt;span class=&#34;c1&#34;&gt;# controlla che non si sia rotto nulla&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 rischio pratico: una direttiva troppo stretta impedisce al servizio di funzionare (es. non può
scrivere dove gli serve). Si procede per gradi, guardando i log: se il servizio si lamenta di un
percorso, lo aggiungi a &lt;code&gt;ReadWritePaths&lt;/code&gt;; se di una syscall negata, allenti il filtro.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se il servizio gira già sotto un utente non privilegiato dedicato, non è già abbastanza isolato? Che cosa aggiunge davvero tutto questo sandboxing, a parte il rischio di romperlo?&lt;/summary&gt;
&lt;p&gt;Girare sotto un utente dedicato è il primo strato e il più importante, ma protegge solo lungo un asse —
i permessi DAC — e lascia aperti molti altri che il sandboxing chiude. Pensa a cosa può fare un servizio
compromesso che gira come utente &lt;code&gt;myapp&lt;/code&gt; non privilegiato, senza sandbox: può leggere ogni
file leggibile da &#34;altri&#34; sul sistema (e sono tanti: /etc/passwd, configurazioni, log, codice di altre
app), può scrivere in /tmp file che altri processi leggono (attacchi via file temporanei), può tentare di
sfruttare un binario SUID per salire a root, può aprire connessioni di rete verso l&#39;esterno per
esfiltrare o scaricare un secondo stadio, può leggere le home degli utenti se i permessi lo consentono,
può provare syscall esotiche per sfruttare vulnerabilità del kernel. L&#39;utente dedicato non ferma nulla di
tutto questo, perché sono tutte azioni che un utente normale &lt;em&gt;può&lt;/em&gt; fare. Il sandboxing di systemd
chiude ciascuna di queste strade: &lt;code&gt;ProtectSystem=strict&lt;/code&gt; + &lt;code&gt;ReadWritePaths&lt;/code&gt; riduce
il filesystem a sola lettura tranne la sua cartella, quindi non scrive da nessun&#39;altra parte;
&lt;code&gt;ProtectHome&lt;/code&gt; gli nasconde le home; &lt;code&gt;PrivateTmp&lt;/code&gt; gli dà un /tmp separato, neutralizzando
gli attacchi via temporanei; &lt;code&gt;NoNewPrivileges&lt;/code&gt; rende inutile qualsiasi SUID, chiudendo la via
di escalation; &lt;code&gt;SystemCallFilter&lt;/code&gt; gli toglie le syscall che non userebbe mai, riducendo la
superficie del kernel sfruttabile; &lt;code&gt;RestrictAddressFamilies&lt;/code&gt; limita i tipi di socket. Ogni
direttiva trasforma &#34;cosa potrebbe fare un attaccante da dentro quel servizio&#34; in un recinto molto più
piccolo. Sul rischio di romperlo: è reale ma gestibile — si procede per gradi guardando i log, e il voto
di &lt;code&gt;systemd-analyze security&lt;/code&gt; ti guida. Il costo è qualche minuto di tuning una volta; il
beneficio è che una compromissione del servizio resta confinata invece di diventare un piede dentro il
sistema. Questo è esattamente il senso della difesa in profondità: non un muro solo, ma tanti recinti.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Con una manciata di direttive — &lt;code&gt;NoNewPrivileges&lt;/code&gt;, &lt;code&gt;ProtectSystem&lt;/code&gt;, &lt;code&gt;PrivateTmp&lt;/code&gt;, capabilities azzerate,
filtro seccomp — systemd mette ogni servizio in una gabbia, e &lt;code&gt;systemd-analyze security&lt;/code&gt; misura i
progressi. È difesa in profondità quasi gratuita. I servizi, però, sono anche processi che consumano
risorse: la prossima linea di difesa riguarda &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/processi-e-risorse-cgroups/&#34; &gt;processi, risorse e
cgroups&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>systemd: servizi e unit</title>
        <link>https://www.matteobianchi.eu/p/systemd-servizi-e-unit/</link>
        <pubDate>Tue, 03 Mar 2026 09:00:00 +0100</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/systemd-servizi-e-unit/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/systemd-servizi-e-unit/cover.png" alt="Featured image of post systemd: servizi e unit" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Ogni servizio attivo è una porta potenziale: ascolta su una socket, gira con certi privilegi, ha un
suo codice con sue vulnerabilità. Il principio della &lt;strong&gt;superficie minima&lt;/strong&gt; dice: ciò che non gira non
può essere attaccato. Prima di indurire i servizi, bisogna &lt;em&gt;vederli&lt;/em&gt; e &lt;em&gt;spegnere quelli che non
servono&lt;/em&gt;. È il lavoro di systemd, il gestore di servizi (e molto altro) di Linux moderno.&lt;/p&gt;
&lt;h2 id=&#34;vedere-cosa-gira-e-cosa-ascolta&#34;&gt;Vedere cosa gira e cosa ascolta
&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;/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;systemctl list-units --type&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;service --state&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;running   &lt;span class=&#34;c1&#34;&gt;# servizi attivi ORA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl list-unit-files --state&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;enabled              &lt;span class=&#34;c1&#34;&gt;# cosa parte al boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemd-analyze blame                                  &lt;span class=&#34;c1&#34;&gt;# cosa rallenta l&amp;#39;avvio (e cosa c&amp;#39;è)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ss -tulpn                                               &lt;span class=&#34;c1&#34;&gt;# porte in ascolto + processo (vedi cap. 12)&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 domanda da farsi su ogni voce: &lt;em&gt;mi serve davvero?&lt;/em&gt; Un server web non ha bisogno di un server di
stampa, un demo Bluetooth, un resolver mDNS. Ogni &amp;ldquo;no&amp;rdquo; è superficie d&amp;rsquo;attacco rimossa.&lt;/p&gt;
&lt;h2 id=&#34;anatomia-di-una-unit&#34;&gt;Anatomia di una unit
&lt;/h2&gt;&lt;p&gt;Una unit di servizio è un file &lt;code&gt;.ini&lt;/code&gt;. Quelle del sistema stanno in &lt;code&gt;/usr/lib/systemd/system/&lt;/code&gt;; le tue
personalizzazioni in &lt;code&gt;/etc/systemd/system/&lt;/code&gt; (che ha la precedenza).&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;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;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&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;# /etc/systemd/system/myapp.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Description=La mia applicazione
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;After=network-online.target
&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 hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ExecStart=/usr/local/bin/myapp --config /etc/myapp.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;User=myapp                 # NON girare da root: account dedicato (vedi cap. 2)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Restart=on-failure
&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;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WantedBy=multi-user.target
&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;Due righe pesano per la sicurezza: &lt;code&gt;User=myapp&lt;/code&gt; (il servizio gira con un account non privilegiato, non
root) e tutto ciò che aggiungeremo nel prossimo capitolo per sandboxarlo.&lt;/p&gt;
&lt;h2 id=&#34;enable-disable-mask&#34;&gt;enable, disable, mask
&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;/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;systemctl stop  cups.service          &lt;span class=&#34;c1&#34;&gt;# fermalo ora&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl disable cups.service        &lt;span class=&#34;c1&#34;&gt;# non parte più al boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl mask cups.service           &lt;span class=&#34;c1&#34;&gt;# lo &amp;#34;blinda&amp;#34;: non può essere avviato in alcun modo&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 differenza che conta: &lt;strong&gt;disable&lt;/strong&gt; toglie l&amp;rsquo;avvio automatico ma qualcosa può ancora avviarlo (una
dipendenza, un socket). &lt;strong&gt;mask&lt;/strong&gt; crea un link a &lt;code&gt;/dev/null&lt;/code&gt;: il servizio è &lt;em&gt;impossibile&lt;/em&gt; da avviare
finché non lo smaschera. Per i servizi che vuoi davvero fuori gioco, &lt;code&gt;mask&lt;/code&gt; è la scelta sicura.&lt;/p&gt;
&lt;h2 id=&#34;socket-e-timer-attivazione-pigra&#34;&gt;Socket e timer: attivazione pigra
&lt;/h2&gt;&lt;p&gt;systemd può tenere un servizio &lt;em&gt;spento&lt;/em&gt; e avviarlo solo alla prima connessione (socket activation), o
su schedule (timer, il moderno sostituto di cron). Dal lato sicurezza: un servizio attivato on-demand
non è un processo che gira e aspetta di essere attaccato per ore inutili.&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;/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;systemctl list-timers                 &lt;span class=&#34;c1&#34;&gt;# i job schedulati (al posto di crontab)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl list-sockets
&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-riflesso-dellhardening&#34;&gt;Il riflesso dell&amp;rsquo;hardening
&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;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&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;lnt&#34;&gt;4
&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Checklist su ogni servizio:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1. serve? NO  → stop + disable + mask
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2. serve? SÌ  → gira da account dedicato (User=), non root?
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  3. serve? SÌ  → è sandboxato? (prossimo capitolo)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  4. serve? SÌ  → ascolta solo dove deve? (0.0.0.0 vs 127.0.0.1 → cap. 12)
&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;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Vedere i servizi, spegnere e &lt;code&gt;mask&lt;/code&gt;are l&amp;rsquo;inutile, far girare il resto da account dedicati: così si
riduce la superficie prima ancora di indurire. Ma i servizi che &lt;em&gt;devono&lt;/em&gt; restare attivi vanno messi in
gabbia, perché anche un servizio non-root può fare danni se compromesso. systemd offre un sandboxing
potente e sottovalutato: è il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/systemd-hardening-servizi/&#34; &gt;prossimo capitolo&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
