Configurazione di un bastione SSH con mTLS su HAProxy integrato con Windows Enterprise CA – Parte 3

da | Mar 30, 2026

 

Negli articoli precedenti di questa serie è stato mostrato come configurare HaAProxy per servire da bastione SSH e come configurare i templates della Windows Enterprise CA per distribuire i certificati dei clients mediante Active Directory.

In questo articolo verranno mostrati i passaggi per configurare i propri clients per collegarsi ai server in SSH passando da bastione ed autenticandosi con i certificati forniti dalla Enterprise CA.

Verrà proposta una configurazione cross-platform che sfrutta OpenSSL che però abbiamo riscontrato avere delle pessime performance su Windows, perciò verrà anche analizzata una configurazione più prestante sul sistema operativo di Microsoft che utilizza il software Stunnel.

REQUISITI

Al fine di poter procedere è necessario essere in possesso di una coppia di chiavi rilasciate dalla CA considerata attendibile da HAProxy per l’autenticazione mediante mTLS.

Se si ha seguito l’articolo precedente si dovrebbe essere in possesso di un certificato valido e la relativa chiave privata nel proprio Trust Store, nei prossimi passaggi verrà mostrato come entrarre la coppia di chiavi per utilizzarle per l’autenticazione con HAProxy.

Linux e MacOS vengono distribuiti con il comando ssh ed il comando openssl pronti all’uso, su Windows, invece, potrebbe essere necessario installare del software aggiuntivo.

Inoltre, per l’utilizzo di Stunnel è necessario installare il relativo pacchetto ed il software ncat, oltre che essere in possesso di una copia del certificato della CA, utilizzata su HAProxy per la validazione dei certificati dei clients, in formato PEM.

Infine si consiglia la lettura del seguente articolo al fine di comprendere meglio il funzionamento della configurazione del client SSH.

Configurazione del client SSH per superare i firewall su Windows, Linux e MacOS

 

INSTALLAZIONE SSH SU WINDOWS

Il client SSH è una Windows Capability a partire da Windows 10 ed è possibile abilitarlo mediante PowerShell.

Per verificare se la funzionalità è già attiva eseguire il seguente comando in una PowerShell amministrativa:

Se il client è abilitato l’output mostrato dovrebbe essere simile al seguente:

Altrimenti, è possibile installarlo con il seguente comando:

 

 

INSTALLAZIONE OPENSSL SU WINDOWS

Mediante PowerShell è possibile verificare se “openssl” è presente sulla propria macchina, per farlo eseguire in una PowerShell con il proprio utente (non da ) il seguente comando:

Se è installata la versione nativa per Windows di OpenSSL l’output dovrebbe essere simile al seguente:

È possibile che si stia utilizzando un eseguibile fornito insieme a msys64, in questo caso è possibile installare la versione nativa e modificare il PATH di sistema per puntare alla versione appena installata.

Per installare OpenSSL mediante Chocolatey è possibile eseguire il seguente comando in una PowerShell amministrativa:

In alternativa il programma di installazione è disponibile sul sito di Shining Light Productions

Al termine dell’installazione potrebbe essere necessario chiudere la PowerShell e riaprirla prima di poter utilizzare openssl.

 

ESPORTAZIONE DI UN CERTIFICATO CON CHIAVE PRIVATA DAL PERSONAL TRUST STORE

Nel precedente articolo di questa serie è stato mostrato come richiedere un certificato dallo snap-in certmgr.msc ed importarlo nel Personal Trust Store.

Per poterlo utilizzare dal browser sarebbe sufficiente, tuttavia non è lo stesso caso per il protocollo SSH, perciò necessitiamo di esportarlo.

Per esportare un certificato e la relativa chiave privata è necessario selezionarlo, effettuare click destro, navigare con il mouse su All Tasks e selezionare Export:

Procedere cliccando su Next:

Selezionare Yes, export the private key e cliccare su Next:

Selezionare Export all extended properties e procedere cliccando su Next:

Abilitare Password, sceglierne una e scriverla due volte, modificare l’agoritmo di criptografia in AES256-SHA256 e cliccare su Next:

Cliccare su Browse, selezionare il percorso in cui si vuole esportare il file, poi procedere cliccando su Next:

Concludere la procedura cliccando su Finish:

Infine, confermare cliccando su OK:

ESTRAZIONE DI UNA COPPIA DI CHIAVI DA UN FILE PFX

L’esportazione di una coppia di chiavi (certificato + chiave privata) dallo snap-in di Windows richiede che venga configurata una password o che vengano configurate delle ACL e che il formato dell’output sia PFX.

Per poter utilizzare il mTLS mediante OpenSSL o Stunnel è necessario essere in possesso di due files in formato PEM, perciò bisogna procedere all’estrazione del certificato e della chiave privata dal file PFX.

I comandi mostrati in questo paragrafo sono compatibili con Linux e MacOS.

Il file PFX utilizzato per esempio si chiama user.pfx, è necessario sostituire il nome opportunamente nei propri comandi; inoltre, si assume che la PowerShell o il CMD venga aperto nella directory in cui è stato salvato il file PFX.

