<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Sudo on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/sudo/</link>
        <description>Recent content in Sudo on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 10 Feb 2026 09:00:00 +0100</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/sudo/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>sudo e l&#39;escalation controllata</title>
        <link>https://www.matteobianchi.eu/p/sudo-ed-escalation/</link>
        <pubDate>Tue, 10 Feb 2026 09:00:00 +0100</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/sudo-ed-escalation/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/sudo-ed-escalation/cover.png" alt="Featured image of post sudo e l&#39;escalation controllata" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Dare la password di root a un amministratore è un errore su più fronti: non è tracciabile (tutti sono
&amp;ldquo;root&amp;rdquo;, nessuno è responsabile), non è revocabile singolarmente, e dà poteri totali per un compito che
magari ne richiede uno solo. &lt;strong&gt;sudo&lt;/strong&gt; risolve tutto questo: ogni utente usa la &lt;em&gt;propria&lt;/em&gt; password,
esegue solo i comandi che gli concedi, e ogni uso è &lt;strong&gt;loggato&lt;/strong&gt;. Ma sudo è potente quanto il suo file
di configurazione — e un &lt;code&gt;sudoers&lt;/code&gt; sciatto è una scalata a root servita.&lt;/p&gt;
&lt;h2 id=&#34;la-regola-base&#34;&gt;La regola base
&lt;/h2&gt;&lt;p&gt;Si modifica &lt;em&gt;sempre&lt;/em&gt; con &lt;code&gt;visudo&lt;/code&gt;, che valida la sintassi prima di salvare (un errore di sintassi può
chiuderti fuori da sudo).&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;visudo                      &lt;span class=&#34;c1&#34;&gt;# modifica /etc/sudoers con validazione&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;visudo -f /etc/sudoers.d/ops   &lt;span class=&#34;c1&#34;&gt;# meglio: file separati in sudoers.d/&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;Una regola ha la forma: &lt;code&gt;CHI  SU-QUALI-HOST = (COME-QUALE-UTENTE)  QUALI-COMANDI&lt;/code&gt;.&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;/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;# dare TUTTO (comodo, pericoloso): l&amp;#39;utente diventa root a piacere
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;matteo  ALL=(ALL:ALL) ALL
&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;# privilegio minimo: solo i comandi che servono davvero
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deploy  ALL=(root) /usr/bin/systemctl restart myapp, /usr/bin/journalctl -u myapp *
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;backup  ALL=(root) /usr/bin/rsync
&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 seconda forma è l&amp;rsquo;obiettivo: &lt;code&gt;deploy&lt;/code&gt; può riavviare &lt;em&gt;il suo&lt;/em&gt; servizio e leggerne i log, nient&amp;rsquo;altro.
Non può aprire una shell di root.&lt;/p&gt;
&lt;h2 id=&#34;le-trappole-che-regalano-root&#34;&gt;Le trappole che regalano root
&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;/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;NOPASSWD: ALL        → chi ottiene la sessione dell&amp;#39;utente ha root senza nemmeno una password
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;comandi con wildcard → /usr/bin/vi *  permette :!sh  → shell di root (vedi GTFOBins)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;editor/pager/interpreti → less, vi, man, python: quasi tutti possono lanciare una shell
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ALL con (ALL:ALL)    → può diventare QUALUNQUE utente, non solo root
&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 tranello più sottile: concedere un comando &amp;ldquo;innocuo&amp;rdquo; che però può &lt;strong&gt;evadere in una shell&lt;/strong&gt;. &lt;code&gt;sudo vi&lt;/code&gt;, &lt;code&gt;sudo less&lt;/code&gt;, &lt;code&gt;sudo find&lt;/code&gt;, &lt;code&gt;sudo python&lt;/code&gt; → da ciascuno si apre una shell di root. Se devi concedere
un editor, usa &lt;code&gt;sudoedit&lt;/code&gt; (apre il file coi tuoi privilegi, non una shell di root):&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# invece di: alice ALL=(root) /usr/bin/vi /etc/nginx/nginx.conf   (evadibile!)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;alice  ALL=(root) sudoedit /etc/nginx/nginx.conf
&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;leggere-e-verificare-i-privilegi&#34;&gt;Leggere e verificare i privilegi
&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;/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;sudo -l                 &lt;span class=&#34;c1&#34;&gt;# cosa posso eseguire io con sudo? (da lanciare come l&amp;#39;utente)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -l -U deploy       &lt;span class=&#34;c1&#34;&gt;# cosa può fare l&amp;#39;utente &amp;#39;deploy&amp;#39; (da root)&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;&lt;code&gt;sudo -l&lt;/code&gt; è il primo comando che esegue un attaccante dopo aver preso un account — fallo prima tu, su
ogni account con sudo, e chiediti: &amp;ldquo;questa riga permette di diventare root in modo imprevisto?&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;irrobustire-sudo&#34;&gt;Irrobustire sudo
&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;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;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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# in /etc/sudoers.d/hardening
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Defaults  timestamp_timeout=5      # la &amp;#34;memoria&amp;#34; della password dura 5 min, non 15
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Defaults  passwd_tries=3           # tentativi prima di abortire
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Defaults  logfile=&amp;#34;/var/log/sudo.log&amp;#34;   # log dedicato, oltre al journal
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Defaults  requiretty               # niente sudo da sessioni non-tty (riduce abusi da script)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Defaults  use_pty                  # esegui in uno pseudo-tty (ostacola alcuni attacchi)
&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;E la cosa più importante: &lt;strong&gt;chi è nel gruppo sudo/wheel?&lt;/strong&gt; Quel gruppo è la porta principale a root.
Tienilo corto e rivisto — è lo stesso ragionamento degli &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/utenti-gruppi-account/&#34; &gt;account e gruppi
potenti&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;sudo presta i poteri di root in modo tracciato e granulare — se il sudoers rispetta il privilegio
minimo, evita NOPASSWD e wildcard, e non concede comandi che aprono shell. È la via corretta per
l&amp;rsquo;accesso privilegiato &lt;em&gt;locale&lt;/em&gt;. Ma la maggior parte degli accessi a un server arriva da remoto, ed è
lì che si gioca la prima linea: l&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/hardening-ssh/&#34; &gt;hardening di SSH&lt;/a&gt;, prossimo
capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
