<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>PAM on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/pam/</link>
        <description>Recent content in PAM on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 24 Feb 2026 09:00:00 +0100</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/pam/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Autenticazione e PAM</title>
        <link>https://www.matteobianchi.eu/p/autenticazione-pam/</link>
        <pubDate>Tue, 24 Feb 2026 09:00:00 +0100</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/autenticazione-pam/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/autenticazione-pam/cover.png" alt="Featured image of post Autenticazione e PAM" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;login&lt;/code&gt;, &lt;code&gt;sshd&lt;/code&gt;, &lt;code&gt;sudo&lt;/code&gt;, &lt;code&gt;su&lt;/code&gt;, lo screen lock: tutti devono autenticare un utente, ma nessuno di loro
implementa l&amp;rsquo;autenticazione. La delegano a &lt;strong&gt;PAM (Pluggable Authentication Modules)&lt;/strong&gt;. Questo significa
che puoi cambiare &lt;em&gt;come&lt;/em&gt; il sistema autentica — imporre password robuste, bloccare dopo troppi
tentativi, aggiungere un secondo fattore — modificando PAM una volta, e la regola vale per tutti i
programmi insieme. È il punto di controllo centrale dell&amp;rsquo;autenticazione.&lt;/p&gt;
&lt;h2 id=&#34;come-è-fatto-uno-stack-pam&#34;&gt;Come è fatto uno stack PAM
&lt;/h2&gt;&lt;p&gt;I file stanno in &lt;code&gt;/etc/pam.d/&lt;/code&gt;, uno per servizio (&lt;code&gt;sshd&lt;/code&gt;, &lt;code&gt;login&lt;/code&gt;, &lt;code&gt;sudo&lt;/code&gt;, &lt;code&gt;common-*&lt;/code&gt; su Debian,
&lt;code&gt;system-auth&lt;/code&gt; su RHEL). Ogni riga è: &lt;strong&gt;tipo  controllo  modulo  argomenti&lt;/strong&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;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;/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;# i quattro TIPI (gruppi di gestione):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth      → verifica l&amp;#39;identità (password, chiave, token)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;account   → l&amp;#39;account è valido/abilitato/non scaduto?
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;password  → regole per CAMBIARE la password
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;session   → cosa fare all&amp;#39;apertura/chiusura di sessione (limiti, log, mount)
&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 &lt;strong&gt;controllo&lt;/strong&gt; decide il peso di ogni modulo: &lt;code&gt;required&lt;/code&gt; (deve passare, ma continua), &lt;code&gt;requisite&lt;/code&gt;
(deve passare, altrimenti stop), &lt;code&gt;sufficient&lt;/code&gt; (se passa, basta), &lt;code&gt;optional&lt;/code&gt;. L&amp;rsquo;ordine conta: gli stack
si leggono dall&amp;rsquo;alto in basso.&lt;/p&gt;
&lt;h2 id=&#34;password-robuste-con-pwquality&#34;&gt;Password robuste con pwquality
&lt;/h2&gt;&lt;p&gt;Il modulo &lt;code&gt;pam_pwquality&lt;/code&gt; impone requisiti alle nuove password (lunghezza, classi di caratteri, non
basate su parole del dizionario).&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;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&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# /etc/security/pwquality.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;minlen = 14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;minclass = 3          # almeno 3 tra: minuscole, maiuscole, cifre, simboli
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dictcheck = 1         # rifiuta password basate su parole comuni
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;retry = 3
&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 logica moderna: &lt;strong&gt;lunghezza &amp;gt; complessità&lt;/strong&gt;. Una passphrase lunga batte una password corta e
contorta, ed è più facile da ricordare (quindi non finisce su un post-it).&lt;/p&gt;
&lt;h2 id=&#34;bloccare-i-bruteforce-locali-con-faillock&#34;&gt;Bloccare i bruteforce locali con faillock
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pam_faillock&lt;/code&gt; blocca un account dopo N tentativi falliti — difesa contro il bruteforce di &lt;code&gt;login&lt;/code&gt;,
&lt;code&gt;su&lt;/code&gt;, console.&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;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&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# /etc/security/faillock.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deny = 5              # blocca dopo 5 fallimenti
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unlock_time = 900     # per 15 minuti
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fail_interval = 900   # conteggiati entro 15 min
&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;/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;faillock --user matteo              &lt;span class=&#34;c1&#34;&gt;# quanti fallimenti ha accumulato&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;faillock --user matteo --reset      &lt;span class=&#34;c1&#34;&gt;# sblocca manualmente&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;limiti-di-sessione&#34;&gt;Limiti di sessione
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pam_limits&lt;/code&gt; (via &lt;code&gt;/etc/security/limits.conf&lt;/code&gt;) impone tetti alle risorse per utente — una difesa contro
esaurimento di risorse e fork bomb.&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;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&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# /etc/security/limits.conf   (dominio  tipo  elemento  valore)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*           hard    nproc     2048      # max processi per utente
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*           hard    nofile    8192      # max file aperti
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@developers soft    core      0         # niente core dump per il gruppo developers
&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;secondo-fattore-cenno&#34;&gt;Secondo fattore (cenno)
&lt;/h2&gt;&lt;p&gt;PAM è anche dove si innesta la 2FA: &lt;code&gt;pam_google_authenticator&lt;/code&gt; aggiunge un codice TOTP allo stack
&lt;code&gt;auth&lt;/code&gt; di &lt;code&gt;sshd&lt;/code&gt;, così entrare richiede &lt;em&gt;chiave + codice&lt;/em&gt;. È il modo di combinare l&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/hardening-ssh/&#34; &gt;SSH a
chiave&lt;/a&gt; con un secondo fattore.&lt;/p&gt;
&lt;h2 id=&#34;la-regola-doro-non-chiuderti-fuori&#34;&gt;La regola d&amp;rsquo;oro: non chiuderti fuori
&lt;/h2&gt;&lt;p&gt;Un errore nello stack &lt;code&gt;auth&lt;/code&gt; può impedire &lt;em&gt;qualsiasi&lt;/em&gt; login, incluso root. Testa sempre in una sessione
nuova tenendone una aperta, e sappi dove sono i backup dei file PAM.&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;/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;# rete di sicurezza:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tieni una sessione root aperta mentre modifichi, e un backup: cp -a /etc/pam.d /etc/pam.d.bak
&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;PAM è il punto unico da cui governare qualità password, blocco dopo i fallimenti, limiti di sessione e
secondo fattore — cambi lì, vale per tutti. Chiusi gli accessi (account, permessi, sudo, SSH, PAM),
l&amp;rsquo;attenzione si sposta su ciò che &lt;em&gt;gira&lt;/em&gt; sul sistema: i servizi. E in Linux moderno i servizi sono
gestiti da systemd — &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/systemd-servizi-e-unit/&#34; &gt;servizi e unit&lt;/a&gt;, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