Per estrarre il certificato eseguire con il proprio utente in una PowerShell o in un CMD:

Inserire la password che si è scelta durante l’esportazione.

Per estrarre la chiave privata eseguire con il proprio utente in una PowerShell o in un CMD:

Inserire la password scelta durante l’esportazione.

 

CONFIGURAZIONE DEL TUNNEL CON OPENSSL

Per configurare un client per utilizzare il bastione per connettersi ad un server è sufficiente aggiungere una direttiva al proprio file ~/.ssh/config.

Se non esiste la directory .ssh nella propria HOME (tipicamente su Linux /home/<username> e su Windows C:\Users\<username>) è necesario crearla ed assicurarsi che solo il proprio utente ci possa accedere.

Su Windows si consiglia fortemente di disabilitare l’ereditarietà dei permessi su quella folder e di assegnare solamente tre ACL Full control al proprio utente, a SYSTEM e agli Administrators.

Nella directory .ssh creare, se non già esiste, un file di testo (senza estensione) chiamato config, in questo file è possibile configurare le connessioni SSH verso i propri servers.

Aggiungere o modificare nel file config l’host a cui ci si vuole collegare mediante il bastione aggiungendo la direttiva ProxyCommand, in seguito viene riportato un esempio:

Le informazioni da modificare dall’esempio precedente sono le seguenti:

  • local-srv01 alias01 sostituire con i nomi che si vogliono utilizzare per collegarsi dal client ssh (eg. ssh alias01)
  • local-srv01.pizza.local sostituire con l’FQDN del server a cui ci si vuole collegare, vicino ad HostName si può inserire anche solo l’hostname, oppure un alias
  • root sostituire con l’utenza con cui ci si vuole autenticare
  • 192.168.1.100 sostituire con l’IP o il nome DNS del VIP di HAProxy o dell’IP esposto mediante NAT
  • ~/.ssl/user.crt sostituire con il percorso del certificato del client
  • ~/.ssl/user.key sostituire con il percorso della chiave privata del client

Se tutto è stato configurato correttamente è possibile collegarsi al server remoto da un terminale eseguendo:

Ad esempio:

 

INSTALLAZIONE DEL SOFTWARE AGGIUNTIVO PER STUNNEL

Abbiamo riscontrato che il tunnel effettuato con OpenSSL su Windows ha delle pessime performace e che questo causa dei fastidiosi rallentamenti quando vengono lanciati dei comandi nella sessione SSH.

Per ovviare a questa problematica è possibile implementare il tunner mediante altri software che facciano utilizzo del provider di criptografia nativo di Windows, un esempio di questi software è Stunnel.

Un amministratore, mediante dei files di configurazione, può impostare le connessioni da utilizzare come tunnels e gli utenti possono avviarli da interfaccia grafica, per poi connettersi in SSH come farebbero con il tunnel OpenSSL.

Affinché sia possibile instradare le connessioni SSH verso il tunnel è necessario un software aggiuntivo, ne esistono diversi che svolgono questo ruolo, noi abbiamo testato ncat.

Il software ncat è incluso con l’installazione per Windows di Nmap, tuttavia se non si volesse installare anche Nmap sarebbe possibile effettuare il download dell’eseguibile statico dal sito ufficiale https://nmap.org/ncat/

L’installazione di Nmap mediante Chocolatey necessita di AutoHotkey ed a volte per questo motivo non funziona correttamente, in questi casi si consiglia di utilizzare l’installer ufficale preso dal sito web.

Per installare Nmap con Chocolatey eseguire in una PowerShell amministrativa il seguente comando:

L’installazione di Stunnel mediante Chocolatey funziona correttamente, però è comunque possibile effettuarla con un software di installazione ufficiale scaricabile dal sito ufficiale https://www.stunnel.org/downloads.html

Per installare Stunel con Chocolatey eseguire in una PowerShell amministrativa il seguente comando:

 

 

CONFIGURAZIONE DI STUNNEL

Prima di partire con la configurazione di Stunnel è necessario copiarsi in una cartella a piacere il certificato della CA ed il certificato e la chiave privata del client, tutti in formato PEM.

La procedura di esportazione del certificato dell’utente è stata mostrata nei paragrafi precedenti, invece il certificato della CA è stato utilizzato nel primo articolo di questa serie, quando è stata mostrata la configurazione di HAProxy.

Per aprire la configurazione di Stunnel è possibile eseguire Edit stunnel.conf dal menù Start:

Oppure, in alternativa, è possibile aprire il file C:\Program Files (x86)\stunnel\config\stunnel.conf con un editor di testo con privilegi amministrativi.

Nel file di configurazione decommentare la seguente riga:

Inoltre, nello stesso file, commentare tutti gli esempi di default, come ad esempio:

Nella cartella C:\Program Files (x86)\stunnel\config\conf.d è possibile aggiungere i files di configurazione dei tunnels.

Per creare la cartella e le configurazioni è possibile utilizzare lo stesso blocco note che si stava utilizzando per modificare il file stunnel.conf, per farlo aprire un nuovo tab cliccando sul simbolo + in alto:

