<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ssh &amp;mdash; Cyberdyne Systems</title>
    <link>https://noblogo.org/aytin/tag:ssh</link>
    <description>&#34;Fare o non fare. Non c&#39;è provare!&#34;</description>
    <pubDate>Thu, 30 Apr 2026 10:13:01 +0000</pubDate>
    <item>
      <title>Abilitare la 2FA in ssh</title>
      <link>https://noblogo.org/aytin/abilitare-la-2fa-in-ssh</link>
      <description>&lt;![CDATA[lock&#xA;smalliFonte:  Foto di Life Of Pix da a href=&#34;https://www.pexels.com/it-it/foto/lucchetto-in-metallo-color-ottone-con-catena-4291/&#34;Pexels.com/a/i/small&#xA;Cosa si intende per 2FA&#xA;&#xA;Attivare la 2FA è sempre una buona pratica per mitigare attacchi di tipo brute-force.&#xA;Perché non farlo pure per ssh, soprattutto se lo si usa nel bastion host per accedere alla nostra lan?&#xA;Da letteratura, la 2FA consiste nel fornire 2 fattori di autenticazione fra:&#xA;!--more--&#xA;&#xA;qualcosa che sai (ad es. una password o un pin)&#xA;qualcosa che hai (ad es. un otp)&#xA;qualcosa che sei (ad es. un rilievo biometrico)&#xA;&#xA;Se i fattori sono più di due, si parla di Multi Factor Authentication (MFA).&#xA;&#xA;Non entro nel merito della configurazione di un servizio ssh , che non è banale. La diamo per scontata, ci concentriamo sulla parte di autenticazione.&#xA;Metodi di autenticazione&#xA;&#xA;La buona norma vorrebbe che un&#39;autenticazione su un server openssh si limitasse all&#39;autenticazione con chiave pubblica. Su alcune distro ad es. è l&#39;unica disponibile di default.&#xA;Ma non basta una buona autenticazione per garantire la sicurezza di un servizio come SSH. Occorrerebbe intervenire su ben altri aspetti perché altrimenti sarebbe come preoccuparsi della bontà della porta blindata per la nostra casa dalle pareti di cartone.&#xA;&#xA;I parametri del file di configurazione che andrò a trattare riguardano le modalità di autenticazione di ssh. La versione che sto usando su debian bullseye è la 8.4p1.&#xA;Queste sono:&#xA;&#xA;password&#xA;publickey&#xA;keyboard-interactive&#xA;gssapi-with-mic&#xA;hostbased&#xA;none&#xA;&#xA;Le prime 3 sono quelle che ci interessano sul serio.&#xA;&#xA;Con ssh posso avere:&#xA;&#xA;una 2FA (ad es. publickey + password)&#xA;una MFA (ad es. publickey (qualcosa che sei) + password (qualcosa che sai) + OTP (qualcosa che hai) , se ipotizziamo publickey, in quanto certificato digitale, assimilabile al rilievo biometrico).&#xA;&#xA;Per realizzare i due scenari c&#39;è bisogno di settare con attenzione ssh per non rischiare di lasciare voragini invece che mettere in sicurezza il servizio.&#xA;&#xA;Suppongo che ssh sia già settato come si deve, ciò che andrò a toccare sarà:&#xA;&#xA;UsePAM&#xA;  Abilita o meno l&#39;uso di PAM&#xA;ChallengeResponseAuthentication (KbdInteractiveAuthentication dalla 8.8)&#xA;  Permette di applicare lo schema Challenge-Response per l&#39;autenticazione&#xA;PublicKeyAuthentication&#xA;  Abilita o meno l&#39;autenticazione con chiave pubblica&#xA;PasswordAutentication&#xA;  Abilita o meno l&#39;autenticazione con password&#xA;AuthenticationMethods&#xA;È la lista  (l&#39;elenco precedente) dei metodi di autenticazione che vogliamo permettere.&#xA;Se gli elementi sono separati da una virgola, vuol dire che sono tutti obbligatori (per avere un&#39;autenticazione multipla per es.).&#xA;Se sono separati da uno spazio, vuol dire che sono facoltativi.&#xA;Es. publickey,password password publickey,password,keyboard-interactive. &#xA;Vuol dire che mi posso autenticare fornendo chiave e password oppure password oppure chiave+password+otp&#xA;È abbastanza chiaro che una configurazione del genere può essere molto pericolosa perché il suo livello di robustezza dipende dal suo anello più debole (la password in questo caso) che può vanificare tutti gli altri.&#xA;&#xA;Ogni modifica del file di configurazione richiederà il a id=&#34;restart&#34;restart/a del servizio ssh.&#xA;systemctl restart sshd.service&#xA;PAM&#xA;&#xA;Com&#39;è noto, e banalizzando molto, PAM è un sottosistema gnu/linux che fornisce un livello di astrazione a quelle applicazioni, come ssh, che richiedono autenticazione. In questo modo le applicazioni non hanno bisogno di implementarle esplicitamente e, volendo, possono estendere i propri schemi di autenticazione aumentandone la complessità in maniera relativamente semplice.&#xA;&#xA;PAM, insieme ad una autenticazione di tipo challenge-response, ci permetterà di ottenere un&#39;autenticazione multipla.&#xA;Scenario 1: Configurazione sicura (chiave pubblica)&#xA;&#xA;In molti contesti si preferisce abilitare la sola autenticazione con chiave pubblica, proprio per evitare possibili falle. Niente PAM in questo caso ma solo configurazione ssh:&#xA;...&#xA;UsePAM=no&#xA;ChallengeResponseAuthentication=no&#xA;PublicKeyAuthentication=yes&#xA;PasswordAuthentication=no&#xA;AuthenticationMethods=publickey&#xA;...&#xA;PAM viene disabilitato perché scegliamo di non affidarci a librerie di autenticazione esterne. Inoltre, in casi estremi, si può pensare che un aggiornamento di PAM possa rompere la compatibilità con qualche libreria invalidando o indebolendo il processo di autenticazione.&#xA;&#xA;Di conseguenza, niente autenticazione di tipo challenge-response, niente autenticazione con password.&#xA;&#xA;Attiviamo solo la PublicKeyAuthentication rafforzando la scelta in AuthenticationMethods dove impostiamo come unico metodo valido publickey. Infine, a href=&#34;#restart&#34;riavviamo/a il servizio.&#xA;&#xA;L&#39;unico modo per accedere al server ssh è possedere una chiave (o un certificato) valida.&#xA;&#xA;Scenario 2: 2FA (chiave pubblica + password)&#xA;&#xA;Facciamo un passo in più è facciamo in modo che l&#39;accesso al server sia consentito solo a chi possiede sia chiave che password.&#xA;&#xA;...&#xA;UsePAM=no&#xA;ChallengeResponseAuthentication=no&#xA;PublicKeyAuthentication=yes&#xA;PasswordAuthentication=yes&#xA;AuthenticationMethods=publickey,password&#xA;...&#xA;Oltre che specificare il tipo di autenticazione (PublickeyAutentication e PasswordAuthentication), imponiamo che il metodo sia quello di esibire entrambe le credenziali.&#xA;&#xA;Non impostando AutenticationMethods, varrebbe il default che prevede uno fra password, publickey o keyboard-interactive.&#xA;&#xA;L&#39;ultimo sarebbe comunque inutile in questo caso, visto che pam e challenge-response sono disabilitati. Ma non avremmo ottenuto ciò che ci eravamo prefissati.&#xA;&#xA;Una a id=&#34;scenario-2-pam&#34;configurazione analoga/a è la seguente:&#xA;...&#xA;UsePAM=yes&#xA;ChallengeResponseAuthentication=yes&#xA;PublicKeyAuthentication=yes&#xA;PasswordAuthentication=no&#xA;AuthenticationMethods=publickey,keyboard-interactive&#xA;...&#xA;a href=&#34;#restart&#34;Riavviamo/a ssh e la nuova autenticazione sarà disponibile come al solito.&#xA;&#xA;È un esempio di come posso usare PAM per rimpiazzare la PasswordAuthentication nativa.&#xA;Con una combinazione di PAM e autenticazione challenge-response, attraverso il metodo esplicito keyboard-interactive, l&#39;applicazione autenticherà con un&#39;unica sfida che è la richiesta di password.&#xA;&#xA;Con PAM posso aggiungere altro, ad es. l&#39;otp, come vedremo nel 3° scenario.&#xA;Scenario 3: MFA (chiave pubblica + password + otp)&#xA;&#xA;Lasciamo inalterata la configurazione ssh a href=&#34;#scenario-2-pam&#34;dello scenario 2/a, quella che fa uso di pam.&#xA;Bisogna innanzittutto installare il plugin per l&#39;otp.&#xA;&#xA;Sistemi debian-based:&#xA;apt install libpam-google-authenticator&#xA;&#xA;Sistemi rpm-based:&#xA;dnf install google-authenticator&#xA;&#xA;Per completezza, giusto perché lo uso, MacOS (via brew):&#xA;brew install google-authenticator-libpam&#xA;&#xA;Dopo l&#39;installazione, il generatore otp va inizializzato lanciando l&#39;eseguibile che porrà una serie di domande:&#xA;&#xA;generare i token su base temporale: Y/N (consigliato Y)&#xA;creare un file di configurazione nella home dell&#39;utente: Y/N (consigliato Y)&#xA;disabilitare la possibilità che un token possa essere usato più volte: Y/N (consigliato Y)&#xA;(semplificando) aumentare la finestra temporale di generazione dei token (default 30s): Y/N (consigliato N, a meno che la connessione fra client e server non sia ESTREMAMENTE lenta)&#xA;abilitare il rate-limit per scoraggiare attacchi di brute-force: Y/N (consigliato Y)&#xA;&#xA;A seguire, verrà mostrato sia il qr-code (per il caricamento automatico della chiave su un authenticator come FreeOtp+) che la chiave privata (se si vuole procedere con la configurazione manuale dell&#39;authenticator o dello script visto tempo fa), necessari per la fornitura del primo codice che inizializza il processo.&#xA;&#xA;Infine configuriamo PAM per sshd.&#xA;In /etc/pam.d/sshd dobbiamo imporre che il processo di autorizzazione includa obbligatoriamente l&#39;otp. Lo faremo aggiungendo una riga contenente il riferimento alla libreria che lo  implementa:&#xA;auth required pamgoogleauthenticator.so&#xA;Il solito a href=&#34;#restart&#34;riavvio/a di ssh (alcuni consigliano anche di fare il reboot della macchina per inizializzare correttamente il generatore di otp ma non ho trovato una giustificazione convincente del perché) completa il lavoro.&#xA;&#xA;Per autenticarsi sul server ssh ora serviranno:&#xA;&#xA;chiave pubblica&#xA;password&#xA;otp&#xA;&#xA;Scenario 3bis: 2FA (chiave pubblica + otp)&#xA;&#xA;Se invece volessi avere una 2FA come a href=&#34;#scenario-2-pam&#34;nello scenario 2/a, ma con otp invece che con password, posso procedere così.&#xA;Si lascia inalterata la configurazione ssh e si commenta una riga dalla configurazione di PAM:&#xA;&#xA;Su /etc/pam.d/sshd commentare la seguente riga così:&#xA;...&#xA;@include common-auth&#xA;...&#xA;In questo modo, si elimina la richiesta della password utente dalle &#34;sfide&#34; della challenge-response e rimane la sola richiesta otp.&#xA;Tips&#xA;&#xA;Attenzione quando si gioca con i metodi di autenticazione ssh.&#xA;Ci sono buone possibilità che vi autoescludiate dal vostro server.&#xA;Basta avere keyboard-interactive (che implica un&#39;autenticazione di tipo challenge-response) fra i metodi di autenticazione obbligatori e pam disattivato. &#xA;Ecco un esempio:&#xA;...&#xA;usePAM no &#xA;ChallengeResponseAuthentication yes&#xA;PasswordAuthentication no&#xA;PubkeyAuthentication no&#xA;AuthenticationMethods keyboard-interactive&#xA;...&#xA;Oppure, ancora più subdolo, lo scenario 3 con pam disabilitato, ossia:&#xA;configurazione ssh&#xA;...&#xA;usePAM no &#xA;ChallengeResponseAuthentication yes&#xA;PasswordAuthentication no&#xA;PubkeyAuthentication yes&#xA;AuthenticationMethods publickey,keyboard-interactive&#xA;...&#xA;In questi casi, l&#39;autenticazione fallirà con questo errore: &#34;Permission denied (keyboard-interactive)&#34;_ perché non sarà disponibile nessuna interazione da tastiera (es. una password) e noi rimarremmo chiusi irrimediabilmente fuori dal nostro server.&#xA;&#xA;#ssh #otp]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/c537ce87c-f5971d/SlPG8xNlTawi/codfAWO17f4vO48VMakyvf0xahvGEOzb453JEcpm.jpg" alt="lock">
<small><i>Fonte:  Foto di Life Of Pix da <a href="https://www.pexels.com/it-it/foto/lucchetto-in-metallo-color-ottone-con-catena-4291/" rel="nofollow">Pexels.com</a></i></small></p>

<h2 id="cosa-si-intende-per-2fa">Cosa si intende per 2FA</h2>

<p>Attivare la 2FA è sempre una buona pratica per mitigare attacchi di tipo brute-force.
Perché non farlo pure per ssh, soprattutto se lo si usa nel bastion host per accedere alla nostra lan?
Da letteratura, la <strong>2FA</strong> consiste nel fornire 2 fattori di autenticazione fra:
</p>
<ol><li>qualcosa che sai (ad es. una password o un pin)</li>
<li>qualcosa che hai (ad es. un otp)</li>
<li>qualcosa che sei (ad es. un rilievo biometrico)</li></ol>

<p>Se i fattori sono più di due, si parla di <strong>Multi Factor Authentication (MFA)</strong>.</p>

<p>Non entro nel merito della configurazione di un servizio ssh , che non è banale. La diamo per scontata, ci concentriamo sulla parte di autenticazione.</p>

<h2 id="metodi-di-autenticazione">Metodi di autenticazione</h2>

<p>La buona norma vorrebbe che un&#39;autenticazione su un server openssh si limitasse all&#39;<strong>autenticazione con chiave pubblica</strong>. Su alcune distro ad es. è l&#39;unica disponibile di default.
Ma non basta una buona autenticazione per garantire la sicurezza di un servizio come SSH. Occorrerebbe intervenire su ben altri aspetti perché altrimenti sarebbe come preoccuparsi della bontà della porta blindata per la nostra casa dalle pareti di cartone.</p>

<p>I parametri del file di configurazione che andrò a trattare riguardano le <strong>modalità di autenticazione</strong> di ssh. La versione che sto usando su debian bullseye è la 8.4p1.
Queste sono:</p>
<ul><li><em>password</em></li>
<li><em>publickey</em></li>
<li><em>keyboard-interactive</em></li>
<li><em>gssapi-with-mic</em></li>
<li><em>hostbased</em></li>
<li><em>none</em></li></ul>

<p>Le prime 3 sono quelle che ci interessano sul serio.</p>

<p>Con ssh posso avere:</p>
<ol><li>una 2FA (ad es. publickey + password)</li>
<li>una MFA (ad es. publickey (qualcosa che sei) + password (qualcosa che sai) + OTP (qualcosa che hai) , se ipotizziamo publickey, in quanto certificato digitale, assimilabile al rilievo biometrico).</li></ol>

<p>Per realizzare i due scenari c&#39;è bisogno di settare con attenzione ssh per non rischiare di lasciare voragini invece che mettere in sicurezza il servizio.</p>

<p>Suppongo che ssh sia già settato come si deve, ciò che andrò a toccare sarà:</p>
<ul><li><em><strong>UsePAM</strong></em>
Abilita o meno l&#39;uso di PAM</li>
<li><em><strong>ChallengeResponseAuthentication (KbdInteractiveAuthentication dalla 8.8)</strong></em>
Permette di applicare lo schema Challenge-Response per l&#39;autenticazione</li>
<li><em><strong>PublicKeyAuthentication</strong></em>
Abilita o meno l&#39;autenticazione con chiave pubblica</li>
<li><em><strong>PasswordAutentication</strong></em>
Abilita o meno l&#39;autenticazione con password</li>
<li><em><strong>AuthenticationMethods</strong></em>
È la lista  (l&#39;elenco precedente) dei metodi di autenticazione che vogliamo permettere.
Se gli elementi sono separati da una virgola, vuol dire che sono <strong>tutti obbligatori</strong> (per avere un&#39;autenticazione multipla per es.).
Se sono separati da uno spazio, vuol dire che sono <strong>facoltativi</strong>.
Es. <code>publickey,password password publickey,password,keyboard-interactive</code>.
Vuol dire che mi posso autenticare fornendo chiave <strong>e</strong> password <strong>oppure</strong> password <strong>oppure</strong> chiave+password+otp
È abbastanza chiaro che una configurazione del genere può essere molto pericolosa perché il suo livello di robustezza dipende dal suo anello più debole (la password in questo caso) che può vanificare tutti gli altri.</li></ul>

<p>Ogni modifica del file di configurazione richiederà il <a id="restart">restart</a> del servizio ssh.</p>

<pre><code class="language-bash">systemctl restart sshd.service
</code></pre>

<h3 id="pam">PAM</h3>

<p>Com&#39;è noto, e banalizzando molto, PAM è un sottosistema gnu/linux che fornisce un livello di astrazione a quelle applicazioni, come ssh, che richiedono autenticazione. In questo modo le applicazioni non hanno bisogno di implementarle esplicitamente e, volendo, possono estendere i propri schemi di autenticazione aumentandone la complessità in maniera relativamente semplice.</p>

<p>PAM, insieme ad una autenticazione di tipo challenge-response, ci permetterà di ottenere un&#39;autenticazione multipla.</p>

<h2 id="scenario-1-configurazione-sicura-chiave-pubblica">Scenario 1: Configurazione sicura (chiave pubblica)</h2>

<p>In molti contesti si preferisce abilitare la sola autenticazione con chiave pubblica, proprio per evitare possibili falle. Niente PAM in questo caso ma solo configurazione ssh:</p>

<pre><code>...
UsePAM=no
ChallengeResponseAuthentication=no
PublicKeyAuthentication=yes
PasswordAuthentication=no
AuthenticationMethods=publickey
...
</code></pre>

<p>PAM viene disabilitato perché scegliamo di non affidarci a librerie di autenticazione esterne. Inoltre, in casi estremi, si può pensare che un aggiornamento di PAM possa rompere la compatibilità con qualche libreria invalidando o indebolendo il processo di autenticazione.</p>

<p>Di conseguenza, niente autenticazione di tipo challenge-response, niente autenticazione con password.</p>

<p>Attiviamo solo la <em>PublicKeyAuthentication</em> rafforzando la scelta in <em>AuthenticationMethods</em> dove impostiamo come unico metodo valido <em>publickey</em>. Infine, <a href="#restart" rel="nofollow">riavviamo</a> il servizio.</p>

<p>L&#39;unico modo per accedere al server ssh è possedere una chiave (o un certificato) valida.</p>

<h2 id="scenario-2-2fa-chiave-pubblica-password">Scenario 2: 2FA (chiave pubblica + password)</h2>

<p>Facciamo un passo in più è facciamo in modo che l&#39;accesso al server sia consentito solo a chi possiede sia chiave che password.</p>

<pre><code>...
UsePAM=no
ChallengeResponseAuthentication=no
PublicKeyAuthentication=yes
PasswordAuthentication=yes
AuthenticationMethods=publickey,password
...
</code></pre>

<p>Oltre che specificare il <strong>tipo</strong> di autenticazione (<em>PublickeyAutentication</em> e <em>PasswordAuthentication</em>), imponiamo che il metodo sia quello di esibire <strong>entrambe</strong> le credenziali.</p>

<p>Non impostando <em>AutenticationMethods</em>, varrebbe il default che prevede <strong>uno</strong> fra password, publickey o keyboard-interactive.</p>

<p>L&#39;ultimo sarebbe comunque inutile in questo caso, visto che pam e challenge-response sono disabilitati. Ma non avremmo ottenuto ciò che ci eravamo prefissati.</p>

<p>Una <a id="scenario-2-pam">configurazione analoga</a> è la seguente:</p>

<pre><code>...
UsePAM=yes
ChallengeResponseAuthentication=yes
PublicKeyAuthentication=yes
PasswordAuthentication=no
AuthenticationMethods=publickey,keyboard-interactive
...
</code></pre>

<p><a href="#restart" rel="nofollow">Riavviamo</a> ssh e la nuova autenticazione sarà disponibile come al solito.</p>

<p>È un esempio di come posso usare PAM per rimpiazzare la <em>PasswordAuthentication</em> nativa.
Con una combinazione di PAM e autenticazione challenge-response, attraverso il metodo esplicito <em>keyboard-interactive</em>, l&#39;applicazione autenticherà con un&#39;unica sfida che è la richiesta di password.</p>

<p>Con PAM posso aggiungere altro, ad es. l&#39;otp, come vedremo nel 3° scenario.</p>

<h2 id="scenario-3-mfa-chiave-pubblica-password-otp">Scenario 3: MFA (chiave pubblica + password + otp)</h2>

<p>Lasciamo inalterata la configurazione ssh <a href="#scenario-2-pam" rel="nofollow">dello scenario 2</a>, quella che fa uso di pam.
Bisogna innanzittutto installare il plugin per l&#39;otp.</p>

<p>Sistemi debian-based:</p>

<pre><code class="language-bash">apt install libpam-google-authenticator
</code></pre>

<p>Sistemi rpm-based:</p>

<pre><code class="language-bash">dnf install google-authenticator
</code></pre>

<p>Per completezza, giusto perché lo uso, MacOS (via brew):</p>

<pre><code class="language-bash">brew install google-authenticator-libpam
</code></pre>

<p>Dopo l&#39;installazione, il generatore otp va inizializzato lanciando l&#39;eseguibile che porrà una serie di domande:</p>
<ul><li>generare i token su base temporale: Y/N (consigliato <strong>Y</strong>)</li>
<li>creare un file di configurazione nella home dell&#39;utente: Y/N (consigliato <strong>Y</strong>)</li>
<li>disabilitare la possibilità che un token possa essere usato più volte: Y/N (consigliato <strong>Y</strong>)</li>
<li>(semplificando) aumentare la finestra temporale di generazione dei token (default 30s): Y/N (consigliato <strong>N</strong>, a meno che la connessione fra client e server non sia <strong>ESTREMAMENTE</strong> lenta)</li>
<li>abilitare il rate-limit per scoraggiare attacchi di brute-force: Y/N (consigliato <strong>Y</strong>)</li></ul>

<p>A seguire, verrà mostrato sia il qr-code (per il caricamento automatico della chiave su un authenticator come <strong><a href="https://f-droid.org/it/packages/org.liberty.android.freeotpplus/" rel="nofollow">FreeOtp+</a></strong>) che la chiave privata (se si vuole procedere con la configurazione manuale dell&#39;authenticator o dello <a href="https://noblogo.org/aytin/generazione-otp-via-bash" rel="nofollow">script visto tempo fa</a>), necessari per la fornitura del primo codice che inizializza il processo.</p>

<p>Infine configuriamo PAM per sshd.
In /etc/pam.d/sshd dobbiamo imporre che il processo di autorizzazione <strong>includa obbligatoriamente</strong> l&#39;otp. Lo faremo aggiungendo una riga contenente il riferimento alla libreria che lo  implementa:</p>

<pre><code>auth required pam_google_authenticator.so
</code></pre>

<p>Il solito <a href="#restart" rel="nofollow">riavvio</a> di ssh (alcuni consigliano anche di fare il reboot della macchina per inizializzare correttamente il generatore di otp ma non ho trovato una giustificazione convincente del perché) completa il lavoro.</p>

<p>Per autenticarsi sul server ssh ora serviranno:</p>
<ul><li>chiave pubblica</li>
<li>password</li>
<li>otp</li></ul>

<h1 id="scenario-3bis-2fa-chiave-pubblica-otp">Scenario 3bis: 2FA (chiave pubblica + otp)</h1>

<p>Se invece volessi avere una 2FA come <a href="#scenario-2-pam" rel="nofollow">nello scenario 2</a>, ma con otp invece che con password, posso procedere così.
Si lascia inalterata la configurazione ssh e si commenta una riga dalla configurazione di PAM:</p>

<p>Su /etc/pam.d/sshd commentare la seguente riga così:</p>

<pre><code>...
#@include common-auth
...
</code></pre>

<p>In questo modo, si elimina la richiesta della password utente dalle “sfide” della challenge-response e rimane la sola richiesta otp.</p>

<h2 id="tips">Tips</h2>

<p>Attenzione quando si gioca con i metodi di autenticazione ssh.
Ci sono buone possibilità che vi autoescludiate dal vostro server.
Basta avere <em>keyboard-interactive</em> (che implica un&#39;autenticazione di tipo challenge-response) fra i metodi di autenticazione obbligatori e pam disattivato.
Ecco un esempio:</p>

<pre><code>...
usePAM no 
ChallengeResponseAuthentication yes
PasswordAuthentication no
PubkeyAuthentication no
AuthenticationMethods keyboard-interactive
...
</code></pre>

<p>Oppure, ancora più subdolo, lo scenario 3 con pam disabilitato, ossia:
<strong>configurazione ssh</strong></p>

<pre><code>...
usePAM no 
ChallengeResponseAuthentication yes
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
...
</code></pre>

<p>In questi casi, l&#39;autenticazione fallirà con questo errore: <em>“Permission denied (keyboard-interactive)”</em> perché non sarà disponibile <strong>nessuna</strong> interazione da tastiera (es. una password) e noi rimarremmo chiusi irrimediabilmente fuori dal nostro server.</p>

<p><a href="/aytin/tag:ssh" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ssh</span></a> <a href="/aytin/tag:otp" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">otp</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/abilitare-la-2fa-in-ssh</guid>
      <pubDate>Thu, 18 May 2023 15:57:05 +0000</pubDate>
    </item>
    <item>
      <title>Stunnel: Cos&#39;è e come si configura</title>
      <link>https://noblogo.org/aytin/stunnel-cose-e-come-si-configura</link>
      <description>&lt;![CDATA[(pubblicato il 7 gennaio 2023)&#xA;Stunnel&#xA;smalliFonte: a href=&#34;https://www.stunnel.org&#34;stunnel.org/a/i/small&#xA;&#xA;Introduzione&#xA;&#xA;Da documentazione, Stunnel agisce come un proxy per aggiungere crittografia TLS a server e/o a client già esistenti.&#xA;&#xA;Risulta quindi molto comodo quando si vuole aggiungere, attraverso un tunnel TLS, quella crittografia che manca alle nostre applicazioni per rendere le comunicazioni più sicure.&#xA;!--more--&#xA;Come in ssh, è possibile “tunnellizzare” solo connessioni TCP.&#xA;&#xA;Di stunnel esaminerò in particolare la fase di autenticazione attraverso certificato o PSK.&#xA;&#xA;Gli scenari possibili, in base alle combinazioni, sono tre:&#xA;&#xA;client tls – server in chiaro&#xA;client in chiaro – server tls&#xA;client e server in chiaro&#xA;&#xA;Nel primo caso, occorre configurare stunnel in server mode, definendo un receiver ssl, a cui il client potrà connettersi.&#xA;stunel server&#xA;smalliScenario 1: stunnel server/i/small&#xA;&#xA;Nel secondo caso, occorre configurare stunnel in client mode, definendo un sender ssl che il client userà per connettersi al server&#xA;stunnel client&#xA;smalliScenario 2: stunnel client/i/small&#xA;&#xA;Nel terzo caso, occorre configurare uno stunnel client e uno server&#xA;stunnel client e server&#xA;smalliScenario 3: stunnel client e server/i/small&#xA;&#xA;Come ulteriore evoluzione per quel che riguarda le tratte in chiaro (e non solo) di client-stunnel client, stunnel client-stunnel server, stunnel server-server, sarebbe buona norma limitarne l’accesso con un firewall.&#xA;stunnel client e server e firewall&#xA;smalliStunnel e firewall/i/small&#xA;&#xA;Se invece stunnel fosse locale (installato direttamente sul client e/o sul server), la richiesta del client o il listener del servizio, avverrebbero sull’interfaccia di loopback.&#xA;Altrimenti, in assenza di firewall, sarebbe consigliabile accertare che la rete di collegamento fra i proxy stunnel e i rispettivi client/server, sia almeno di tipo “trusted”.&#xA;&#xA;Stunnel consente un certo tuning sulla parte tls, potendo discriminare fra le cipher suites da abilitare, specificare comandi o configurazioni specifiche per openssl.&#xA;Quando si deve incapsulare una connessione in chiaro in un tunnel ssl bisogna tenere presente gli scenari menzionati prima.&#xA;Convenzioni&#xA;&#xA;Per non perdere generalità, negli esempi che seguiranno, immaginiamo che stunnel non sia locale (anche se spesso lo è).&#xA;   se stunnel in client mode è locale ⇒ accept avverrà sull’interfaccia di loopback, da dove avviene effettivamente la richiesta&#xA;   se stunnel in server mode è locale ⇒ connect avverrà sull’interfaccia di loopback, dove viene erogato effettivamente il servizio&#xA;Non faremo assunzioni sulla creazione dei certificati. Possono anche essere self-signed.&#xA;&#xA;Configurazione stunnel&#xA;&#xA;Verranno mostrate le configurazioni relative agli scenari mostrati nel modo più semplice possibile.&#xA;&#xA;accept: host e porta che ricevono la richiesta&#xA;connect: host e porta a cui girare l’accept&#xA;cert: normalmente conterrebbe il certificato pubblico che stunnel espone per autenticarsi (la parte privata viene specificata con key). Può però anche essere costituito da tutta i certificati della chain fino alla root CA, in formato pem o p12, iniziando dalla chiave privata, proseguendo con la chiave pubblica, fino a tutte le CA della chain.&#xA;key: chiave privata del certificato&#xA;client: stabilisce se stunnel funzioni in server mode oppure no&#xA;&#xA;Primo scenario&#xA;&#xA;Nel primo caso, una configurazione minimale lato server, ha bisogno:&#xA;&#xA;host e porta dello stunnel server che riceve il traffico cifrato&#xA;host e porta del server su cui girare il traffico in chiaro&#xA;certificato pubblico e chiave privata necessari per la cifratura&#xA;&#xA;Stunnel Server:&#xA;[myService]&#xA;accept = ipstunnelserver:portsts&#xA;connect = ipserver:portserver&#xA;cert = /servercrt.pembr&#xA;key = /serverkey.pem&#xA;Secondo scenario&#xA;&#xA;Nel secondo caso, una configurazione minimale lato client, ha bisogno:&#xA;&#xA;host e porta dello stunnel client da cui partirà la richiesta&#xA;host e porta del server da cui stunnel client avvierà la sessione tls&#xA;&#xA;Stunnel Client:&#xA;[myService]&#xA;client = yes&#xA;accept = ipstunnelclient:portstc&#xA;connect = ipserver:portserver&#xA;Terzo Scenario&#xA;&#xA;Il terzo caso, è una fusione dei primi due. Sono gli stunnel a gestire il grosso della comunicazione. E nei casi in cui lo stunnel viene installato sulle macchine di servizio, client e server reali usano solo l’interfaccia di loopback.&#xA;&#xA;Una configurazione minimale per il client ha bisogno di:&#xA;&#xA;host e porta dello stunnel client da cui partirà la richiesta&#xA;host e porta del server da cui stunnel client avvierà la sessione tls&#xA;&#xA;Stunnel Client:&#xA;[myService]&#xA;client = yes&#xA;accept = ipstunnelclient:portstc&#xA;connect = ipstunnelserver:portserver&#xA;Una configurazione minimale per il server ha bisogno:&#xA;&#xA;host e porta dello stunnel server che riceve il traffico cifrato&#xA;host e porta del server su cui girare il traffico in chiaro&#xA;    certificato pubblicato e chiave privata necessari per la cifratura&#xA;&#xA;Stunnel Server:&#xA;[myService]&#xA;accept = ipstunnelserver:portsts&#xA;connect = ipserver:portserver&#xA;cert = /servercrt.pem&#xA;key = /serverkey.pem&#xA;smallPiccola nota: se client e/o server dovessero supportare chiavi PSK, si potrebbe usare PSK in luogo dei certificati. Ci ritornerò più avanti./small&#xA;&#xA;Autenticazione dei client&#xA;&#xA;Le impostazioni viste finora, mostrano come incapsulare un traffico in chiaro all’interno di un tunnel tls e si basano sulla sola autenticazione lato server.&#xA;&#xA;Per migliorare la configurazione possiamo ricorrere alla mutua autenticazione facendo in modo che anche i client si autentichino.&#xA;&#xA;Una mutua autenticazione, con tutte le verifiche del caso, aumenta il grado di sicurezza comunicazione TLS ed è un efficace deterrente contro eventuali attacchi MITM. L’autenticazione sul client si può ottenere sempre con i certificati oppure, più semplicemente, con chiavi PSK.&#xA;&#xA;Autenticazione dei client con certificato&#xA;&#xA;Ad una configurazione minimale per una mutua autenticazione, lato server, si richiede che i client esibiscano il certificato e i client (che sia stunnel in client mode, un browser o qualunque altra cosa) dovranno essere in grado di esibire i certificati nel momento in cui il server li richiederà.&#xA;&#xA;Su stunnel server, alle configurazioni viste in precedenza, si aggiunge requireCert impostato a yes, che richiede ai client l’esibizione di un certificato. Se, durante l’handshake TLS, il client non esibisce un certificato, l’handshake fallisce e la connessione viene rifiutata.&#xA;&#xA;Stunnel Server:&#xA;[myService]&#xA;…&#xA;requireCert = yes&#xA;…&#xA;È sufficiente questo se i client possono manipolare i propri certificati. Altrimenti, se c’è uno stunnel client che intermedia le richieste dei client effettivi, si deve aggiungere alla sua configurazione la chiave e il certificato del client&#xA;&#xA;Stunnel Client:&#xA;[myService]&#xA;…&#xA;cert = /servercrt.pem&#xA;key = /serverkey.pem&#xA;…&#xA;Autenticazione dei client con PSK&#xA;&#xA;Per l’autenticazione PSK bisogna disporre della lista di utenti abilitati con relative chiavi esadecimali di almeno 16 bytes (ossia almeno 32 caratteri esadecimali visto che con un byte si rappresentano due esadecimali).&#xA;&#xA;La creazione di una chiave esadecimale può essere fatta velocemente con openssl.&#xA;Supponiamo di creare due utenze per Frodo e Gandalf con chiavi da 20 e 42 bytes.&#xA;echo -e &#34;frodo:&#34;$(openssl rand -hex 20)   frodopsk.txt&#xA;echo -e &#34;gandalf:&#34;$(openssl rand -hex 42)   gandalfpsk.txt&#xA;Tutte le identità dovranno confluire nel file che, nella configurazione stunnel, sarà indicato da PSKsecrets. Ad es:&#xA;cat frodopsk.txt gandalfpsk.txt   psksecrets.txt&#xA;…&#xA;frodo:84196825fab3389624dcc83eb61189e5b21099febrgandalf:5daf128419855993a2d95ba0a337c51b3f373df88e594441f2979eba6461f25676f1f825b0c76df392f2&#xA;…&#xA;E, come detto, nella configurazione dello stunnel server dovrò indicare il file delle identità:&#xA;&#xA;Stunnel Server&#xA;[myServer]&#xA;accept = ipstunnelserver:portsts&#xA;connect = ipserver:portserver&#xA;PSKsecrets = pathidentityfile/psksecrets.txt&#xA;Se il client supporta PSK, dovrà fornire identità e password. Ad es. facendo un test con openssl:&#xA;openssl sclient -port porta -pskidentity frodo -psk 84196825fab3389624dcc83eb61189e5b21099fe -tls12 -connect host&#xA;Altrimenti si configura stunnel client indicando sia l’identità, sia il file individuate da PSKsecrets.&#xA;&#xA;Stunnel Client&#xA;[myClient]&#xA;client = yes&#xA;accept = ipstunnelclient:portstc&#xA;connect = ipstunnelserver:portserver&#xA;PSKidentity = frodo&#xA;PSKsecrets = pathidentityfile/psksecrets.txt&#xA;In alternativa, per non far viaggiare il file delle identità fra tutti i client, possiamo sfruttare a nostro vantaggio il default delle identità.&#xA;&#xA;In assenza della direttiva PSKidentity, viene assunta come identità di default la prima riga del file indicato da PSKSecrets. Basta quindi creare un file con la sola identità che mi occorre, ad es. frodopsk.txt&#xA;frodo:84196825fab3389624dcc83eb61189e5b21099fe&#xA;e indicare quello in PSKSecrets. La configurazione che segue è equivalente alla precedente.&#xA;&#xA;Stunnel Client&#xA;[myClient]&#xA;client = yes&#xA;accept = ipstunnelclient:portstc&#xA;connect = ipstunnelserver:portserver&#xA;PSKsecrets = pathidentityfile/frodopsk.txt&#xA;Ulteriori considerazioni di sicurezza&#xA;Autenticazione con certificato&#xA;&#xA;La richiesta di autenticazione dei client mediante certificato è una buona misura preventiva ma può essere resa migliore.&#xA;&#xA;Nelle configurazioni viste finora, stunnel server autorizza l’accesso al servizio solo se il client si presenta con un certificato ma non c’è nulla che vincoli il certificato al servizio. In altre parole, un client in possesso di un qualunque certificato, può accedere alla risorsa.&#xA;&#xA;È possibile rafforzare il trusting fra le parti facendo in modo che stunnel autorizzi solo alcuni certificati invece che qualunque. Questo tipo di controllo può essere fatto sia su stunnel sia in client mode che in server mode.&#xA;&#xA;verifyChain = yes | no&#xA;checkEmail = email del certificato&#xA;checkHost = CN del certificato&#xA;checkIP = IP del peer che presenta il certificato&#xA;verifyPeer = yes | no&#xA;CApath =  path CA &#xA;CAfile =  file pem contenente la fullchain del certificato presentato a stunnel &#xA;&#xA;verifyChain&#xA;Impone che si possa verificare la fullchain del certificato presentato. Se uno degli issuer non viene trovato, la connessione fallisce. La fullchain viene indicata attraverso CAfile o CApath.&#xA;&#xA;CAfile&#xA;È il file contenente le CA con cui stunnel valida i certificati che gli vengono presentati. Se stunnel è in server mode, sarà la fullchain relativa ai client. Altrimenti sarà la fullchain relativa al server.&#xA;&#xA;CApath&#xA;È il path in cui si trovano le CA con cui stunnel valida i certificati che gli vengono presentati. Se lo stunnel è in server mode, sarà la fullchain realtiva ai client. Altrimenti sarà la fullchain relativa al server.&#xA;&#xA;verifyPeer&#xA;Se con CAfile e CApath si verifica la fullchain dei certificati presentati a stunnel, con verifyPeer = yes si verifica che questi certificati siano presenti anche nel suo keystore (CAfile o CApath). Permette di “legare” a stunnel i certificati che dovrà validare.&#xA;&#xA;checkEmail, checkHost, checkIP&#xA;Come per verifyPeer, sono direttive che permettono di stringere il legame fra il certificato che viene presentato e stunnel.&#xA;Verifica che l’email, il CN o l’IP del certificato che viene presentato corrispondano a quelli presenti nella configurazione.&#xA;In una configurazione lato server posso avere molteplici occorrenze di questi due campi relative ad altrettanti certificati. Il caso in cui ad es. si debbano autenticare n client.&#xA;&#xA;Se i certificati sono self-signed, verifyChain perde di significato (coinciderebbe con verifyPeer). La possibilità di generare i certificati attraverso una CA, anche interna, renderebbe il processo più strutturato anche se più complesso (si dovrà trovare un modo per distribuire la CA, se interna). Si tratta di trovare il giusto compromesso fra ampiezza del servizio (quanti utenti coinvolge?) e complessità richiesta.&#xA;&#xA;Se si tratta di realizzare un canale sicuro fra due apparati per una comunicazione server-2-server, vanno bene anche i certificati self-signed o un’autenticazione PSK. Altrimenti, soprattutto nel caso in cui l’autenticazione dei client è una fase critica, conviene valutare l’uso di una CA e una validazione il più possibile restrittiva sui client e sul server.&#xA;&#xA;Autenticazione PSK&#xA;&#xA;A differenza dell’autenticazione con certificato, l’autenticazione con PSK non prevede enhancement di sicurezza ulteriori a meno di specificare opportuni algoritmi di cifratura (cfr. paragrafo successivo).&#xA;&#xA;Cifratura&#xA;&#xA;Come sempre succede, negli scenari di cifratura asimmetrica orientatia alla connessione, l’autenticazione, per quanto possa essere accurata, costituisce solo uno degli aspetti di cui tenere conto nella fase di messa in sicurezza del servizio.&#xA;&#xA;Avere un’autenticazione con certificato generato con tutti i crismi da una CA, è certamente una gran cosa ma mette in sicurezza solo l’aspetto dell’autenticazione, per l’appunto.&#xA;&#xA;l transito dei dati è affidato alle suite di cifratura supportati da openssl e, volendo lavorare di fino, bisognerebbe stringere anche su quelli.&#xA;&#xA;Altrimenti, paradossalmente, si avrà un’autenticazione robustissima ma con algoritmi colabrodo di cifratura dei dati che, ad attaccanti ben motivati, lascerebbero delle porte spalancate per sferrare attacchi MITM per intercettare direttamente i dati, piuttosto che provare il furto di identità.&#xA;&#xA;Ad ogni modo, il default, per ragioni di compatibilità legacy, dei parametri di cifratura (da settare eventualmente su client e sul server) è il seguente:&#xA;ciphers: HIGH:!aNULL:!SSLv2:!DH:!kDHEPSK&#xA;ciphersuites: TLSAES256GCMSHA384:TLSAES128GCMSHA256:TLSCHACHA20POLY1305SHA256&#xA;dove ciphers raggruppa le suite di cifratura relativi a TLS1.2 in giù e ciphersuites riguarda invece TLS1.3.&#xA;&#xA;Configurazione servizio&#xA;&#xA;Ulteriori restrizioni possono essere aggiunte a livelllo di sistema:&#xA;&#xA;regolando i bit di setuid e setgid se stunnel gira come root&#xA;delimitando l’esecuzione del processo in una gabbia chroot&#xA;disabilitando le regonetiation (se supportato dalla versione di openssl in uso) che mitiga in parte attacchi dos di tipo CPU-exhaustion&#xA;ecc..&#xA;&#xA;Caso reale: tunnelizzare Transmission.&#xA;&#xA;Transmission è un client bittorrent che può essere controllato da remoto via rpc attraverso un’interfaccia web o altri client.&#xA;&#xA;Transmission, nelle sue varie declinazioni, non incapsula il traffico rpc in una connessione tls.&#xA;&#xA;Se si vuole che il dato in transito sia cifrato e che la connessione sia autenticata, si può ricorrere:&#xA;&#xA;ad un tunnel ssh;&#xA;all’intermediazione di un webserver come apache o nginx ;&#xA;ad uno stunnel server&#xA;&#xA;Sugli ultimi due punti si può configurare una mutua autenticazione con certificato (complessa e articolata e, per tanti client, ha un impatto significativo). Scegliamo il 3° caso.&#xA;&#xA;Esposizione dell’interfaccia web&#xA;&#xA;Scenario: abbiamo una macchina (il nostro serverino di fiducia o un nas) con transmission a bordo, presumibilmente dietro un firewall che natta il suo indirizzo privato (192.168.70.15).&#xA;&#xA;Transmission Stunnel&#xA;smallEsposizione transmission attraverso stunnel server/small&#xA;&#xA;Obiettivo: Vogliamo poter raggiungere transmission e vogliamo che i client autentichino la loro connessione prima di accedere al servizio. In base allo scenario, sappiamo che dovremmo configurare un port forwarding dall’AP fino allo stunnel server. Il server transmission rimarrà confinato nella nostra rete locale.&#xA;&#xA;Utilizzo di un client esterno&#xA;&#xA;Supponiamo di utilizzare diversi client: il browser, transmission-remote-gtk o transmission-remote-gui (transgui), tremotesf (mobile).&#xA;&#xA;La prima cosa da fare è configurare un port forwarding sul nostro AP&#xA;&#xA;    Rulesub1/sub: 9091 ⇒ 192.168.70.10:9091&#xA;&#xA;Dopodichè, configureremo stunnel in server mode davanti a transmission&#xA;[transmission]&#xA;accept = 192.168.70.10:9091&#xA;connect = 192.168.70.15:9091&#xA;cert = path stunnel conf/ssl/server/certs/stunnelcrt.pem&#xA;key = path stunnel conf/ssl/server/private/stunnelkey.pem&#xA;requireCert = yes&#xA;verifyChain = yes&#xA;verifyPeer = yes&#xA;CApath = path stunnel conf/ssl/client/certs&#xA;Alcune note sulla configurazione:&#xA;&#xA;devo disporre di un certificato per stunnel&#xA;devo disporre dei certificati per i client che si connetteranno, le cui fullchain dovranno essere localizzate nel path indicato da CApath&#xA;&#xA;A questo punto basta che i web-client puntino all’host pubblico (151.25.77.205) sulla porta 9091 e il gioco è fatto.&#xA;&#xA;Per gli altri client come transmission-remote-gtk, transgui o tremotesf, per i quali al massimo posso chiedere di usare TLS (ma non sono riuscito ad usare un’autenticazione lato client), conviene installare stunnel in client mode :&#xA;[transmission-client]&#xA;accept = localhost:9091&#xA;connect = 151.25.77.205:9091&#xA;client = yes&#xA;cert = path stunnel conf/ssl/client/laptopcrt.pem&#xA;key = path stunnel conf/ssl/client/laptopkey.pem&#xA;verifyChain = yes&#xA;verifyPeer = yes&#xA;CAPath = path stunnel conf/ssl/server/certs&#xA;Il client (ad es. sul laptop) si connetterà su localhost:9091 e dovrà disporre anche del certificato del server e della sua fullchain affinchè i check su verifyChain e verifyPeer non falliscano.&#xA;&#xA;#ca #DigitalCertificate #AsymmetricEncryption #SymmetricEncryption #cryptography #fullchain #psk #ssh #ssl #stunnel #tls #x509 #openssl]]&gt;</description>
      <content:encoded><![CDATA[<p><strong><em>(pubblicato il 7 gennaio 2023)</em></strong>
<img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/42a8ecf32-5a8865/eZP2oeutp2KD/bkO44BGcvLFyYYUeCuYKXlSQzvBqgKi0Uh4fYtYk.jpg" alt="Stunnel">
<small><i>Fonte: <a href="https://www.stunnel.org" rel="nofollow">stunnel.org</a></i></small></p>

<h2 id="introduzione">Introduzione</h2>

<p>Da documentazione, Stunnel agisce come un proxy per aggiungere crittografia TLS a server e/o a client già esistenti.</p>

<p>Risulta quindi molto comodo quando si vuole aggiungere, attraverso un tunnel TLS, quella crittografia che manca alle nostre applicazioni per rendere le comunicazioni più sicure.

Come in ssh, è possibile “tunnellizzare” solo connessioni TCP.</p>

<p>Di stunnel esaminerò in particolare la fase di autenticazione attraverso certificato o PSK.</p>

<p>Gli scenari possibili, in base alle combinazioni, sono tre:</p>
<ul><li>client tls – server in chiaro</li>
<li>client in chiaro – server tls</li>
<li>client e server in chiaro</li></ul>

<p>Nel primo caso, occorre configurare stunnel in server mode, definendo un receiver ssl, a cui il client potrà connettersi.
<img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/42a8ecf32-5a8865/sQc861Pfxyfg/39Yo5lasr3nAebRZbrzqtoQOskqS62aHW9fwwyo0.png" alt="stunel server">
<small><i>Scenario 1: stunnel server</i></small></p>

<p>Nel secondo caso, occorre configurare stunnel in client mode, definendo un sender ssl che il client userà per connettersi al server
<img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/42a8ecf32-5a8865/nz4fkq8opVoD/HcocxYf4VwB0UtihuwlQ6pOo2CKxDCTU4X5v1UNB.png" alt="stunnel client">
<small><i>Scenario 2: stunnel client</i></small></p>

<p>Nel terzo caso, occorre configurare uno stunnel client e uno server
<img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/42a8ecf32-5a8865/zxIg9C1izJPj/DqgYaAezDIab01XBFMHiDRjUqEDWxNqxMJOGDSvs.png" alt="stunnel client e server">
<small><i>Scenario 3: stunnel client e server</i></small></p>

<p>Come ulteriore evoluzione per quel che riguarda le tratte in chiaro (e non solo) di client-stunnel client, stunnel client-stunnel server, stunnel server-server, sarebbe buona norma limitarne l’accesso con un firewall.
<img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/42a8ecf32-5a8865/j9Qbwy74AkaE/igU7qV0XI8gVIASWfDufiBvWeAf0OgnQ24ZLwC42.png" alt="stunnel client e server e firewall">
<small><i>Stunnel e firewall</i></small></p>

<p>Se invece stunnel fosse locale (installato direttamente sul client e/o sul server), la richiesta del client o il listener del servizio, avverrebbero sull’interfaccia di loopback.
Altrimenti, in assenza di firewall, sarebbe consigliabile accertare che la rete di collegamento fra i proxy stunnel e i rispettivi client/server, sia almeno di tipo “trusted”.</p>

<p>Stunnel consente un certo tuning sulla parte tls, potendo discriminare fra le cipher suites da abilitare, specificare comandi o configurazioni specifiche per openssl.
Quando si deve incapsulare una connessione in chiaro in un tunnel ssl bisogna tenere presente gli scenari menzionati prima.</p>

<h2 id="convenzioni">Convenzioni</h2>
<ul><li>Per non perdere generalità, negli esempi che seguiranno, immaginiamo che stunnel non sia locale (anche se spesso lo è).
<ul><li>se stunnel in <em>client mode</em> è locale ⇒ <strong>accept</strong> avverrà sull’interfaccia di loopback, da dove avviene effettivamente la richiesta</li>
<li>se stunnel in <em>server mode</em> è locale ⇒ <strong>connect</strong> avverrà sull’interfaccia di loopback, dove viene erogato effettivamente il servizio</li></ul></li>
<li>Non faremo assunzioni sulla creazione dei certificati. Possono anche essere self-signed.</li></ul>

<h2 id="configurazione-stunnel">Configurazione stunnel</h2>

<p>Verranno mostrate le configurazioni relative agli scenari mostrati nel modo più semplice possibile.</p>
<ul><li><strong>accept</strong>: host e porta che ricevono la richiesta</li>
<li><strong>connect</strong>: host e porta a cui girare l’accept</li>
<li><strong>cert</strong>: normalmente conterrebbe il certificato pubblico che stunnel espone per autenticarsi (la parte privata viene specificata con <strong>key</strong>). Può però anche essere costituito da tutta i certificati della chain fino alla root CA, in formato pem o p12, iniziando dalla chiave privata, proseguendo con la chiave pubblica, fino a tutte le CA della chain.</li>
<li><strong>key</strong>: chiave privata del certificato</li>
<li><strong>client</strong>: stabilisce se stunnel funzioni in server mode oppure no</li></ul>

<h3 id="primo-scenario">Primo scenario</h3>

<p>Nel primo caso, una configurazione minimale lato server, ha bisogno:</p>
<ol><li>host e porta dello stunnel server che riceve il traffico cifrato</li>
<li>host e porta del server su cui girare il traffico in chiaro</li>
<li>certificato pubblico e chiave privata necessari per la cifratura</li></ol>

<p><strong>Stunnel Server:</strong></p>

<pre><code>[myService]
accept = ip_stunnel_server:port_sts
connect = ip_server:port_server
cert = /server_crt.pem&lt;br&gt;
key = /server_key.pem
</code></pre>

<h3 id="secondo-scenario">Secondo scenario</h3>

<p>Nel secondo caso, una configurazione minimale lato client, ha bisogno:</p>
<ol><li>host e porta dello stunnel client da cui partirà la richiesta</li>
<li>host e porta del server da cui stunnel client avvierà la sessione tls</li></ol>

<p><strong>Stunnel Client:</strong></p>

<pre><code>[myService]
client = yes
accept = ip_stunnel_client:port_stc
connect = ip_server:port_server
</code></pre>

<h3 id="terzo-scenario">Terzo Scenario</h3>

<p>Il terzo caso, è una fusione dei primi due. Sono gli stunnel a gestire il grosso della comunicazione. E nei casi in cui lo stunnel viene installato sulle macchine di servizio, client e server reali usano solo l’interfaccia di loopback.</p>

<p>Una configurazione minimale per il client ha bisogno di:</p>
<ol><li>host e porta dello stunnel client da cui partirà la richiesta</li>
<li>host e porta del server da cui stunnel client avvierà la sessione tls</li></ol>

<p><strong>Stunnel Client:</strong></p>

<pre><code>[myService]
client = yes
accept = ip_stunnel_client:port_stc
connect = ip_stunnel_server:port_server
</code></pre>

<p>Una configurazione minimale per il server ha bisogno:</p>
<ol><li>host e porta dello stunnel server che riceve il traffico cifrato</li>
<li>host e porta del server su cui girare il traffico in chiaro
certificato pubblicato e chiave privata necessari per la cifratura</li></ol>

<p><strong>Stunnel Server:</strong></p>

<pre><code>[myService]
accept = ip_stunnel_server:port_sts
connect = ip_server:port_server
cert = /server_crt.pem
key = /server_key.pem
</code></pre>

<p><small><strong>Piccola nota</strong>: se client e/o server dovessero supportare chiavi PSK, si potrebbe usare PSK in luogo dei certificati. Ci ritornerò più avanti.</small></p>

<h2 id="autenticazione-dei-client">Autenticazione dei client</h2>

<p>Le impostazioni viste finora, mostrano come incapsulare un traffico in chiaro all’interno di un tunnel tls e si basano sulla sola autenticazione lato server.</p>

<p>Per migliorare la configurazione possiamo ricorrere alla <a href="https://noblogo.org/aytin/mutua-autenticazione" rel="nofollow"><strong>mutua autenticazione</strong></a> facendo in modo che anche i client si autentichino.</p>

<p>Una mutua autenticazione, con tutte le verifiche del caso, aumenta il grado di sicurezza comunicazione TLS ed è un efficace deterrente contro eventuali attacchi MITM. L’autenticazione sul client si può ottenere sempre con i certificati oppure, più semplicemente, con chiavi PSK.</p>

<h3 id="autenticazione-dei-client-con-certificato">Autenticazione dei client con certificato</h3>

<p>Ad una configurazione minimale per una mutua autenticazione, lato server, si richiede che i client esibiscano il certificato e i client (che sia stunnel in <em>client mode</em>, un browser o qualunque altra cosa) dovranno essere in grado di esibire i certificati nel momento in cui il server li richiederà.</p>

<p>Su stunnel server, alle configurazioni viste in precedenza, si aggiunge <strong>requireCert</strong> impostato a <strong>yes</strong>, che richiede ai client l’esibizione di un certificato. Se, durante l’handshake TLS, il client non esibisce un certificato, l’handshake fallisce e la connessione viene rifiutata.</p>

<p><strong>Stunnel Server:</strong></p>

<pre><code>[myService]
…
requireCert = yes
…
</code></pre>

<p>È sufficiente questo se i client possono manipolare i propri certificati. Altrimenti, se c’è uno stunnel client che intermedia le richieste dei client effettivi, si deve aggiungere alla sua configurazione la chiave e il certificato del client</p>

<p><strong>Stunnel Client:</strong></p>

<pre><code>[myService]
…
cert = /server_crt.pem
key = /server_key.pem
…
</code></pre>

<h3 id="autenticazione-dei-client-con-psk">Autenticazione dei client con PSK</h3>

<p>Per l’autenticazione PSK bisogna disporre della lista di utenti abilitati con relative chiavi esadecimali di almeno 16 bytes (ossia almeno 32 caratteri esadecimali visto che con un byte si rappresentano due esadecimali).</p>

<p>La creazione di una chiave esadecimale può essere fatta velocemente con openssl.
Supponiamo di creare due utenze per <em>Frodo</em> e <em>Gandalf</em> con chiavi da 20 e 42 bytes.</p>

<pre><code class="language-bash">echo -e &#34;frodo:&#34;$(openssl rand -hex 20) &gt; frodo_psk.txt
echo -e &#34;gandalf:&#34;$(openssl rand -hex 42) &gt; gandalf_psk.txt
</code></pre>

<p>Tutte le identità dovranno confluire nel file che, nella configurazione stunnel, sarà indicato da <strong>PSKsecrets</strong>. Ad es:</p>

<pre><code class="language-bash">cat frodo_psk.txt gandalf_psk.txt &gt; psksecrets.txt
…
frodo:84196825fab3389624dcc83eb61189e5b21099fe&lt;br&gt;gandalf:5daf128419855993a2d95ba0a337c51b3f373df88e594441f2979eba6461f25676f1f825b0c76df392f2
…
</code></pre>

<p>E, come detto, nella configurazione dello stunnel server dovrò indicare il file delle identità:</p>

<p><strong>Stunnel Server</strong></p>

<pre><code>[myServer]
accept = ip_stunnel_server:port_sts
connect = ip_server:port_server
PSKsecrets = &lt;path_identity_file&gt;/psksecrets.txt
</code></pre>

<p>Se il client supporta PSK, dovrà fornire identità e password. Ad es. facendo un test con <code>openssl</code>:</p>

<pre><code class="language-bash">openssl s_client -port &lt;porta&gt; -psk_identity frodo -psk 84196825fab3389624dcc83eb61189e5b21099fe -tls1_2 -connect &lt;host&gt;
</code></pre>

<p>Altrimenti si configura stunnel client indicando sia l’identità, sia il file individuate da <strong>PSKsecrets</strong>.</p>

<p><strong>Stunnel Client</strong></p>

<pre><code>[myClient]
client = yes
accept = ip_stunnel_client:port_stc
connect = ip_stunnel_server:port_server
PSKidentity = frodo
PSKsecrets = &lt;path_identity_file&gt;/psksecrets.txt
</code></pre>

<p>In alternativa, per non far viaggiare il file delle identità fra tutti i client, possiamo sfruttare a nostro vantaggio il default delle identità.</p>

<p>In assenza della direttiva <strong>PSKidentity</strong>, viene assunta come identità di default la prima riga del file indicato da <strong>PSKSecrets</strong>. Basta quindi creare un file con la sola identità che mi occorre, ad es. <strong>frodo_psk.txt</strong></p>

<pre><code>frodo:84196825fab3389624dcc83eb61189e5b21099fe
</code></pre>

<p>e indicare quello in <strong>PSKSecrets</strong>. La configurazione che segue è equivalente alla precedente.</p>

<p><strong>Stunnel Client</strong></p>

<pre><code>[myClient]
client = yes
accept = ip_stunnel_client:port_stc
connect = ip_stunnel_server:port_server
PSKsecrets = &lt;path_identity_file&gt;/frodo_psk.txt
</code></pre>

<h2 id="ulteriori-considerazioni-di-sicurezza">Ulteriori considerazioni di sicurezza</h2>

<h3 id="autenticazione-con-certificato">Autenticazione con certificato</h3>

<p>La richiesta di autenticazione dei client mediante certificato è una buona misura preventiva ma può essere resa migliore.</p>

<p>Nelle configurazioni viste finora, stunnel server autorizza l’accesso al servizio solo se il client si presenta con un certificato ma non c’è nulla che vincoli il certificato al servizio. In altre parole, un client in possesso di un qualunque certificato, può accedere alla risorsa.</p>

<p>È possibile rafforzare il trusting fra le parti facendo in modo che stunnel autorizzi solo alcuni certificati invece che qualunque. Questo tipo di controllo può essere fatto sia su stunnel sia in <em>client mode</em> che in <em>server mode</em>.</p>
<ul><li><strong>verifyChain</strong> = yes | no</li>
<li><strong>checkEmail</strong> = email del certificato</li>
<li><strong>checkHost</strong> = CN del certificato</li>
<li><strong>checkIP</strong> = IP del peer che presenta il certificato</li>
<li><strong>verifyPeer</strong> = yes | no</li>
<li><strong>CApath</strong> = &lt; path CA &gt;</li>
<li><strong>CAfile</strong> = &lt; file <strong>pem</strong> contenente la fullchain del certificato presentato a stunnel &gt;</li></ul>

<p><strong>verifyChain</strong>
Impone che si possa verificare la fullchain del certificato presentato. Se uno degli issuer non viene trovato, la connessione fallisce. La fullchain viene indicata attraverso <strong>CAfile</strong> o <strong>CApath</strong>.</p>

<p><strong>CAfile</strong>
È il <strong>file</strong> contenente le CA con cui stunnel valida i certificati che gli vengono presentati. Se stunnel è in <em>server mode</em>, sarà la fullchain relativa ai client. Altrimenti sarà la fullchain relativa al server.</p>

<p><strong>CApath</strong>
È il path in cui si trovano le CA con cui stunnel valida i certificati che gli vengono presentati. Se lo stunnel è in server mode, sarà la fullchain realtiva ai client. Altrimenti sarà la fullchain relativa al server.</p>

<p><strong>verifyPeer</strong>
Se con <strong>CAfile</strong> e <strong>CApath</strong> si verifica la fullchain dei certificati presentati a stunnel, con <strong>verifyPeer = yes</strong> si verifica che questi certificati siano presenti anche nel suo keystore (<strong>CAfile</strong> o <strong>CApath</strong>). Permette di “legare” a stunnel i certificati che dovrà validare.</p>

<p><strong>checkEmail</strong>, <strong>checkHost</strong>, <strong>checkIP</strong>
Come per <strong>verifyPeer</strong>, sono direttive che permettono di stringere il legame fra il certificato che viene presentato e stunnel.
Verifica che l’email, il CN o l’IP del certificato che viene presentato corrispondano a quelli presenti nella configurazione.
In una configurazione lato server posso avere molteplici occorrenze di questi due campi relative ad altrettanti certificati. Il caso in cui ad es. si debbano autenticare n client.</p>

<p>Se i certificati sono self-signed, <strong>verifyChain</strong> perde di significato (coinciderebbe con <strong>verifyPeer</strong>). La possibilità di generare i certificati attraverso una CA, anche interna, renderebbe il processo più strutturato anche se più complesso (si dovrà trovare un modo per distribuire la CA, se interna). Si tratta di trovare il giusto compromesso fra ampiezza del servizio (quanti utenti coinvolge?) e complessità richiesta.</p>

<p>Se si tratta di realizzare un canale sicuro fra due apparati per una comunicazione server-2-server, vanno bene anche i certificati self-signed o un’autenticazione PSK. Altrimenti, soprattutto nel caso in cui l’autenticazione dei client è una fase critica, conviene valutare l’uso di una CA e una validazione il più possibile restrittiva sui client e sul server.</p>

<h3 id="autenticazione-psk">Autenticazione PSK</h3>

<p>A differenza dell’autenticazione con certificato, l’autenticazione con PSK non prevede enhancement di sicurezza ulteriori a meno di specificare opportuni algoritmi di cifratura (cfr. paragrafo successivo).</p>

<h3 id="cifratura">Cifratura</h3>

<p>Come sempre succede, negli scenari di cifratura asimmetrica orientatia alla connessione, l’autenticazione, per quanto possa essere accurata, costituisce solo uno degli aspetti di cui tenere conto nella fase di messa in sicurezza del servizio.</p>

<p>Avere un’autenticazione con certificato generato con tutti i crismi da una CA, è certamente una gran cosa ma mette in sicurezza solo l’aspetto dell’autenticazione, per l’appunto.</p>

<p>l transito dei dati è affidato alle suite di cifratura supportati da openssl e, volendo lavorare di fino, bisognerebbe stringere anche su quelli.</p>

<p>Altrimenti, paradossalmente, si avrà un’autenticazione robustissima ma con algoritmi colabrodo di cifratura dei dati che, ad attaccanti ben motivati, lascerebbero delle porte spalancate per sferrare attacchi MITM per intercettare direttamente i dati, piuttosto che provare il furto di identità.</p>

<p>Ad ogni modo, il default, per ragioni di compatibilità legacy, dei parametri di cifratura (da settare eventualmente su client e sul server) è il seguente:</p>

<pre><code>ciphers: HIGH:!aNULL:!SSLv2:!DH:!kDHEPSK
ciphersuites: TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256
</code></pre>

<p>dove <strong>ciphers</strong> raggruppa le suite di cifratura relativi a TLS1.2 in giù e <strong>ciphersuites</strong> riguarda invece TLS1.3.</p>

<h3 id="configurazione-servizio">Configurazione servizio</h3>

<p>Ulteriori restrizioni possono essere aggiunte a livelllo di sistema:</p>
<ol><li>regolando i bit di <strong>setuid</strong> e <strong>setgid</strong> se stunnel gira come root</li>
<li>delimitando l’esecuzione del processo in una gabbia <strong>chroot</strong></li>
<li>disabilitando le <em>regonetiation</em> (se supportato dalla versione di openssl in uso) che mitiga in parte attacchi dos di tipo CPU-exhaustion</li>
<li>ecc..</li></ol>

<h2 id="caso-reale-tunnelizzare-transmission">Caso reale: tunnelizzare Transmission.</h2>

<p><strong>Transmission</strong> è un client <strong>bittorrent</strong> che può essere controllato da remoto via <strong>rpc</strong> attraverso un’interfaccia web o altri client.</p>

<p>Transmission, nelle sue varie declinazioni, non incapsula il traffico rpc in una connessione tls.</p>

<p>Se si vuole che il dato in transito sia cifrato e che la connessione sia autenticata, si può ricorrere:</p>
<ol><li>ad un tunnel ssh;</li>
<li>all’intermediazione di un webserver come apache o nginx ;</li>
<li>ad uno stunnel server</li></ol>

<p>Sugli ultimi due punti si può configurare una mutua autenticazione con certificato (complessa e articolata e, per tanti client, ha un impatto significativo). Scegliamo il 3° caso.</p>

<h2 id="esposizione-dell-interfaccia-web">Esposizione dell’interfaccia web</h2>

<p><strong>Scenario</strong>: abbiamo una macchina (il nostro serverino di fiducia o un nas) con transmission a bordo, presumibilmente dietro un firewall che natta il suo indirizzo privato (192.168.70.15).</p>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/42a8ecf32-5a8865/xP2UKA4QZMkK/OVVicpId7etadviBPtZUKHscaXrzy4vlaZAWAoBn.png" alt="Transmission Stunnel">
<small>Esposizione transmission attraverso stunnel server</small></p>

<p><strong>Obiettivo</strong>: Vogliamo poter raggiungere transmission e vogliamo che i client autentichino la loro connessione prima di accedere al servizio. In base allo scenario, sappiamo che dovremmo configurare un port forwarding dall’AP fino allo stunnel server. Il server transmission rimarrà confinato nella nostra rete locale.</p>

<h2 id="utilizzo-di-un-client-esterno">Utilizzo di un client esterno</h2>

<p>Supponiamo di utilizzare diversi client: il browser, <strong>transmission-remote-gtk</strong> o <strong>transmission-remote-gui</strong> (<em>transgui</em>), <strong>tremotesf</strong> (mobile).</p>

<p>La prima cosa da fare è configurare un port forwarding sul nostro AP</p>

<p>    Rule<sub>1</sub>: <strong>9091</strong> ⇒ 192.168.70.10:<strong>9091</strong></p>

<p>Dopodichè, configureremo stunnel in server mode davanti a transmission</p>

<pre><code>[transmission]
accept = 192.168.70.10:9091
connect = 192.168.70.15:9091
cert = &lt;path stunnel conf&gt;/ssl/server/certs/stunnel_crt.pem
key = &lt;path stunnel conf&gt;/ssl/server/private/stunnel_key.pem
requireCert = yes
verifyChain = yes
verifyPeer = yes
CApath = &lt;path stunnel conf&gt;/ssl/client/certs
</code></pre>

<p><strong>Alcune note sulla configurazione</strong>:</p>
<ul><li>devo disporre di un certificato per stunnel</li>
<li>devo disporre dei certificati per i client che si connetteranno, le cui fullchain dovranno essere localizzate nel path indicato da CApath</li></ul>

<p>A questo punto basta che i web-client puntino all’host pubblico (151.25.77.205) sulla porta 9091 e il gioco è fatto.</p>

<p>Per gli altri client come <strong>transmission-remote-gtk</strong>, <strong>transgui</strong> o <strong>tremotesf</strong>, per i quali al massimo posso chiedere di usare TLS (ma non sono riuscito ad usare un’autenticazione lato client), conviene installare stunnel in client mode :</p>

<pre><code>[transmission-client]
accept = localhost:9091
connect = 151.25.77.205:9091
client = yes
cert = &lt;path stunnel conf&gt;/ssl/client/laptop_crt.pem
key = &lt;path stunnel conf&gt;/ssl/client/laptop_key.pem
verifyChain = yes
verifyPeer = yes
CAPath = &lt;path stunnel conf&gt;/ssl/server/certs
</code></pre>

<p>Il client (ad es. sul laptop) si connetterà su localhost:9091 e dovrà disporre anche del certificato del server e della sua fullchain affinchè i check su <strong>verifyChain</strong> e <strong>verifyPeer</strong> non falliscano.</p>

<p><a href="/aytin/tag:ca" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ca</span></a> <a href="/aytin/tag:DigitalCertificate" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">DigitalCertificate</span></a> <a href="/aytin/tag:AsymmetricEncryption" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">AsymmetricEncryption</span></a> <a href="/aytin/tag:SymmetricEncryption" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">SymmetricEncryption</span></a> <a href="/aytin/tag:cryptography" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cryptography</span></a> <a href="/aytin/tag:fullchain" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">fullchain</span></a> <a href="/aytin/tag:psk" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">psk</span></a> <a href="/aytin/tag:ssh" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ssh</span></a> <a href="/aytin/tag:ssl" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ssl</span></a> <a href="/aytin/tag:stunnel" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">stunnel</span></a> <a href="/aytin/tag:tls" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">tls</span></a> <a href="/aytin/tag:x509" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">x509</span></a> <a href="/aytin/tag:openssl" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">openssl</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/stunnel-cose-e-come-si-configura</guid>
      <pubDate>Sat, 04 Mar 2023 15:16:09 +0000</pubDate>
    </item>
    <item>
      <title>TOR: Configurare hidden service con autenticazione</title>
      <link>https://noblogo.org/aytin/tor-configurare-hidden-service-con-autenticazione</link>
      <description>&lt;![CDATA[(pubblicato il 22 luglio 2021)&#xA;The Onion Services&#xA;smalliFonte: a href=&#34;https://community.torproject.org/onion-services/overview/&#34;TorProject: The Onion Services/a/i/small&#xA;&#xA;I Tor Onion Service (hidden service) sono di tipo V3. I servizi di tipo V2 sono deprecati da luglio 2020 e da ottobre 2021 verranno completamente rimossi dalla rete onion (rif. https://blog.torproject.org/v2-deprecation-timeline)&#xA;!--more--&#xA;&#xA;1. Configurazione lato server&#xA;&#xA;Tor ha il suo file di configurazione in /etc/tor/torrc mentre la sua workdir, normalmente è su /var/lib/tor&#xA;&#xA;Ogni hidden service viene riferito nel file di configurazione di tor, /etc/tor/torrc, da almeno una coppia di direttive:&#xA;&#xA;HiddenServiceDir: è la cartella dove verranno creati gli oggetti necessari all’hidden service (per default su /var/lib/tor/hiddenservice)&#xA;HiddenServicePort: la porta su cui il servizio sarà in ascolto, di fatto è la porta di inoltro verso il servizio vero e proprio.&#xA;&#xA;1.1. HiddenServiceDir&#xA;&#xA;Gli oggetti presenti in questa cartella sono:&#xA;&#xA;hostname: il nome del servizio composto da 56 caratteri casuali + l’estensione “.onion”&#xA;hs\ed25519\public\key, hs\ed25519\privatekey: la chiave pubblica e privata lato server usati dal nodo tor&#xA;authorized\clients: se prevediamo di avere anche un’autenticazione per i client, avremo anche questa cartella. Come per il file authorized\keys per ssh, è una cartella contenente le chiavi pubbliche dei client autorizzati all’utilizzo del servizio.&#xA;&#xA;1.2. HiddenServicePort&#xA;&#xA;È una tripla&#xA;&#xA;portator hostname:listenport&#xA;&#xA;hostname di norma non è altri che localhost.&#xA;&#xA;Una volta esplicitato l’HiddenServiceDir (l’HiddenServicePort è meno rilevante. A Tor non interessa che ci sia un servizio in ascolto effettivo), il riavvio del servizio Tor, creerà gli oggetti menzionati prima.&#xA;&#xA;Se non ci fosse autenticazione, il client che accede alla rete Tor potrebbe già contattare il servizio esposto senza alcuna altra configurazione.&#xA;&#xA;Se invece i client devono essere riconosciuti, sono richiesti altri passi di configurazione.&#xA;&#xA;2. Configurazione lato client&#xA;&#xA;Configurazione di /etc/tor/torrc&#xA;Creazione delle chiavi di autenticazione&#xA;&#xA;2.1. Configurazione di /etc/tor/torrc&#xA;&#xA;Inserire la direttiva ClientOnionAuthDir col path contenente i file di autenticazione per l’accesso agli hidden service&#xA;&#xA;2.2. Creazione delle chiavi di autenticazione&#xA;&#xA;Per ogni hidden service, si deve creare una coppia di chiavi x25519 pubblica e privata necessarie per l’autenticazione di ogni utente.&#xA;&#xA;Le chiavi, generate con openssl e basez, sono di tipo x25519 in base32.&#xA;&#xA;2.2.1. Chiave pubblica&#xA;&#xA;La chiave pubblica andrà posizionata sul server nella cartella \[HiddenServiceDir\]/authorized\clients.&#xA;&#xA;La sintassi del file dovrà rispettare questa forma:&#xA;descriptor:x25519:chiave pubblica x25519 in base32&#xA;&#xA;e il nome file dovrà essere&#xA;nome file.auth&#xA;&#xA;2.2.2. Chiave privata&#xA;&#xA;La chiave privata andrà posizionata nel client nella cartella indicata da \[ClientOnionAuthDir\].&#xA;&#xA;La sintassi del file dovrà rispettare questa forma:&#xA;indirizzo servizio onion senza estensione:descriptor:x25519:chiave privata x25519 in base32&#xA;&#xA;e il nome file dovrà essere:&#xA;nome file.authprivate&#xA;&#xA;Per rendere effettive le modifiche sul file torrc, sia sui client che sul server, si deve riavviare il servizio Tor.&#xA;&#xA;3. Configurazione reale di due hidden service: web e ssh&#xA;&#xA;Supponiamo per esempio di voler creare due hidden service: web e ssh&#xA;&#xA;3.1. Creazione delle chiavi&#xA;&#xA;1. Generazione della chiave openssl x25519&#xA;web&#xA;openssl genpkey -algorithm x25519 -out /tmp/web.prv.pem&#xA;ssh&#xA;openssl genpkey -algorithm x25519 -out /tmp/ssh.prv.pem&#xA;2. Generazione della chiave privata base 32&#xA;web&#xA;cat /tmp/web.prv.pem | grep -v &#34; PRIVATE KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39;   /tmp/web.prv.key&#xA;ssh&#xA;cat /tmp/ssh.prv.pem | grep -v &#34; PRIVATE KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39;   /tmp/ssh.prv.key&#xA;3. Generazione della chiave pubblica base 32&#xA;web&#xA;openssl pkey -in /tmp/web.prv.pem -pubout | grep -v &#34; PUBLIC KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39;   /tmp/web.pub.key&#xA;ssh&#xA;openssl pkey -in /tmp/ssh.prv.pem -pubout | grep -v &#34; PUBLIC KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39;   /tmp/ssh.pub.key&#xA;&#xA;3.2. Configurazione lato server&#xA;&#xA;Convenzioni:&#xA;&#xA;Le seguenti convenzioni hanno il solo scopo di dare uniformità e scalabilità alla configurazione del servizio.&#xA;&#xA;Creazione di una cartella diversa per ogni servizio esposto così da avere autenticazioni distinte per servizio e per utente.&#xA;Nella cartella del servizio, all’interno di authorized\clients, dove andranno posizionate le chiavi pubbliche, il nome delle chiavi sarà nel formato: nome utentenome servizio.auth&#xA;&#xA;3.2.1. Creazione cartelle per gli hidden service&#xA;&#xA;HTTP&#xA;mkdir -p /var/lib/tor/hiddenservice/web/authorizedclients&#xA;chown -R toranon:toranon /var/lib/tor/hiddenservice/web&#xA; &#xA;SSH&#xA;mkdir -p /var/lib/tor/hiddenservice/ssh/authorizedclients&#xA;chown -R toranon:toranon /var/lib/tor/hiddenservice/ssh&#xA;3.2.2. Configurazione /etc/tor/torrc&#xA;vi /etc/tor/torrc&#xA;&#xA;...&#xA;HiddenServiceDir /var/lib/tor/hiddenservice/web&#xA;HiddenServicePort 1080 127.0.0.1:80&#xA; &#xA;HiddenServiceDir /var/lib/tor/hiddenservice/ssh&#xA;HiddenServicePort 2022 127.0.0.1:22&#xA;...&#xA;&#xA;smallbUna considerazione sull’esposizione dei servizi./b&#xA;In questo esempio, i servizi girano sull’interfaccia di loopback ed ho imposto che le porte di esposizione del servizio siano quelle canoniche mentre sui corrispettivi .onion, da utilizzare attraverso i client, le porte sono non standard./small&#xA;&#xA;Inizializzazione del servizio Tor per creare gli oggetti necessari all&#39;esposizione, in particolare dell&#39;hostname .onion&#xA;systemctl restart tor&#xA;&#xA;3.2.3. Creazione file .auth e riavvio tor&#xA;&#xA;web&#xA;echo &#34;descriptor:x25519:&#34;   /var/lib/tor/hiddenservice/web/authorizedclients/utente1web.auth&#xA;cat /tmp/web.pub.key     /var/lib/tor/hiddenservice/web/authorizedclients/utente1web.auth&#xA; &#xA;ssh&#xA;echo &#34;descriptor:x25519:&#34;   /var/lib/tor/hiddenservice/ssh/authorizedclients/utente1ssh.auth&#xA;cat /tmp/ssh.pub.key     /var/lib/tor/hiddenservice/ssh/authorizedclients/utente1ssh.auth&#xA;&#x9;&#xA;reload delle configurazioni e delle chiavi&#xA;systemctl restart tor &#xA;&#xA;3.3. Configurazione lato client&#xA;&#xA;3.3.1. Convenzioni&#xA;&#xA;Creazione di una cartella in cui raccogliere le chiavi private dell’utente&#xA;Il nome della chiave sarà:&#xA;nome utentenome servizio.authprivate&#xA;&#xA;3.3.2. Creazione cartella per l’autenticazione&#xA;&#xA;SSH&#xA;mkdir /var/lib/tor/hiddenservice/clientonionauth&#xA;chown toranon:toranon /var/lib/tor/hiddenservice/clientonionauth&#xA;&#xA;3.3.3. Creazione file .authprivate&#xA;&#xA;web&#xA;cat /var/lib/tor/hiddenservice/web/hostname | cut -d &#34;.&#34; -f 1   /var/lib/tor/hiddenservice/clientonionauth/utente1web.authprivate&#xA;echo &#34;:descriptor:x25519:&#34;     /var/lib/tor/hiddenservice/clientonionauth/utente1web.authprivate&#xA;cat /tmp/web.priv.key     /var/lib/tor/hiddenservice/clientonionauth/utente1web.authprivate&#xA; &#xA;ssh&#xA;cat /var/lib/tor/hiddenservice/ssh/hostname | cut -d &#34;.&#34; -f 1   /var/lib/tor/hiddenservice/clientonionauth/utente1ssh.authprivate&#xA;echo &#34;:descriptor:x25519:&#34;     /var/lib/tor/hiddenservice/clientonionauth/utente1ssh.authprivate&#xA;cat /tmp/ssh.priv.key     /var/lib/tor/hiddenservice/clientonionauth/utente1ssh.authprivate&#xA;3.3.4. Configurazione /etc/tor/torrc e riavvio tor&#xA;Nel file /etc/tor/torrc si deve modificare la direttiva ClientOnionAuthDir:&#xA;...&#xA;ClientOnionAuthDir /var/lib/tor/hiddenservice/clientonionauth&#xA;...&#xA;Dopodiché si riavvia il servizio tor per rendere consistente la modifica:&#xA;Reload del servizio e acquisizione delle chiavi&#xA;systemctl restart tor&#xA;&#xA;4. Conclusione&#xA;&#xA;I servizi ora sono pronti per essere fruiti.&#xA;&#xA;Nel caso del servizio web, non è necessaria la configurazione lato client di tor se si usa Tor Browser.&#xA;&#xA;Per accedere in ssh attraverso tor si può provare in paio di modi.&#xA;&#xA;  1) Usando l’utility torify, normalmente installata insieme a tor:&#xA;torify ssh -p2022 user1@ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion&#xA;  2) Direttamente in ssh usando ProxyCommand per veicolare la connessione ssh attraverso tor:&#xA;ssh -p2022 user1@ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion  -o ProxyCommand=&#34;ncat --proxy 127.0.0.1:9050 --proxy-type socks5 ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion 2022&#34;&#xA;&#xA;tips:&#xA;Usando una configurazione opportuna in $HOME/.ssh/config, l’utilizzo del servizio si semplifica notevolmente.&#xA;&#xA;In .ssh/config:&#xA;Host sshservice.onion&#xA;    Hostname ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion&#xA;    User user1&#xA;    Port 2022&#xA;    VerifyHostKeyDNS no&#xA;    ProxyCommand ncat --proxy 127.0.0.1:9050 --proxy-type socks5 %h %p&#xA;A questo punto per accedere in ssh basta: ssh sshservice.onion&#xA;&#xA;buNote a margine:/u/b&#xA;&#xA;Il sistema di riferimento è Fedora 34&#xA;A differenza di SO debian-based, sui repository di Fedora 34 basez non è disponibile e va compilato.&#xA;La configurazione e l’hardenizzazione dei servizi da “torificare” esula dallo scopo di questo articolo, così come il dettaglio della configurazione di Tor&#xA;&#xA;Riferimenti:&#xA;&#xA;https://tb-manual.torproject.org/onion-services/&#xA;https://community.torproject.org/onion-services/setup/&#xA;https://community.torproject.org/onion-services/advanced/client-auth/&#xA;&#xA;#clientauthorization #hiddenservice #ssh #tor #torify]]&gt;</description>
      <content:encoded><![CDATA[<p><strong><em>(pubblicato il 22 luglio 2021)</em></strong>
<img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/42a8ecf32-5a8865/oUt3D9lG2Nvt/vggxjNSY3kElKxFUUblwYsE0D2bcGPVmv8D2irdg.png" alt="The Onion Services">
<small><i>Fonte: <a href="https://community.torproject.org/onion-services/overview/" rel="nofollow">TorProject: The Onion Services</a></i></small></p>

<p>I Tor Onion Service (hidden service) sono di tipo <strong>V3</strong>. I servizi di tipo <strong>V2</strong> sono deprecati da luglio 2020 e da ottobre 2021 verranno completamente rimossi dalla rete onion (rif. <a href="https://blog.torproject.org/v2-deprecation-timeline" rel="nofollow">https://blog.torproject.org/v2-deprecation-timeline</a>)
</p>

<h2 id="1-configurazione-lato-server">1. Configurazione lato server</h2>

<p>Tor ha il suo file di configurazione in <strong>/etc/tor/torrc</strong> mentre la sua workdir, normalmente è su <strong>/var/lib/tor</strong></p>

<p>Ogni hidden service viene riferito nel file di configurazione di tor, <strong>/etc/tor/torrc</strong>, da almeno una coppia di direttive:</p>
<ul><li><strong>HiddenServiceDir</strong>: è la cartella dove verranno creati gli oggetti necessari all’hidden service (per default su <strong>/var/lib/tor/hidden_service</strong>)</li>
<li><strong>HiddenServicePort</strong>: la porta su cui il servizio sarà in ascolto, di fatto è la porta di inoltro verso il servizio vero e proprio.</li></ul>

<h3 id="1-1-hiddenservicedir">1.1. HiddenServiceDir</h3>

<p>Gli oggetti presenti in questa cartella sono:</p>
<ul><li><strong>hostname</strong>: il nome del servizio composto da 56 caratteri casuali + l’estensione “.onion”</li>
<li><strong>hs_ed25519_public_key</strong>, <strong>hs_ed25519_private_key</strong>: la chiave pubblica e privata lato server usati dal nodo tor</li>
<li><strong>authorized_clients</strong>: se prevediamo di avere anche un’autenticazione per i client, avremo anche questa cartella. Come per il file <strong>authorized_keys</strong> per <strong>ssh</strong>, è una cartella contenente le chiavi pubbliche dei client autorizzati all’utilizzo del servizio.</li></ul>

<h3 id="1-2-hiddenserviceport">1.2. HiddenServicePort</h3>

<p>È una tripla</p>

<p><code>&lt;porta_tor&gt; &lt;hostname&gt;:&lt;listen_port&gt;</code></p>

<p><strong>hostname</strong> di norma non è altri che <strong>localhost</strong>.</p>

<p>Una volta esplicitato l’<strong>HiddenServiceDir</strong> (l’<strong>HiddenServicePort</strong> è meno rilevante. A Tor non interessa che ci sia un servizio in ascolto effettivo), il riavvio del servizio Tor, creerà gli oggetti menzionati prima.</p>

<p>Se non ci fosse autenticazione, il client che accede alla rete Tor potrebbe già contattare il servizio esposto senza alcuna altra configurazione.</p>

<p>Se invece i client devono essere riconosciuti, sono richiesti altri passi di configurazione.</p>

<h2 id="2-configurazione-lato-client">2. Configurazione lato client</h2>
<ul><li>Configurazione di <strong>/etc/tor/torrc</strong></li>
<li>Creazione delle chiavi di autenticazione</li></ul>

<h3 id="2-1-configurazione-di-etc-tor-torrc">2.1. Configurazione di /etc/tor/torrc</h3>

<p>Inserire la direttiva <strong>ClientOnionAuthDir</strong> col path contenente i file di autenticazione per l’accesso agli hidden service</p>

<h3 id="2-2-creazione-delle-chiavi-di-autenticazione">2.2. Creazione delle chiavi di autenticazione</h3>

<p>Per ogni hidden service, si deve creare una coppia di chiavi <strong>x25519</strong> pubblica e privata necessarie per l’autenticazione di ogni utente.</p>

<p>Le chiavi, generate con <strong>openssl</strong> e <strong>basez</strong>, sono di tipo <strong>x25519 in base32</strong>.</p>

<h4 id="2-2-1-chiave-pubblica">2.2.1. Chiave pubblica</h4>

<p>La chiave pubblica andrà posizionata sul server nella cartella <strong>[HiddenServiceDir]/authorized_clients</strong>.</p>

<p>La sintassi del file dovrà rispettare questa forma:
<code>descriptor:x25519:&lt;chiave pubblica x25519 in base32&gt;</code></p>

<p>e il nome file dovrà essere
<code>&lt;nome file&gt;.auth</code></p>

<h4 id="2-2-2-chiave-privata">2.2.2. Chiave privata</h4>

<p>La chiave privata andrà posizionata nel client nella cartella indicata da <strong>[ClientOnionAuthDir]</strong>.</p>

<p>La sintassi del file dovrà rispettare questa forma:
<code>&lt;indirizzo servizio onion senza estensione&gt;:descriptor:x25519:&lt;chiave privata x25519 in base32&gt;</code></p>

<p>e il nome file dovrà essere:
<code>&lt;nome file&gt;.auth_private</code></p>

<p>Per rendere effettive le modifiche sul file torrc, sia sui client che sul server, si deve riavviare il servizio Tor.</p>

<h2 id="3-configurazione-reale-di-due-hidden-service-web-e-ssh">3. Configurazione reale di due hidden service: web e ssh</h2>

<p>Supponiamo per esempio di voler creare due hidden service: web e ssh</p>

<h3 id="3-1-creazione-delle-chiavi">3.1. Creazione delle chiavi</h3>

<p><strong>1. Generazione della chiave openssl x25519</strong></p>

<pre><code class="language-bash"># web
openssl genpkey -algorithm x25519 -out /tmp/web.prv.pem
# ssh
openssl genpkey -algorithm x25519 -out /tmp/ssh.prv.pem
</code></pre>

<p><strong>2. Generazione della chiave privata base 32</strong></p>

<pre><code class="language-bash"># web
cat /tmp/web.prv.pem | grep -v &#34; PRIVATE KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39; &gt; /tmp/web.prv.key
# ssh
cat /tmp/ssh.prv.pem | grep -v &#34; PRIVATE KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39; &gt; /tmp/ssh.prv.key
</code></pre>

<p><strong>3. Generazione della chiave pubblica base 32</strong></p>

<pre><code class="language-bash"># web
openssl pkey -in /tmp/web.prv.pem -pubout | grep -v &#34; PUBLIC KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39; &gt; /tmp/web.pub.key
# ssh
openssl pkey -in /tmp/ssh.prv.pem -pubout | grep -v &#34; PUBLIC KEY&#34; | base64pem -d | tail --bytes=32 | base32 | sed &#39;s/=//g&#39; &gt; /tmp/ssh.pub.key
</code></pre>

<h3 id="3-2-configurazione-lato-server">3.2. Configurazione lato server</h3>

<p><strong>Convenzioni:</strong></p>

<p>Le seguenti convenzioni hanno il solo scopo di dare uniformità e scalabilità alla configurazione del servizio.</p>
<ol><li>Creazione di una cartella diversa per ogni servizio esposto così da avere autenticazioni distinte per servizio e per utente.</li>
<li>Nella cartella del servizio, all’interno di <strong>authorized_clients</strong>, dove andranno posizionate le chiavi pubbliche, il nome delle chiavi sarà nel formato: <code>&lt;nome utente&gt;_&lt;nome servizio&gt;.auth</code></li></ol>

<h4 id="3-2-1-creazione-cartelle-per-gli-hidden-service">3.2.1. Creazione cartelle per gli hidden service</h4>

<pre><code class="language-bash"># HTTP
mkdir -p /var/lib/tor/hidden_service/web/authorized_clients
chown -R toranon:toranon /var/lib/tor/hidden_service/web
 
# SSH
mkdir -p /var/lib/tor/hidden_service/ssh/authorized_clients
chown -R toranon:toranon /var/lib/tor/hidden_service/ssh
</code></pre>

<h4 id="3-2-2-configurazione-etc-tor-torrc">3.2.2. Configurazione /etc/tor/torrc</h4>

<p><code>vi /etc/tor/torrc</code></p>

<pre><code class="language-bash">...
HiddenServiceDir /var/lib/tor/hidden_service/web
HiddenServicePort 1080 127.0.0.1:80
 
HiddenServiceDir /var/lib/tor/hidden_service/ssh
HiddenServicePort 2022 127.0.0.1:22
...
</code></pre>

<p><small><b>Una considerazione sull’esposizione dei servizi.</b>
In questo esempio, i servizi girano sull’interfaccia di loopback ed ho imposto che le porte di esposizione del servizio siano quelle canoniche mentre sui corrispettivi .onion, da utilizzare attraverso i client, le porte sono non standard.</small></p>

<pre><code class="language-bash"># Inizializzazione del servizio Tor per creare gli oggetti necessari all&#39;esposizione, in particolare dell&#39;hostname .onion
systemctl restart tor
</code></pre>

<h4 id="3-2-3-creazione-file-auth-e-riavvio-tor">3.2.3. Creazione file .auth e riavvio tor</h4>

<pre><code class="language-bash"># web
echo &#34;descriptor:x25519:&#34; &gt; /var/lib/tor/hidden_service/web/authorized_clients/utente1_web.auth
cat /tmp/web.pub.key &gt;&gt; /var/lib/tor/hidden_service/web/authorized_clients/utente1_web.auth
 
# ssh
echo &#34;descriptor:x25519:&#34; &gt; /var/lib/tor/hidden_service/ssh/authorized_clients/utente1_ssh.auth
cat /tmp/ssh.pub.key &gt;&gt; /var/lib/tor/hidden_service/ssh/authorized_clients/utente1_ssh.auth
	
# reload delle configurazioni e delle chiavi
systemctl restart tor 
</code></pre>

<h3 id="3-3-configurazione-lato-client">3.3. Configurazione lato client</h3>

<h4 id="3-3-1-convenzioni">3.3.1. Convenzioni</h4>
<ol><li>Creazione di una cartella in cui raccogliere le chiavi private dell’utente</li>
<li>Il nome della chiave sarà:
<code>&lt;nome utente&gt;_&lt;nome servizio&gt;.auth_private</code></li></ol>

<h4 id="3-3-2-creazione-cartella-per-l-autenticazione">3.3.2. Creazione cartella per l’autenticazione</h4>

<pre><code class="language-bash"># SSH
mkdir /var/lib/tor/hidden_service/client_onion_auth
chown toranon:toranon /var/lib/tor/hidden_service/client_onion_auth
</code></pre>

<h4 id="3-3-3-creazione-file-auth-private">3.3.3. Creazione file .auth_private</h4>

<pre><code class="language-bash"># web
cat /var/lib/tor/hidden_service/web/hostname | cut -d &#34;.&#34; -f 1 &gt; /var/lib/tor/hidden_service/client_onion_auth/utente1_web.auth_private
echo &#34;:descriptor:x25519:&#34; &gt;&gt; /var/lib/tor/hidden_service/client_onion_auth/utente1_web.auth_private
cat /tmp/web.priv.key &gt;&gt; /var/lib/tor/hidden_service/client_onion_auth/utente1_web.auth_private
 
# ssh
cat /var/lib/tor/hidden_service/ssh/hostname | cut -d &#34;.&#34; -f 1 &gt; /var/lib/tor/hidden_service/client_onion_auth/utente1_ssh.auth_private
echo &#34;:descriptor:x25519:&#34; &gt;&gt; /var/lib/tor/hidden_service/client_onion_auth/utente1_ssh.auth_private
cat /tmp/ssh.priv.key &gt;&gt; /var/lib/tor/hidden_service/client_onion_auth/utente1_ssh.auth_private
</code></pre>

<h4 id="3-3-4-configurazione-etc-tor-torrc-e-riavvio-tor">3.3.4. Configurazione /etc/tor/torrc e riavvio tor</h4>

<p>Nel file <strong>/etc/tor/torrc</strong> si deve modificare la direttiva <strong>ClientOnionAuthDir</strong>:</p>

<pre><code>...
ClientOnionAuthDir /var/lib/tor/hidden_service/client_onion_auth
...
</code></pre>

<p>Dopodiché si riavvia il servizio tor per rendere consistente la modifica:</p>

<pre><code class="language-bash"># Reload del servizio e acquisizione delle chiavi
systemctl restart tor
</code></pre>

<h2 id="4-conclusione">4. Conclusione</h2>

<p>I servizi ora sono pronti per essere fruiti.</p>

<p>Nel caso del servizio web, non è necessaria la configurazione lato client di tor se si usa <strong>Tor Browser</strong>.</p>

<p>Per accedere in ssh attraverso tor si può provare in paio di modi.</p>

<p>  1) Usando l’utility <code>torify</code>, normalmente installata insieme a tor:</p>

<pre><code class="language-bash">torify ssh -p2022 user1@ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion
</code></pre>

<p>  2) Direttamente in ssh usando <code>ProxyCommand</code> per veicolare la connessione ssh attraverso tor:</p>

<pre><code class="language-bash">ssh -p2022 user1@ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion  -o ProxyCommand=&#34;ncat --proxy 127.0.0.1:9050 --proxy-type socks5 ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion 2022&#34;
</code></pre>

<p><strong>tips:</strong>
Usando una configurazione opportuna in <strong>$HOME/.ssh/config</strong>, l’utilizzo del servizio si semplifica notevolmente.</p>

<p>In .ssh/config:</p>

<pre><code>Host ssh_service.onion
    Hostname ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion
    User user1
    Port 2022
    VerifyHostKeyDNS no
    ProxyCommand ncat --proxy 127.0.0.1:9050 --proxy-type socks5 %h %p
</code></pre>

<p>A questo punto per accedere in ssh basta: <code>ssh ssh_service.onion</code></p>

<p><b><u>Note a margine:</u></b></p>
<ol><li>Il sistema di riferimento è Fedora 34</li>
<li>A differenza di SO debian-based, sui repository di Fedora 34 <code>basez</code> non è disponibile e va compilato.</li>
<li>La configurazione e l’hardenizzazione dei servizi da “torificare” esula dallo scopo di questo articolo, così come il dettaglio della configurazione di Tor</li></ol>

<h2 id="riferimenti">Riferimenti:</h2>
<ul><li><a href="https://tb-manual.torproject.org/onion-services/" rel="nofollow">https://tb-manual.torproject.org/onion-services/</a></li>
<li><a href="https://community.torproject.org/onion-services/setup/" rel="nofollow">https://community.torproject.org/onion-services/setup/</a></li>
<li><a href="https://community.torproject.org/onion-services/advanced/client-auth/" rel="nofollow">https://community.torproject.org/onion-services/advanced/client-auth/</a></li></ul>

<p><a href="/aytin/tag:clientauthorization" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">clientauthorization</span></a> <a href="/aytin/tag:hiddenservice" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">hiddenservice</span></a> <a href="/aytin/tag:ssh" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ssh</span></a> <a href="/aytin/tag:tor" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">tor</span></a> <a href="/aytin/tag:torify" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">torify</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/tor-configurare-hidden-service-con-autenticazione</guid>
      <pubDate>Wed, 01 Mar 2023 09:46:35 +0000</pubDate>
    </item>
  </channel>
</rss>