<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Account on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/account/</link>
        <description>Recent content in Account on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 20 Jan 2026 09:00:00 +0100</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/account/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Utenti, gruppi e account</title>
        <link>https://www.matteobianchi.eu/p/utenti-gruppi-account/</link>
        <pubDate>Tue, 20 Jan 2026 09:00:00 +0100</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/utenti-gruppi-account/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/utenti-gruppi-account/cover.png" alt="Featured image of post Utenti, gruppi e account" /&gt;&lt;h2 id=&#34;il-problema&#34;&gt;Il problema
&lt;/h2&gt;&lt;p&gt;Ogni account che può autenticarsi è una porta. Molte di queste porte non servono: account di servizio
creati dai pacchetti, utenti di test mai rimossi, account di ex collaboratori. Un attaccante che fa
bruteforce o riusa credenziali trapelate cerca proprio queste porte dimenticate. Il primo lavoro di
hardening sugli account è &lt;em&gt;sapere chi c&amp;rsquo;è&lt;/em&gt; e &lt;em&gt;chiudere ciò che non deve entrare&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;leggere-passwd-e-shadow&#34;&gt;Leggere passwd e shadow
&lt;/h2&gt;&lt;p&gt;Gli account vivono in due file. &lt;code&gt;/etc/passwd&lt;/code&gt; (leggibile da tutti) elenca gli account; &lt;code&gt;/etc/shadow&lt;/code&gt;
(solo root) tiene gli hash delle password e le policy di scadenza.&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;# formato passwd: nome:x:UID:GID:commento:home:shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -E &lt;span class=&#34;s1&#34;&gt;&amp;#39;:[0-9]{4,}:&amp;#39;&lt;/span&gt; /etc/passwd    &lt;span class=&#34;c1&#34;&gt;# account con UID &amp;gt;= 1000 = tipicamente umani&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;getent passwd &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; awk -F: &lt;span class=&#34;s1&#34;&gt;&amp;#39;$3&amp;gt;=1000 &amp;amp;&amp;amp; $3&amp;lt;65534 {print $1, $3, $7}&amp;#39;&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 campo chiave per la sicurezza è l&amp;rsquo;ultimo: la &lt;strong&gt;shell&lt;/strong&gt;. Un account di servizio non deve avere una
shell interattiva.&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;&lt;span class=&#34;c1&#34;&gt;# account di sistema (UID &amp;lt; 1000) che però hanno una shell di login = sospetto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;awk -F: &lt;span class=&#34;s1&#34;&gt;&amp;#39;$3&amp;lt;1000 &amp;amp;&amp;amp; $7 ~ /sh$/ {print $1, $3, $7}&amp;#39;&lt;/span&gt; /etc/passwd
&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;account-di-servizio-niente-login&#34;&gt;Account di servizio: niente login
&lt;/h2&gt;&lt;p&gt;I demoni (nginx, postgres, &amp;hellip;) girano sotto account dedicati che &lt;strong&gt;non devono poter fare login&lt;/strong&gt;. La
shell corretta per loro è &lt;code&gt;/usr/sbin/nologin&lt;/code&gt; (o &lt;code&gt;/bin/false&lt;/code&gt;): se qualcuno prova ad autenticarsi,
viene rifiutato.&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;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;&lt;span class=&#34;c1&#34;&gt;# imposta nologin su un account di servizio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usermod -s /usr/sbin/nologin postgres
&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;# blocca la password di un account (login via password impossibile; la ! in shadow)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;passwd -l nomeutente
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;passwd -S nomeutente          &lt;span class=&#34;c1&#34;&gt;# stato: L = locked, P = password set, NP = nessuna password&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;Attenzione a &lt;code&gt;NP&lt;/code&gt; (nessuna password): un account senza password che accetta login è un buco grave.&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;&lt;span class=&#34;c1&#34;&gt;# trova account con password VUOTA (gravissimo)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;awk -F: &lt;span class=&#34;s1&#34;&gt;&amp;#39;($2==&amp;#34;&amp;#34;){print $1&amp;#34; NON ha password!&amp;#34;}&amp;#39;&lt;/span&gt; /etc/shadow
&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;scadenza-e-policy&#34;&gt;Scadenza e policy
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;chage&lt;/code&gt; gestisce la vita di una password: scadenza, intervallo minimo/massimo, avviso. Non abusarne
(password che scadono troppo spesso spingono a sceglierne di deboli), ma su account sensibili serve.&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;chage -l matteo                 &lt;span class=&#34;c1&#34;&gt;# mostra le date di scadenza&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chage -M &lt;span class=&#34;m&#34;&gt;365&lt;/span&gt; -W &lt;span class=&#34;m&#34;&gt;14&lt;/span&gt; matteo       &lt;span class=&#34;c1&#34;&gt;# max 365 giorni, avviso 14 giorni prima&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;mantenere-pulito-lelenco&#34;&gt;Mantenere pulito l&amp;rsquo;elenco
&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;/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;Controlli periodici sugli account:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - chi ha UID 0 oltre a root? (NON dovrebbe essercene nessun altro)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - chi appartiene ai gruppi potenti: sudo/wheel, docker, adm?
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - ci sono account di persone che non ci sono più?
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - ci sono account senza password o con shell dove non serve?
&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;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;/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;# chi altro ha UID 0 (= poteri di root)? deve stampare solo &amp;#34;root&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;awk -F: &lt;span class=&#34;s1&#34;&gt;&amp;#39;$3==0 {print $1}&amp;#39;&lt;/span&gt; /etc/passwd
&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;# membri del gruppo che garantisce sudo (sudo su Debian, wheel su RHEL)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;getent group sudo wheel docker
&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 gruppo &lt;strong&gt;docker&lt;/strong&gt; merita una nota: chi vi appartiene può, di fatto, diventare root (montando il
filesystem host in un container). Trattalo come appartenenza a wheel/sudo.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; gli account di servizio li crea il gestore pacchetti già configurati con nologin. Perché controllarli a mano se la distribuzione fa la cosa giusta di default?&lt;/summary&gt;
&lt;p&gt;Perché &#34;di default&#34; copre il caso pulito ma non la realtà di un sistema vissuto, ed è proprio nelle
deviazioni dal default che si annidano i problemi. Primo, non tutti i pacchetti sono scrupolosi: software
di terze parti, script di installazione scaricati, vecchi pacchetti o configurazioni ereditate possono
creare account con shell di login &#34;perché era comodo durante lo sviluppo&#34;. Secondo, i sistemi cambiano
mano: un account creato nologin può essere modificato nel tempo — qualcuno gli dà una shell per fare
debug e non la toglie, un ripristino da backup riporta una vecchia configurazione, una migrazione copia
account senza rivederli. Terzo, il controllo non serve solo a trovare l&#39;errore del packager, ma a
mantenere una &lt;em&gt;baseline&lt;/em&gt;: sapere esattamente quali account esistono e quali possono autenticarsi è
ciò che ti permette di accorgerti se ne compare uno nuovo e inatteso — che è uno dei segni classici di
una compromissione (un attaccante che si crea un account di persistenza). Non stai sfiduciando la
distribuzione: stai costruendo la conoscenza di &#34;cosa è normale&#34; sul &lt;em&gt;tuo&lt;/em&gt; sistema, senza la quale
non puoi riconoscere l&#39;anomalia. Il comando che elenca gli UID 0 o gli account senza password costa
secondi e va messo tra i controlli periodici proprio perché l&#39;unico momento in cui scopri un account di
troppo non dev&#39;essere dopo che è stato usato contro di te.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Sapere quali account esistono, dare &lt;code&gt;nologin&lt;/code&gt; ai servizi, bloccare le password inutili, sorvegliare chi
ha UID 0 e le appartenenze a gruppi potenti: è l&amp;rsquo;igiene base degli accessi. Ma decidere &lt;em&gt;chi può
entrare&lt;/em&gt; è metà del lavoro; l&amp;rsquo;altra metà è cosa ciascuno può &lt;em&gt;toccare&lt;/em&gt; una volta dentro — i &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/permessi-dei-file/&#34; &gt;permessi
dei file&lt;/a&gt;, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