Incollare il seguente contenuto:

Le informazioni da modificare dall’esempio precedente sono le seguenti:

  • 22100 sostituire con la porta che deve essere dedicata al tunnel, su cui Stunnel si deve mettere in ascolto
  • local-srv01.pizza.local sostituire con l’FQDN del server a cui ci si vuole collegare
  • 192.168.1.100 sostituire con l’IP o il nome DNS del VIP di HAProxy o dell’IP esposto mediante NAT
  • C:\SSL\MyLocalCA.crt sostituire con il percorso del certificato della CA
  • C:\SSL\user.crt sostituire con il percorso del certificato del client
  • C:\SSL\user.key sostituire con il percorso della chiave privata del client

È possibile specificare più di un tunnel nello stesso file a patto che il nome tra le parentesi quadrate sia univoco, per ogni server protetto dal bastione bisogna configurare un tunnel dedicato che utilizzi una porta su cui mettersi in ascolto univoca (in questo caso la 22100).

Cliccare su File e poi su Save with name:

Navigare al percorso C:\Program Files (x86)\stunnel\config, creare la folder conf.d cliccando su New folder e navigarci all’interno:

Nella folder conf.d salvare il file con un nome a piacere che abbia l’estensione .conf:

Per avviare i tunnels è possibile eseguire stunnel GUI Start dal menù Start:

In caso di problemi di configurazione viene aperta una finestra simile alla seguente in cui è indicato l’errore:

In questi casi correggere l’errore, cliccare su Configuration nella UI di Stunnel e poi su Reload Configuration:

Mentre Stunnel è in esecuzione è possibile visualizzare la sua interfaccia grafica cliccando sulla sua icona in basso a destra:

Per fermare i tunnels è possibile eseguire stunnel GUI Stop dal menù Start:

 

CONFIGURAZIONE DEL TUNNEL CON STUNNEL

Dopo aver configurato Stunnel è possibile impostare il client SSH per instradare le connessioni verso di esso.

Per farlo, analogamente a come è stato descritto nel paragrafo CONFIGURAZIONE DEL TUNNEL CON OPENSSL è necessario aggiungere una direttiva al proprio file ~/.ssh/config.

Se non si ha già creato il file ~/.ssh/config seguire i primi passaggi del paragrafo CONFIGURAZIONE DEL TUNNEL CON OPENSSL per crearlo.

Aggiungere o modificare nel file config l’host a cui ci si vuole collegare mediante il bastione aggiungendo la direttiva ProxyCommand, in seguito viene riportato un esempio:

Le informazioni da modificare dall’esempio precedente sono le seguenti:

  • local-srv01 alias01 sostituire con i nomi che si vogliono utilizzare per collegarsi dal client ssh (eg. ssh alias01)
  • local-srv01.pizza.local sostituire con l’FQDN, l’hostname o un alias del server a cui ci si vuole collegare
  • root sostituire con l’utenza con cui ci si vuole autenticare
  • 22100 sostituire con la porta del tunnel configurata su Stunnel per quello specifico server

Se tutto è stato configurato correttamente è possibile collegarsi al server remoto da un terminale eseguendo:

Ad esempio:

Se viene mostrato un errore simile al seguente:

Potrebbe essere causato dal fatto che ncat.exe non è ancora disponibile sul PATH, in questi casi si consiglia di disconnettere la sessione di Windows ed accedere nuovamente.

Se invece l’errore mostrato è simile al seguente:

Significa che probabilmente non è stato avviato correttamente Stunnel.

TROUBLESHOOTING ERRORI DI CONNESSIONE DAI LOGS DI HAPROXY

Se viene mostrato un errore simile al seguente durante la connessione:

È possibile che stiano avvenendo degli errori durante il TLS handshake e per verificarlo è possibile controllare i logs di HAProxy.

Collegarsi al nodo primario di HAProxy come root ed eseguire il seguente comando per visualizzare i logs:

Se l’handshake fallisce a causa di uno SNI non supportato da HAProxy (ad esempio a causa del dominio del server errato), l’errore nei logs è simile al seguente:

Se, invece, l’handshake fallisce a causa di errore di autorizzazione l’errore nei logs è simile al seguente:

Mediante le informazioni contenute nel log è possibile verificare la DN e l’email del certificato del client, per poi controllare in seguito che l’utente sia autorizzato dalle ACL di HAProxy.

Articoli Recenti

Veeam Backup

Monitoring

Friends

  • My English Lab  English School
  • ChrSystem   Servizi ICT
  • Since 01  Kreative Graphics

Database

Networking

Autori

  • Raffaele Chiatto  Amministratore
  • Marco Valle  Autore
  • Angelo Lauria  Autore
  • Edoardo Prot  Autore
  • Davide D’Urso  Autore
Marco Valle

Marco Valle

Mi chiamo Marco Valle e da sempre sono appassionato di Cybersicurezza e Linux. Per lavoro implemento soluzioni open source.

Related Post

0 commenti

Invia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Virtualizzazione

Linux

Microsoft

Apple

Backup

Database

Security

Automazione