<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>fwknop &amp;mdash; Cyberdyne Systems</title>
    <link>https://noblogo.org/aytin/tag:fwknop</link>
    <description>&#34;Fare o non fare. Non c&#39;è provare!&#34;</description>
    <pubDate>Thu, 30 Apr 2026 12:12:09 +0000</pubDate>
    <item>
      <title>fwknop: proteggere servizi con Single Packet Authorization (SPA)</title>
      <link>https://noblogo.org/aytin/fwknop-proteggere-servizi-con-single-packet-authorization-spa</link>
      <description>&lt;![CDATA[fwknop&#xA;Cos&#39;è fwknop&#xA;fwknop è un software di port knocking che usa uno schema di autenticazione chiamato &#34;Single Packet Authorization&#34; ipotizzato e formalizzato dallo stesso autore per risolvere le debolezze più comuni del classico port-knocking.&#xA;!--more--&#xA;&#xA;Cos&#39;è fwknop&#xA;Installazione client e server&#xA;Configurazione client&#xA;   Generazione della sola chiave&#xA;   Generazione chiave + configurazione complessa&#xA;Configurazione server&#xA;Scenari&#xA;    Protezione di un servizio con SPA&#xA;       Configurazione lato server&#xA;       Configurazione lato client&#xA;    Ghost locale sullo spaserver&#xA;       Configurazione lato server&#xA;       Invocazione client&#xA;    SPA attraverso gateway NAT&#xA;       Configurazione lato server&#xA;       Invocazione client&#xA;    SPA Ghost Service&#xA;       Invocazione client&#xA;E se volessi usare la crittografia asimmetrica?&#xA;Osservazioni su access.conf&#xA;   Configurazione stanze con spa server come bastion host &#xA;   Alice&#xA;   Bob&#xA;   Carol&#xA;&#xA;fwknop, come il port knocking, unisce la comunicazione passiva di informazioni di autenticazione al filtraggio di tutti i pacchetti che non rispettano le sequenze di knock.&#xA;&#xA;Il classico approccio di port-knocking sfrutta le intestazioni dei pacchetti (2 byte) e non il loro payload, per cui è necessario mandare un certo numero di pacchetti per mappare una porta senza generare falsi positivi. Questo però comporta inevitabilmente almeno due problemi:&#xA;&#xA;suscettibilità ad attacchi di spoofing&#xA;se le sequenze di knocking sono eccessivamente articolate (magari per inviare più informazioni), data l&#39;imprevedibilità della rete e l&#39;assenza di costrutti che garantiscano lo stesso ordine d&#39;arrivo dei pacchetti, c&#39;è la possibilità che il server non riesca a ricostruire la sequenza corretta. &#xA;&#xA;Il client fwknop (SPA Client) invia al server (SPA Server) un singolo pacchetto di dimensioni relativamente maggiori (possibile sfruttando il payload) per comunicare informazioni di accesso e interi comandi destinati al filtraggio dei pacchetti.&#xA;&#xA;Il tutto viene protetto da una cifratura simmetrica con autenticazione (aes256-cbc + hmac-sha256, che sarà quella usata nel prosieguo perché più semplice da gestire) o asimmetrica che, al costo di una maggiore complessità di gestione, aggiunge la caratteristica di non ripudio alle caratteristiche di confidenzialità, integrità e autenticazione possedute anche dal primo schema di cifratura.&#xA;&#xA;Installazione client e server&#xA;fwknop client e server sono pacchettizzati per ogni distro linux (su Mac OS è possibile ricorrere a brew).&#xA;Sistemi rpm-based&#xA;Installa il client (fwknop) e il server (fwknopd)&#xA;dfn install fwknop&#xA;Sistemi debian-based&#xA;Installa il client (fwknop)&#xA;apt install fwknop-client&#xA;&#xA;Installa il server (fwknopd)&#xA;apt install fwknop-server&#xA;Configurazione client&#xA;La configurazione lato client viene conservata nel file .fwknoprc che può essere editato a a mano oppure attraverso il client fwknop salvando nel file .fwknoprc quelle che vengono definite &#34;stanze&#34;.&#xA;&#xA;Nella configurazione è molto importante la generazione della chiave. Se la chiave è simmetrica, la si può generare con fwknop.&#xA;&#xA;Di seguito, due esempi di creazione di stanze con fwknop, una minimale (che useremo nel resto del documento) e una più complessa.&#xA;Generazione della sola chiave&#xA;Genero la chiave usando il default: aes256-cbc + hmac-sha256.&#xA;fwknop -n test -k --use-hmac --save-rc-stanza&#xA;E in .fwknoprc troverò una nuova sezione [test]&#xA;[test]&#xA;KEYBASE64                  dRYAH2O9FCUpNz1aMmlke9/AkGVdcLrnWxDy7jZC1wg=&#xA;HMACKEYBASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==&#xA;USEHMAC                    Y&#xA;Generazione chiave + configurazione complessa&#xA;fwknop -n test -k -A tcp/80 -R -w /usr/bin/wget -D 107.23.186.49 -N 10.0.0.132:3306 --save-rc-stanza&#xA;che ha  il corrispondente .fwknoprc:&#xA;[test]&#xA;ACCESS                      tcp/80&#xA;SPASERVER                  107.23.186.49&#xA;KEYBASE64                  0d/VcRXnf2si7hvfDsPN3YIG4Q7aPLU9Ndd5Pe+eMIQ=&#xA;HMACKEYBASE64             EEXu0VCPQKPGp8FC8tYS6I/p56nWlot93BV3CPVf3De9FkM04z1SBWTUEJejHpq45+at7VQirgTYvSxeLoZkKQ==&#xA;NATACCESS                  10.0.0.132:3306&#xA;RESOLVEIPHTTPS            Y&#xA;WGETCMD                    /usr/bin/wget&#xA;La spiegazione di questa configurazione specifica la troveremo più avanti nel par. 4. SPA Ghost Service. È solo per far vedere che il file di configurazione .fwknoprc può essere rimpiazzato in toto dall&#39;invocazione via cli del client. Chiave compresa, se è il caso.&#xA;&#xA;Affinché la &#34;stanza&#34; venga creata, deve necessariamente essere presente almeno uno fra valori dei flag -D e -n. Quest&#39;ultimo costituirà anche il nome alla sezione corrispondente, altrimenti sarà il valore di -D .&#xA;&#xA;Per usare il cient con le preimpostazioni di .fwinoprc, basterà indicare il nome della sezione:&#xA; fwknop -n test&#xA;Ne consegue che i nomi di sezione devono essere univoci.&#xA;&#xA;Da ricordare che quando si usa il client  quello che è importante specificare nel file .fwknoprc o nei parametri è:&#xA;&#xA;ALLOW\IP (-a): che indica l&#39;ip da cui sto facendo la richiesta e che deve rientrare nel SOURCE specificato nel server. Se l&#39;ip non è noto magari perché lo spaclient viene nattato, si può ricorrere alla risoluzione dell&#39;ip che viene instradato esternamente (chiamando un servizio esterno):&#xA;   RESOLVE\IP\HTTPS (-R): booleano [Y|N] per abilitare lo spaclient a richiedere la risoluzione del proprio ip;&#xA;   WGET\CMD (-w): path del comando wget che chiamerà lo script di risoluzione&#xA;ACCESS (-A): benché non sia obbligatorio per il server, il client deve necessariamente specificare a quali porte/protocolli intende accedere. Se specificati anche nel server, devono appartenere alla sua lista&#xA;SPA\SERVER (-D): indica l&#39;ip o l&#39;url dello spaserver&#xA;KEY: la chiave simmetrica per AES-CBC (default: aes256);&#xA;HMAC\KEY: la chiave per HMAC (default: sha256)&#xA;&#xA;Configurazione server&#xA;Il server si compone di due file:&#xA;&#xA;fwknopd.conf: configura il servizio.&#xA;È il punto in cui si imposta la porta su cui il servizio sarò in ascolto per ricevere il pacchetto, l&#39;interfaccia, le configurazioni, anche complesse, dei firewall da manipolare in seguito al port-knocking (iptables, firewalld, ipf);&#xA;access.conf: regola gli accessi degli utenti.&#xA;È il punto in cui si indicano quegli elementi  necessari ad autenticare ed autorizzare gli utenti, elementi che dovranno coincidere con ciò che contiene il pacchetto.&#xA;È possibile creare una cartella, da indicare in fwknopd.conf, contenente singole configurazioni di accesso, per utente o per policy, piuttosto che creare un unico, lungo elenco in access.conf.&#xA;&#xA;Anche access.conf è un elenco di &#34;stanze&#34;, i punti d&#39;accesso per i client contenenti come minimo la rete abilitata all&#39;accesso e la chiave con cui si presenta l&#39;utente, come visto in Configurazione client: &#xA;&#xA;SOURCE: gli ip o le subnet del client da abilitare all&#39;accesso&#xA;KEY: la chiave simmetrica per AES-CBC (default: aes256)&#xA;HMAC\KEY: la chiave per HMAC (default: sha256)&#xA;&#xA;Altri parametri utili a rafforzare ulteriormente il legame con le richieste client, ma non obbligatori per l&#39;avvio del servizio, sono:&#xA;&#xA;OPEN\PORTS: specifica quali porte e quali protocolli abilitare&#xA;REQUIRE\USERNAME: specifica un nome utente col quale il client si deve presentare&#xA;REQUIRE\SOURCE\ADDRESS: impone che il client specifichi l&#39;ip da cui sta facendo la richiesta in modo da mitigare la possibilità di attacchi MITM&#xA;&#xA;Quando queste opzioni sono presenti sul server, dovranno essere obbligatoriamente specificate anche nel client.&#xA;Dopo aver visto le configurazioni di client e server, vedremo fwknop in azione in alcuni casi &#34;reali&#34;. &#xA;&#xA;Scenari&#xA;Grazie alla sua capacità sia di manipolare, anche in maniera piuttosto articolata, i firewall che concedono l&#39;accesso alle risorse che ad eseguire interi comandi che fwknop mostra tutta la sua versatilità.&#xA;&#xA;In particolare è col NAT che riesce ad andare oltre la sua natura di port knocking dove, grazie ad una combinazione di DNAT e SNAT, riesce a:&#xA;&#xA;girare richieste su server, che normalmente non sarebbero raggiungibili, posti nel backend insieme allo stesso spaserver o dietro di esso&#xA;presentare un servizio su una porta diversa rispetto a quella su cui è in ascolto&#xA;&#xA;diventando a tutti gli effetti un bastion host per l&#39;esposizione autenticata e sicura di servizi critici.&#xA;&#xA;Riassumendo, fwknop può:&#xA;&#xA;essere messo direttamente sul server a protezione di uno o più servizi (caso classico);&#xA;può nattare un servizio sullo stesso spaverser con un inoltro delle porte locali e, contestualmente, ghostare un servizio con un altro&#xA;può nattare un servizio posto nel backend;&#xA;come prima, traslare porte e/o &#34;ghostare&#34; servizi &#xA;&#xA;Gli scenari che andrò a mostrare, copriranno i casi più comuni:&#xA;&#xA;Protezione di un servizio con SPA&#xA;Ghost locale sullo spaserver&#xA;SPA attraverso Gateway NAT&#xA;SPA Ghost Service&#xA;&#xA;Lato client, fwknop usi baserà sempre sulla configurazione minimale vista prima nel paragrafo &#34;Configurazione client&#34;/u. Il resto delle configurazioni verrà passato via cli.&#xA;&#xA;1. Protezione di un servizio con SPA&#xA;La cosa più semplice da fare è mettere lo spaserver a protezione diretta del servizio insieme ad un firewall che implementa una policy default-drop.&#xA;Ipotizziamo ad es. di proteggere l&#39;accesso in ssh sul nodo centrale (192.168.100.10) di una rete a stella.&#xA;&#xA;fwknop spa server&#xA;&#xA;Configurazione lato server&#xA;&#xA;fwknopd.conf:&#xA;PCAPINTF                   eth1;&#xA;PCAPFILTER                 udp port 62201;&#xA;&#xA;access.conf:&#xA;%includefolder /etc/fwknop/access.conf.d&#xA;&#xA;test.conf:&#xA;SOURCE                      192.168.100.0/24&#xA;REQUIRESOURCE              Y&#xA;KEYBASE64                  dRYAH2O9FCUpNz1aMmlke9/AkGVdcLrnWxDy7jZC1wg=&#xA;HMACKEYBASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==&#xA;&#xA;Configurazione lato client&#xA;&#xA;.fwknoprc:&#xA;[test]&#xA;KEYBASE64                  dRYAH2O9FCUpNz1aMmlke9/AkGVdcLrnWxDy7jZC1wg=&#xA;HMACKEYBASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==&#xA;USEHMAC                    Y&#xA;&#xA;fwknop:&#xA;fwknop -n test -a 192.168.100.15 -A tcp/22 -D 192.168.100.10&#xA;ssh 192.168.100.10&#xA;&#xA;Supponiamo adesso di voler proteggere l&#39;accesso ssh di una macchina dove però il client , caso molto frequente, sia in una rete privata e nattato con un ip pubblico (rete domestica o rete mobile per es.).&#xA;&#xA;Non possiamo sapere con certezza quale sarà l&#39;ip del client per cui, lato server, dovrò essere disposto ad accettare qualunque sorgente e lato client lascerò che l&#39;ip venga risolto dinamicamente. &#xA;&#xA;fwknop con client nat&#xA;&#xA;fwknop -n test -R -w /usr/bin/wget -A tcp/22 -D 107.23.186.49&#xA;ssh 107.23.186.49&#xA;L&#39;opzione:&#xA;&#xA;-R permette di risolvere il proprio ip pubblico usando wget ( di cui va dato il path) che richiamerà uno script posto di default in https://www.cipherdyne.org/cgi-bin/myip, altrimenti se ne può specificare un altro analogo con --resolve-url url. Questo perché l&#39;ip reale del client viene nattato con l&#39;ip pubblico 154.23.162.98, quindi il pacchetto inviato allo spaserver deve contenere questo IP come richiedente, non quello privato (che altrimenti non riceverebbe mai risposta)&#xA;-D serve sempre per specificare l&#39;ip, stavolta pubblico, dello spaserver  (107.23.186.49) &#xA;&#xA;N.B.  Non sapendo quale sarà l&#39;ip richiedente, la clausola  SOURCE nel file test.conf non potrà contenere un ip o una subnet, quanto piuttosto:&#xA;...&#xA;SOURCE                      ANY&#xA;...&#xA;2.  Ghost locale sullo spaserver&#xA;Assumiamo che la topologia di rete sia semplice come quella del caso precedente ma ipotizziamo che il client che si autentichi con SPA, acceda ad un servizio protetto la cui porta sia associata contemporaneamente ad un altro servizio esposto pubblicamente.&#xA;&#xA;In questo modo qualunque un altro client (anche attori malevoli) che volesse connettersi a quella porta, continuerebbe a vedere solo il servizio pubblico e non quello protetto.&#xA;&#xA;Questa magia viene resa possibile grazie ad un DNAT locale che mappa temporaneamente, e solo per quell&#39;ip, la porta pubblica con quella del servizio da proteggere.&#xA;&#xA;Nel nostro esempio vogliamo accedere in ssh alla macchina ma sulla porta 80, corrispondente ad un servizio web esposto pubblicamente.&#xA;&#xA;fwknop con server local nat&#xA;&#xA;Configurazione lato server&#xA;&#xA;fwknopd.conf:&#xA;PCAPINTF                   enp0s8;&#xA;ENABLEIPTFORWARDING       Y;&#xA;ENABLEIPTLOCALNAT        Y;&#xA;&#xA;access.conf:&#xA;Rimane invariato.&#xA;&#xA;Invocazione client&#xA;&#xA;fwknop: &#xA;&#xA;fwknop -n test -R -w /usr/bin/wget -A tcp/22 -D 107.23.186.49 --nat-local --nat-port 80&#xA;ssh 107.23.186.49 -p80&#xA;&#xA;3. SPA attraverso gateway NAT&#xA;In questo caso lo spa server verrà usato come gateway per accedere a servizi posti sulla rete interna. ad es. un db mybsql su una macchina (10.0.0.132) posta dietro lo spa server.&#xA;&#xA;Per ottenere tutto questo, bisogna abilitare il port forwarding e il SNAT nel file fwknopd.conf in modo che vengano create le regole DNAT e MASQUERADE su iptables affinché le richieste vengano inoltrate rispettivamente verso la macchina  che eroga il servizio (mysql) e che i pacchetti di ritorno viaggino correttamente verso lo spa server e quindi verso il client. Il file access.conf rimane invariato&#xA;&#xA;fwknop con gateway nat&#xA;&#xA;Configurazione lato server&#xA;&#xA;fwknopd.conf:&#xA;&#xA;PCAPINTF                   enp0s8;&#xA;ENABLEIPTFORWARDING       Y;&#xA;ENABLEIPTSNAT             Y;&#xA;&#xA;Invocazione client&#xA;fwknop: &#xA;&#xA;fwknop -n test -R -w /usr/bin/wget -A tcp/3306 -D 107.23.186.49 -N 10.0.0.132&#xA;mysql -h 107.23.186.49 -u user -p&#xA;4. SPA Ghost Service&#xA;Adesso vogliamo che l&#39;accesso a mysql venga &#34;nascosto&#34; da un servizio legittimo esposto pubblicamente (un servizio http sulla porta 80).&#xA;&#xA;fwknop con ghost service&#xA;&#xA;La configurazione lato server (fwknopd.conf, access.conf) rimane invariata rispetto a prima.&#xA;&#xA;Invocazione client&#xA;fwknop: &#xA;&#xA;fwknop -n test -A tcp/80 -R -w /usr/bin/wget -D 107.23.186.49 -N 10.0.0.132:3306&#xA;mysql -h 107.23.186.49:80 -u user -p &#xA;E se volessi usare la crittografia asimmetrica?&#xA;La crittografia asimmetrica usata con hmac costituisce un ulteriore enhancement di sicurezza.&#xA;&#xA;Mentre con la crittografia simmetrica+hmac si ha una sorta di implicito mutuo riconoscimento, con la crittografia asimmetrica è sufficiente che il client sia riconosciuto dal server.&#xA;&#xA;Affinché ciò avvenga, il client inva il pacchetto spa firmato con la sua chiave privata e lo cifra con la chiave pubblica dello spaserver.&#xA;Lo spaserver riceve il pacchetto, verifica la firma con la chiave pubblica del client, lo decifra con la sua chiave privata, proseguendo poi col resto del processo di autorizzazione e accesso.&#xA;&#xA;È consigliata la creazione di chiavi apposite per fwknop, non quelle personali. Per il client creeremo una chiave di sola firma e per il server una chiave completa. Le corrispondenti chiavi private possono anche essere lasciate prive di password. Se non lo fossero, dovranno essere inserite nel file di configurazione in mancanza delle quali, soprattutto lato server, finirebbero per richiedere a runtime una poco gestibile interazione con l&#39;utente. &#xA;&#xA;The last but not the least, bisogna tenere presente che, come riportato dalla documentazione (https://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html#fwknop-gpg) la scelta delle chiavi è un&#39;operazione critica.&#xA;&#xA;La cifratura asimmetrica, a differenza di quella simmetrica, tende a produrre dei payload decisamente più cicciotti.&#xA;Quindi, per non correre il rischio di avere un payload che superi il default dell&#39;MTU ethernet (1500 byte), bisogna &#34;vincolare&#34; la scelta della chiave del server (di cifratura) a quella del client (di firma).&#xA;&#xA;Le chiavi a curva ellittica sarebbero una buona soluzione. Purtroppo funzionano solo per la firma, non per la cifratura. Quindi vanno bene per il client e non per il server.&#xA;&#xA;Se client e server usassero chiavi rsa, sarebbe meglio per il server usare chiavi non superiori a 3072 bit (caso limite), consigliati 2048 bit. In questo modo un&#39;eventuale chiave client di 4096 bit sarebbe tollerata. Altrimenti si rischierebbe un fault: fwknop: fkospadatafinal: Error 59 - Args contain invalid data: FKOERRORINVALIDDATAENCRYPTGPGRESULTMSGLENVALIDFAIL&#xA;&#xA;Nell&#39;esempio che segue, prenderemo in esame lo scenario 4, ma con autenticazione GPG, con una chiave ECC per il client e una chiave rsa 3072 bit per il server (ma sarebbe tollerata anche una chiave a 4096 bit). &#xA;&#xA;Creazioni delle chiavi su server e client&#xA;spa client&#xA;Creazione chiave di sola firma&#xA;gpg --batch --passphrase &#39;&#39; --quick-gen-key &#34;fwknop client (chiave del client fwknop) fwknop@spaclient&#34; ed25519 cert,sign never`&#xA;&#xA;esporta chiave pubblica e invio a spaserver&#xA;gpg -o fwknop@spaclient.gpg --export fwknop@spaclient&#xA;scp fwknop@spaclient.gpg 107.23.186.49:&#xA;spa server &#xA;Creazione chiave di firma e cifratura. Quella di cifratura è una rsa 3072 bit&#xA;gpg --batch --passphrase &#39;&#39; --quick-gen-key &#34;fwknopd server (chiave del server fwknopd) fwknopd@spaserver&#34; ed25519 cert,sign never&#xA;gpg --batch --passphrase &#39;&#39; --quick-add-key &#39;2BCD6BEF564A54362F8242017C17EC045408C7DB&#39; rsa3072 encr never&#xA;&#xA;esporta chiave pubblica e invio al client&#xA;gpg -o fwknopd@spaserver.gpg --export fwknopd@spaserver&#xA;scp fwknopd@spaserver.gpg 107.23.186.160:&#xA;Importazioni e firma delle chiavi&#xA;importazione e firma della chiave&#xA;gpg --import fwknopd@spaserver.gpg&#xA;gpg --sign-key fwknopd@spaserver&#xA;&#xA;importazione e firma della chiave&#xA;gpg --import fwknop@spaclient.gpg&#xA;gpg --sign-key fwknop@spaclient&#xA;Configurazione access.conf.d/test.conf e .fwknoprc&#xA;Analogamente a quanto fatto con la cifratura simmetrica:&#xA;&#xA;access.conf.d/testgpg.conf&#xA;SOURCE                      ANY&#xA;REQUIRESOURCE              Y&#xA;HMACKEYBASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==&#xA;GPGALLOWNOPW             Y  &#xA;GPGREMOTEID               1B0D9549&#xA;GPGDECRYPTID              5408C7DB &#xA;&#xA;.fwknoprc&#xA;[testgpg]&#xA;USEGPG                     Y&#xA;GPGRECIPIENT               5408C7DB&#xA;GPGSIGNER                  1B0D9549&#xA;HMACKEYBASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==&#xA;USEHMAC                    Y&#xA;&#xA;Test client&#xA;fwknop --verbose -n testgpg -A tcp/80 -R -w /usr/bin/wget -D 107.23.186.49 -N 10.0.0.132:3306&#xA;mysql -h 107.23.186.49:80 -u user -p&#xA;----&#xA;N.B.: Gli scenari 2, 3 e 4 sono le riproposizioni di ciò che viene presentato da Michael Rash durante lo ShmooCon del 2013 in https://www.youtube.com/watch?v=GCGiI6DJuIc (scenario 2)  e nel suo blog (https://www.cipherdyne.org/blog/categories/port-knocking-and-spa.html) in  https://www.youtube.com/watch?v=tz-xK1BarKk  (scenario 3 e 4)&#xA;&#xA;Ghost Service e SPA across gateway NAT non sono chiarissimi negli esempi forniti, mancano alcuni dettagli per me, che non sono un esperto di reti, fondamentali come la giusta evidenza e l&#39;importanza sull&#39;uso corretto del local nat nel primo caso e di SNAT negli altri due.&#xA;&#xA;Tutti gli esempi, in particolare 3 e 4, sono stati testati con un&#39;infrastruttura speculare a quella usata nel 2° video, ottenuta non già attraverso AWS ma con il più modesto VirtualBox che ha comunque svolto egregiamente il suo compito.&#xA;&#xA;Per chi volesse effettuare delle prove sul campo, spero, in futuro, di mettere a disposizione questo piccolo laboratorio attraverso Vagrant e di dare indicazioni sulle configurazioni degli apparati che si occupano di routing e nat.&#xA;----&#xA;Osservazioni su access.conf&#xA;access.conf permette di stabilire chi accede e su quali risorse.&#xA;&#xA;Le porte specificate nella clausola ACCESS permetteranno al clent di accedere con la stessa chiave:&#xA;&#xA;a tutti i servizi relativi, se lo spaserver è installato sulla stessa macchina che li eroga;&#xA;a tutti i server relativi (eroganti i servizi indicati in ACCESS) nattati dallo spaserver; &#xA;ad uno solo dei servizi, e solo fra quelli &#34;nattabili&#34;, se nell&#39;access.conf uso le clausole FORCENAT/SNAT, per quanto siano larghe le maglie della clausola ACCESS. Inoltre posso usare ACCESS per concedere o meno la possibilità di ghostare un servizio &#xA;&#xA;Vediamo con un po&#39; di esempi cosa possiamo fare&#xA;&#xA;fwknop bastion host&#xA;&#xA;Questo scenario riprende ed estende quello visto finora, dove si evidenzia il natting sia dei client che dei server, entrambi nelle loro lan private.&#xA;&#xA;A differenza degli scenari precedenti, lo spaserver non è direttamente esposto ma è anch&#39;esso nel backend. Gli altri server espongono un server web sulla porta 8080, un remote-desktop sulla 3389 e un db mysql sulla 3306.&#xA;&#xA;Per mostrare quanto fwknop possa essere flessibile, supponiamo di avere 3 utenti, Alice, Bob e Carol, ognuno con privilegi differenti.&#xA;fwknop sarà configurato come bastion host.&#xA;&#xA;Supponiamo sempre che lo spaserver esponga pubblicamente un sito web sulla porta 80 (utile per un eventuale ghosting dei servizi) .&#xA;&#xA;Configurazione stanze con spa server come bastion host&#xA;La configurazione delle stanze richiederà al client anche di specificare l&#39;utente.&#xA;&#xA;access.conf.d/alice.conf&#xA;alice&#xA;SOURCE                      ANY&#xA;REQUIRESOURCE              Y&#xA;SPOOFUSER                  usernamealice&#xA;HMACKEYBASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==&#xA;GPGALLOWNOPW             Y  &#xA;GPGREMOTEID               1B0D9549&#xA;GPGDECRYPTID              5408C7DB &#xA;access.conf.d/bob.conf&#xA;bob&#xA;SOURCE                      ANY&#xA;OPENPORTS                  tcp/3306, tcp/3389&#xA;SPOOFUSER                  usernamebob&#xA;REQUIRESOURCE              Y&#xA;KEYBASE64                  /bUdrMWFbc754iitBPAm2iwpzJ9CeetVxKXJOY0b9yI=&#xA;HMACKEYBASE64             K22gfP5eq8Hveg58NeCWbXJEL/S/R74wGhxG3S6Gv+hl/bbqOZhExsRuLRrIvyZmW7iseEN8E48wHRQsUMozgA==&#xA;access.conf.d/carol.conf&#xA;carol&#xA;SOURCE                      154.23.162.32/27, 154.23.162.96/27&#xA;OPENPORTS                  tcp/3306&#xA;SPOOFUSER                  usernamecarol&#xA;REQUIRESOURCE              Y&#xA;KEYBASE64                  GK1CE1BE+ItAfZCMH9NPUkAd+rQv2mTm5df1wjN1w6w=&#xA;HMACKEYBASE64             ewbyRRz2B7mqQnXRa7Mm67Qa4xIzr1/oyKAhHSQ7+rwtNcEZrZbXeHb97drG8ebZ06F7OOLjp1i9Fy+DtN3F7Q==&#xA;&#xA;Alice&#xA;Con le stanze configurate in questo modo, alice, che ha una chiave gpg, può usare la stessa chiave da qualunque ip, per raggiungere uno qualunque fra i 3 server in backend.&#xA;Es.&#xA;webserver&#xA;fwknop -n alice -A tcp/8080 -R -w /usr/bin/wget -D 5.112.84.211 -U usernamealice -N 192.168.100.112&#xA;o&#xA;remote-desktop&#xA;fwknop -n alice -A tcp/3389 -R -w /usr/bin/wget -D 5.112.84.211 -U usernamealice -N 192.168.100.25&#xA;o&#xA;mysql&#xA;fwknop -n alice -A tcp/3306 -R -w /usr/bin/wget -D 5.112.84.211 -U usernamealice -N 192.168.100.109&#xA;Alice può anche &#34;ghostare&#34; il servizio, ad es. mysql&#xA;mysql&#xA;fwknop -n alice -A tcp/80 -R -w /usr/bin/wget -D 5.112.84.211 -U usernamealice -N 192.168.100.109:3306&#xA;Bob&#xA;Bob può raggiungere il db o il server windows in remote desktop, non il webserver.&#xA;Ad es.&#xA;mysql&#xA;fwknop -n bob -A tcp/3306 -R -w /usr/bin/wget -D 5.112.84.211 -U usernamebob -N 192.168.100.109&#xA;Carol&#xA;A Carol invece è consentito solo l&#39;accesso al db mysql  e solo da due subnet specifiche.&#xA;&#xA;Ad es.&#xA;mysql&#xA;fwknop -n carol -A tcp/3306 -a 154.23.162.99 -D 5.112.84.211 -U username_carol -N 192.168.100.109&#xA;Né Bob, né Carol possono ghostare servizi.&#xA;&#xA;small Riferimenti:&#xA;&#xA;https://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html&#xA;/small&#xA;&#xA;#fwknop #spa #crittografia&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/634f2a4e4-291f24/QzgT0OY2gSKr/DlbL3aMNOGKs34WZtaTsigWdoF2EZ2OVjXRZv0Wo.jpg" alt="fwknop"></p>

<h2 id="cos-è-fwknop">Cos&#39;è fwknop</h2>

<p><strong>fwknop</strong> è un software di port knocking che usa uno schema di autenticazione chiamato “Single Packet Authorization” ipotizzato e formalizzato dallo stesso autore per risolvere le debolezze più comuni del classico port-knocking.
</p>
<ol><li><a href="#cos-e-fwknop" rel="nofollow">Cos&#39;è fwknop</a></li>
<li><a href="#installazione-client-e-server" rel="nofollow">Installazione client e server</a></li>
<li><a href="#configurazione-client" rel="nofollow">Configurazione client</a>
<ol><li><a href="#generazione-della-sola-chiave" rel="nofollow">Generazione della sola chiave</a></li>
<li><a href="#generazione-chiave-configurazione-complessa" rel="nofollow">Generazione chiave + configurazione complessa</a></li></ol></li>
<li><a href="#configurazione-server" rel="nofollow">Configurazione server</a></li>
<li><a href="#scenari" rel="nofollow">Scenari</a>
<ol><li><a href="#1-protezione-di-un-servizio-con-spa" rel="nofollow">Protezione di un servizio con SPA</a>
<ol><li><a href="#configurazione-lato-server" rel="nofollow">Configurazione lato server</a></li>
<li><a href="#configurazione-lato-client" rel="nofollow">Configurazione lato client</a></li></ol></li>
<li><a href="#2-ghost-locale-sullo-spaserver" rel="nofollow">Ghost locale sullo spaserver</a>
<ol><li><a href="#configurazione-lato-server-1" rel="nofollow">Configurazione lato server</a></li>
<li><a href="#invocazione-client" rel="nofollow">Invocazione client</a></li></ol></li>
<li><a href="#3-spa-attraverso-gateway-nat" rel="nofollow">SPA attraverso gateway NAT</a>
<ol><li><a href="#configurazione-lato-server-2" rel="nofollow">Configurazione lato server</a></li>
<li><a href="#invocazione-client-1" rel="nofollow">Invocazione client</a></li></ol></li>
<li><a href="#4-spa-ghost-service" rel="nofollow">SPA Ghost Service</a>
<ol><li><a href="#invocazione-client-2" rel="nofollow">Invocazione client</a></li></ol></li></ol></li>
<li><a href="#e-se-volessi-usare-la-crittografia-asimmetrica" rel="nofollow">E se volessi usare la crittografia asimmetrica?</a></li>
<li><a href="#osservazioni-su-access-conf" rel="nofollow">Osservazioni su access.conf</a>
<ol><li><a href="#configurazione-stanze-con-spa-server-come-bastion-host" rel="nofollow">Configurazione stanze con spa server come bastion host</a></li>
<li><a href="#alice" rel="nofollow">Alice</a></li>
<li><a href="#bob" rel="nofollow">Bob</a></li>
<li><a href="#carol" rel="nofollow">Carol</a></li></ol></li></ol>

<p><strong>fwknop</strong>, come il port knocking, unisce la comunicazione passiva di informazioni di autenticazione al filtraggio di tutti i pacchetti che non rispettano le sequenze di knock.</p>

<p>Il classico approccio di port-knocking sfrutta le intestazioni dei pacchetti (2 byte) e non il loro payload, per cui è necessario mandare un certo numero di pacchetti per mappare una porta senza generare falsi positivi. Questo però comporta inevitabilmente almeno due problemi:</p>
<ul><li>suscettibilità ad attacchi di spoofing</li>
<li>se le sequenze di knocking sono eccessivamente articolate (magari per inviare più informazioni), data l&#39;imprevedibilità della rete e l&#39;assenza di costrutti che garantiscano lo stesso ordine d&#39;arrivo dei pacchetti, c&#39;è la possibilità che il server non riesca a ricostruire la sequenza corretta.</li></ul>

<p>Il client <code>fwknop</code> (<strong>SPA Client</strong>) invia al server (<strong>SPA Server</strong>) un singolo pacchetto di dimensioni relativamente maggiori (possibile sfruttando il payload) per comunicare informazioni di accesso e interi comandi destinati al filtraggio dei pacchetti.</p>

<p>Il tutto viene protetto da una cifratura simmetrica con autenticazione (aes256-cbc + hmac-sha256, che sarà quella usata nel prosieguo perché più semplice da gestire) o asimmetrica che, al costo di una maggiore complessità di gestione, aggiunge la caratteristica di non ripudio alle caratteristiche di confidenzialità, integrità e autenticazione possedute anche dal primo schema di cifratura.</p>

<h2 id="installazione-client-e-server">Installazione client e server</h2>

<p><code>fwknop</code> client e server sono pacchettizzati per ogni distro linux (su Mac OS è possibile ricorrere a brew).
<strong>Sistemi rpm-based</strong></p>

<pre><code class="language-bash"># Installa il client (fwknop) e il server (fwknopd)
dfn install fwknop
</code></pre>

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

<pre><code class="language-bash"># Installa il client (fwknop)
apt install fwknop-client

# Installa il server (fwknopd)
apt install fwknop-server
</code></pre>

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

<p>La configurazione lato client viene conservata nel file <strong>.fwknoprc</strong> che può essere editato a a mano oppure attraverso il client <code>fwknop</code> salvando nel file <strong>.fwknoprc</strong> quelle che vengono definite “<strong>stanze</strong>”.</p>

<p>Nella configurazione è molto importante la generazione della chiave. Se la chiave è simmetrica, la si può generare con <code>fwknop</code>.</p>

<p>Di seguito, due esempi di creazione di stanze con <code>fwknop</code>, una minimale (che useremo nel resto del documento) e una più complessa.</p>

<h3 id="generazione-della-sola-chiave">Generazione della sola chiave</h3>

<p>Genero la chiave usando il default: aes256-cbc + hmac-sha256.</p>

<pre><code class="language-bash">fwknop -n test -k --use-hmac --save-rc-stanza
</code></pre>

<p>E in <strong>.fwknoprc</strong> troverò una nuova sezione <code>[test]</code></p>

<pre><code>[test]
KEY_BASE64                  dRYAH2O9FCUpNz1aMmlke9/AkGVdcLrnWxDy7jZC1wg=
HMAC_KEY_BASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==
USE_HMAC                    Y
</code></pre>

<h3 id="generazione-chiave-configurazione-complessa">Generazione chiave + configurazione complessa</h3>

<pre><code class="language-bash">fwknop -n test -k -A tcp/80 -R -w /usr/bin/wget -D 107.23.186.49 -N 10.0.0.132:3306 --save-rc-stanza
</code></pre>

<p>che ha  il corrispondente <strong>.fwknoprc</strong>:</p>

<pre><code>[test]
ACCESS                      tcp/80
SPA_SERVER                  107.23.186.49
KEY_BASE64                  0d/VcRXnf2si7hvfDsPN3YIG4Q7aPLU9Ndd5Pe+eMIQ=
HMAC_KEY_BASE64             EEXu0VCPQKPGp8FC8tYS6I/p56nWlot93BV3CPVf3De9FkM04z1SBWTUEJejHpq45+at7VQirgTYvSxeLoZkKQ==
NAT_ACCESS                  10.0.0.132:3306
RESOLVE_IP_HTTPS            Y
WGET_CMD                    /usr/bin/wget
</code></pre>

<p>La spiegazione di questa configurazione specifica la troveremo più avanti nel par. <a href="#4-spa-ghost-service" rel="nofollow">4. SPA Ghost Service</a>. È solo per far vedere che il file di configurazione <code>.fwknoprc</code> può essere rimpiazzato in toto dall&#39;invocazione via cli del client. Chiave compresa, se è il caso.</p>

<p>Affinché la “stanza” venga creata, deve necessariamente essere presente <strong>almeno uno</strong> fra valori dei flag <code>-D</code> e <code>-n</code>. Quest&#39;ultimo costituirà anche il nome alla sezione corrispondente, altrimenti sarà il valore di <code>-D</code> .</p>

<p>Per usare il cient con le preimpostazioni di <strong>.fwinoprc</strong>, basterà indicare il nome della sezione:</p>

<pre><code class="language-bash">fwknop -n test
</code></pre>

<p>Ne consegue che i nomi di sezione <strong>devono essere univoci.</strong></p>

<p>Da ricordare che quando si usa il client  quello che è importante specificare nel file <strong>.fwknoprc</strong> o nei parametri è:</p>
<ul><li><strong>ALLOW_IP (<code>-a</code>)</strong>: che indica l&#39;ip da cui sto facendo la richiesta e che deve rientrare nel <strong>SOURCE</strong> specificato nel server. Se l&#39;ip non è noto magari perché lo spaclient viene nattato, si può ricorrere alla risoluzione dell&#39;ip che viene instradato esternamente (chiamando un servizio esterno):
<ul><li><strong>RESOLVE_IP_HTTPS (<code>-R</code>)</strong>: booleano [Y|N] per abilitare lo spaclient a richiedere la risoluzione del proprio ip;</li>
<li><strong>WGET_CMD (<code>-w</code>)</strong>: path del comando <code>wget</code> che chiamerà lo script di risoluzione</li></ul></li>
<li><strong>ACCESS (<code>-A</code>)</strong>: benché non sia obbligatorio per il server, il client deve necessariamente specificare a quali porte/protocolli intende accedere. Se specificati anche nel server, devono appartenere alla sua lista</li>
<li><strong>SPA_SERVER (<code>-D</code>)</strong>: indica l&#39;ip o l&#39;url dello spaserver</li>
<li><strong>KEY</strong>: la chiave simmetrica per AES-CBC (default: <strong>aes256</strong>);</li>
<li><strong>HMAC_KEY</strong>: la chiave per HMAC (default: <strong>sha256</strong>)</li></ul>

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

<p>Il server si compone di due file:</p>
<ul><li><strong>fwknopd.conf</strong>: configura il servizio.
È il punto in cui si imposta la porta su cui il servizio sarò in ascolto per ricevere il pacchetto, l&#39;interfaccia, le configurazioni, anche complesse, dei firewall da manipolare in seguito al port-knocking (iptables, firewalld, ipf);</li>
<li><strong>access.conf</strong>: regola gli accessi degli utenti.
È il punto in cui si indicano quegli elementi  necessari ad autenticare ed autorizzare gli utenti, elementi che dovranno coincidere con ciò che contiene il pacchetto.
È possibile creare una cartella, da indicare in <strong>fwknopd.conf</strong>, contenente singole configurazioni di accesso, per utente o per policy, piuttosto che creare un unico, lungo elenco in access.conf.</li></ul>

<p>Anche <strong>access.conf</strong> è un elenco di “<strong>stanze</strong>”, i punti d&#39;accesso per i client contenenti come minimo la rete abilitata all&#39;accesso e la chiave con cui si presenta l&#39;utente, come visto in <a href="#generazione-della-sola-chiave" rel="nofollow">Configurazione client</a>:</p>
<ul><li><strong>SOURCE</strong>: gli ip o le subnet del client da abilitare all&#39;accesso</li>
<li><strong>KEY</strong>: la chiave simmetrica per AES-CBC (default: <strong>aes256</strong>)</li>
<li><strong>HMAC_KEY</strong>: la chiave per HMAC (default: <strong>sha256</strong>)</li></ul>

<p>Altri parametri utili a rafforzare ulteriormente il legame con le richieste client, ma non obbligatori per l&#39;avvio del servizio, sono:</p>
<ul><li><strong>OPEN_PORTS</strong>: specifica quali porte e quali protocolli abilitare</li>
<li><strong>REQUIRE_USERNAME</strong>: specifica un nome utente col quale il client si deve presentare</li>
<li><strong>REQUIRE_SOURCE_ADDRESS</strong>: impone che il client specifichi l&#39;ip da cui sta facendo la richiesta in modo da mitigare la possibilità di attacchi MITM</li></ul>

<p>Quando queste opzioni sono presenti sul server, dovranno essere obbligatoriamente specificate anche nel client.
Dopo aver visto le configurazioni di client e server, vedremo <code>fwknop</code> in azione in alcuni casi “reali”.</p>

<h2 id="scenari">Scenari</h2>

<p>Grazie alla sua capacità sia di manipolare, anche in maniera piuttosto articolata, i firewall che concedono l&#39;accesso alle risorse che ad eseguire interi comandi che fwknop mostra tutta la sua versatilità.</p>

<p>In particolare è col <strong>NAT</strong> che riesce ad andare oltre la sua natura di port knocking dove, grazie ad una combinazione di <strong>DNAT</strong> e <strong>SNAT</strong>, riesce a:</p>
<ul><li>girare richieste su server, che normalmente non sarebbero raggiungibili, posti nel backend insieme allo stesso spaserver o dietro di esso</li>
<li>presentare un servizio su una porta diversa rispetto a quella su cui è in ascolto</li></ul>

<p>diventando a tutti gli effetti un bastion host per l&#39;esposizione autenticata e sicura di servizi critici.</p>

<p>Riassumendo, fwknop può:</p>
<ul><li>essere messo direttamente sul server a protezione di uno o più servizi (caso classico);</li>
<li>può nattare un servizio sullo stesso spaverser con un inoltro delle porte locali e, contestualmente, ghostare un servizio con un altro</li>
<li>può nattare un servizio posto nel backend;</li>
<li>come prima, traslare porte e/o “ghostare” servizi</li></ul>

<p>Gli scenari che andrò a mostrare, copriranno i casi più comuni:</p>
<ol><li>Protezione di un servizio con SPA</li>
<li>Ghost locale sullo spaserver</li>
<li>SPA attraverso Gateway NAT</li>
<li>SPA Ghost Service</li></ol>

<p>Lato client, <code>fwknop</code> <u>si baserà <strong>sempre</strong> sulla configurazione minimale vista prima nel paragrafo “<a href="#generazione-della-sola-chiave" rel="nofollow">Configurazione client</a>“</u>. Il resto delle configurazioni verrà passato via cli.</p>

<h3 id="1-protezione-di-un-servizio-con-spa">1. Protezione di un servizio con SPA</h3>

<p>La cosa più semplice da fare è mettere lo spaserver a protezione diretta del servizio insieme ad un firewall che implementa una policy default-drop.
Ipotizziamo ad es. di proteggere l&#39;accesso in ssh sul nodo centrale (<strong>192.168.100.10</strong>) di una rete a stella.</p>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/634f2a4e4-291f24/xZom9yeeZQtn/kPX18uH9bkazg34i95YNL56tXwAVmm2Lu64Nh4Jg.png" alt="fwknop spa server"></p>

<h4 id="configurazione-lato-server">Configurazione lato server</h4>
<ul><li><p>fwknopd.conf:</p>

<pre><code>PCAP_INTF                   eth1;
PCAP_FILTER                 udp port 62201;
</code></pre></li>

<li><p>access.conf:</p>

<pre><code>%include_folder /etc/fwknop/access.conf.d
</code></pre></li>

<li><p>test.conf:</p>

<pre><code>SOURCE                      192.168.100.0/24
REQUIRE_SOURCE              Y
KEY_BASE64                  dRYAH2O9FCUpNz1aMmlke9/AkGVdcLrnWxDy7jZC1wg=
HMAC_KEY_BASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==
</code></pre></li></ul>

<h4 id="configurazione-lato-client">Configurazione lato client</h4>
<ul><li><p>.fwknoprc:</p>

<pre><code>[test]
KEY_BASE64                  dRYAH2O9FCUpNz1aMmlke9/AkGVdcLrnWxDy7jZC1wg=
HMAC_KEY_BASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==
USE_HMAC                    Y
</code></pre></li>

<li><p>fwknop:</p>

<pre><code class="language-bash">fwknop -n test -a 192.168.100.15 -A tcp/22 -D 192.168.100.10
ssh 192.168.100.10
</code></pre></li></ul>

<p>Supponiamo adesso di voler proteggere l&#39;accesso ssh di una macchina dove però il client , caso molto frequente, sia in una rete privata e nattato con un ip pubblico (rete domestica o rete mobile per es.).</p>

<p>Non possiamo sapere con certezza quale sarà l&#39;ip del client per cui, lato server, dovrò essere disposto ad accettare qualunque sorgente e lato client lascerò che l&#39;ip venga risolto dinamicamente.</p>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/634f2a4e4-291f24/J9X4nmlAhwCf/lAgMoITv4HDj5JsIWq2K3LgJrMz7vzz95RZjG6Vd.png" alt="fwknop con client nat"></p>

<pre><code class="language-bash">fwknop -n test -R -w /usr/bin/wget -A tcp/22 -D 107.23.186.49
ssh 107.23.186.49
</code></pre>

<p>L&#39;opzione:</p>
<ul><li><strong>-R</strong> permette di risolvere il proprio ip pubblico usando wget ( di cui va dato il path) che richiamerà uno script posto di default in <a href="https://www.cipherdyne.org/cgi-bin/myip" rel="nofollow">https://www.cipherdyne.org/cgi-bin/myip</a>, altrimenti se ne può specificare un altro analogo con <code>--resolve-url &lt;url&gt;</code>. Questo perché l&#39;ip reale del client viene nattato con l&#39;ip pubblico <strong>154.23.162.98</strong>, quindi il pacchetto inviato allo spaserver deve contenere questo IP come richiedente, non quello privato (che altrimenti non riceverebbe mai risposta)</li>
<li><strong>-D</strong> serve sempre per specificare l&#39;ip, stavolta pubblico, dello spaserver  (<strong>107.23.186.49</strong>)</li></ul>

<p><strong>N.B.</strong>  Non sapendo quale sarà l&#39;ip richiedente, la clausola  <strong>SOURCE</strong> nel file <strong>test.conf</strong> non potrà contenere un ip o una subnet, quanto piuttosto:</p>

<pre><code>...
SOURCE                      ANY
...
</code></pre>

<h3 id="2-ghost-locale-sullo-spaserver">2.  Ghost locale sullo spaserver</h3>

<p>Assumiamo che la topologia di rete sia semplice come quella del caso precedente ma ipotizziamo che il client che si autentichi con SPA, <strong>acceda ad un servizio protetto la cui porta sia associata contemporaneamente ad un altro servizio esposto pubblicamente</strong>.</p>

<p>In questo modo qualunque un altro client (anche attori malevoli) che volesse connettersi a quella porta, continuerebbe a vedere solo il servizio pubblico e non quello protetto.</p>

<p>Questa magia viene resa possibile grazie ad un <strong>DNAT</strong> locale che mappa temporaneamente, e solo per quell&#39;ip, la porta pubblica con quella del servizio da proteggere.</p>

<p>Nel nostro esempio vogliamo accedere in ssh alla macchina ma sulla porta <strong>80</strong>, corrispondente ad un servizio web esposto pubblicamente.</p>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/634f2a4e4-291f24/x92Omv0hNdeE/H58KNFZBTEIIFk7NfKTXoJFgXXVlWn5yU4pooHYp.png" alt="fwknop con server local nat"></p>

<h4 id="configurazione-lato-server-1">Configurazione lato server</h4>
<ul><li><p>fwknopd.conf:</p>

<pre><code>PCAP_INTF                   enp0s8;
ENABLE_IPT_FORWARDING       Y;
ENABLE_IPT_LOCAL_NAT        Y;
</code></pre></li>

<li><p>access.conf:
Rimane invariato.</p></li></ul>

<h4 id="invocazione-client">Invocazione client</h4>
<ul><li>fwknop:</li></ul>

<pre><code class="language-bash">fwknop -n test -R -w /usr/bin/wget -A tcp/22 -D 107.23.186.49 --nat-local --nat-port 80
ssh 107.23.186.49 -p80
</code></pre>

<h3 id="3-spa-attraverso-gateway-nat">3. SPA attraverso gateway NAT</h3>

<p>In questo caso lo spa server verrà usato come gateway per accedere a servizi posti sulla rete interna. ad es. un db mybsql su una macchina (<strong>10.0.0.132</strong>) posta dietro lo spa server.</p>

<p>Per ottenere tutto questo, bisogna abilitare il port forwarding e il <strong>SNAT</strong> nel file <strong>fwknopd.conf</strong> in modo che vengano create le regole <strong>DNAT</strong> e <strong>MASQUERADE</strong> su iptables affinché le richieste vengano inoltrate rispettivamente verso la macchina  che eroga il servizio (mysql) e che i pacchetti di ritorno viaggino correttamente verso lo spa server e quindi verso il client. Il file <strong>access.conf</strong> rimane invariato</p>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/634f2a4e4-291f24/16QCyHYx5EWo/XR42wuBNPydnyGL25upmyGE7P1qIk4TWqIznv87p.png" alt="fwknop con gateway nat"></p>

<h4 id="configurazione-lato-server-2">Configurazione lato server</h4>
<ul><li>fwknopd.conf:</li></ul>

<pre><code>PCAP_INTF                   enp0s8;
ENABLE_IPT_FORWARDING       Y;
ENABLE_IPT_SNAT             Y;
</code></pre>

<h4 id="invocazione-client-1">Invocazione client</h4>
<ul><li>fwknop:</li></ul>

<pre><code class="language-bash">fwknop -n test -R -w /usr/bin/wget -A tcp/3306 -D 107.23.186.49 -N 10.0.0.132
mysql -h 107.23.186.49 -u &lt;user&gt; -p
</code></pre>

<h3 id="4-spa-ghost-service">4. SPA Ghost Service</h3>

<p>Adesso vogliamo che l&#39;accesso a mysql venga “nascosto” da un servizio legittimo esposto pubblicamente (un servizio http sulla porta 80).</p>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/634f2a4e4-291f24/NaMnC9wxDK2z/ydU1mmfAGQcxHn0Y9wFVPjDqLxbTZIoUhWOHKFpx.png" alt="fwknop con ghost service"></p>

<p>La configurazione lato server (<strong>fwknopd.conf</strong>, <strong>access.conf</strong>) rimane invariata rispetto a prima.</p>

<h4 id="invocazione-client-2">Invocazione client</h4>
<ul><li>fwknop:</li></ul>

<pre><code class="language-bash">fwknop -n test -A tcp/80 -R -w /usr/bin/wget -D 107.23.186.49 -N 10.0.0.132:3306
mysql -h 107.23.186.49:80 -u &lt;user&gt; -p 
</code></pre>

<h2 id="e-se-volessi-usare-la-crittografia-asimmetrica">E se volessi usare la crittografia asimmetrica?</h2>

<p>La crittografia asimmetrica usata con hmac costituisce un ulteriore enhancement di sicurezza.</p>

<p>Mentre con la crittografia simmetrica+hmac si ha una sorta di implicito mutuo riconoscimento, con la crittografia asimmetrica è sufficiente che il client sia riconosciuto dal server.</p>

<p>Affinché ciò avvenga, il client inva il pacchetto spa firmato con la sua chiave privata e lo cifra con la chiave pubblica dello spaserver.
Lo spaserver riceve il pacchetto, verifica la firma con la chiave pubblica del client, lo decifra con la sua chiave privata, proseguendo poi col resto del processo di autorizzazione e accesso.</p>

<p>È consigliata la creazione di chiavi apposite per fwknop, non quelle personali. Per il client creeremo una chiave di sola firma e per il server una chiave completa. Le corrispondenti chiavi private possono anche essere lasciate prive di password. Se non lo fossero, dovranno essere inserite nel file di configurazione in mancanza delle quali, soprattutto lato server, finirebbero per richiedere a runtime una poco gestibile interazione con l&#39;utente.</p>

<p>The last but not the least, bisogna tenere presente che, come riportato dalla documentazione (<a href="https://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html#fwknop-gpg" rel="nofollow">https://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html#fwknop-gpg</a>) la scelta delle chiavi è un&#39;operazione critica.</p>

<p>La cifratura asimmetrica, a differenza di quella simmetrica, tende a produrre dei payload decisamente più cicciotti.
Quindi, per non correre il rischio di avere un payload che superi il default dell&#39;MTU ethernet (1500 byte), bisogna “vincolare” la scelta della chiave del server (di cifratura) a quella del client (di firma).</p>

<p>Le chiavi a curva ellittica sarebbero una buona soluzione. Purtroppo funzionano solo per la firma, non per la cifratura. Quindi vanno bene per il client e <a href="https://github.com/mrash/fwknop/issues/323#issuecomment-770269364" rel="nofollow">non per il server</a>.</p>

<p>Se client e server usassero chiavi rsa, sarebbe meglio per il server usare chiavi non superiori a 3072 bit (caso limite), consigliati 2048 bit. In questo modo un&#39;eventuale chiave client di 4096 bit sarebbe tollerata. Altrimenti si rischierebbe <a href="https://github.com/mrash/fwknop/issues/211" rel="nofollow">un fault</a>: <code>fwknop: fko_spa_data_final: Error 59 - Args contain invalid data: FKO_ERROR_INVALID_DATA_ENCRYPT_GPG_RESULT_MSGLEN_VALIDFAIL</code></p>

<p>Nell&#39;esempio che segue, prenderemo in esame <a href="#4-spa-ghost-service" rel="nofollow">lo scenario 4</a>, ma con autenticazione GPG, con una chiave ECC per il client e una chiave rsa 3072 bit per il server (ma sarebbe tollerata anche una chiave a 4096 bit).</p>

<h3 id="creazioni-delle-chiavi-su-server-e-client">Creazioni delle chiavi su server e client</h3>

<p><strong>spa client</strong></p>

<pre><code class="language-bash"># Creazione chiave di sola firma
gpg --batch --passphrase &#39;&#39; --quick-gen-key &#34;fwknop client (chiave del client fwknop) &lt;fwknop@spaclient&gt;&#34; ed25519 cert,sign never`

# esporta chiave pubblica e invio a spaserver
gpg -o fwknop@spaclient.gpg --export fwknop@spaclient
scp fwknop@spaclient.gpg 107.23.186.49:
</code></pre>

<p><strong>spa server</strong></p>

<pre><code class="language-bash"># Creazione chiave di firma e cifratura. Quella di cifratura è una rsa 3072 bit
gpg --batch --passphrase &#39;&#39; --quick-gen-key &#34;fwknopd server (chiave del server fwknopd) &lt;fwknopd@spaserver&gt;&#34; ed25519 cert,sign never
gpg --batch --passphrase &#39;&#39; --quick-add-key &#39;2BCD6BEF564A54362F8242017C17EC045408C7DB&#39; rsa3072 encr never

# esporta chiave pubblica e invio al client
gpg -o fwknopd@spaserver.gpg --export fwknopd@spaserver
scp fwknopd@spaserver.gpg 107.23.186.160:
</code></pre>

<h3 id="importazioni-e-firma-delle-chiavi">Importazioni e firma delle chiavi</h3>

<pre><code class="language-bash"># importazione e firma della chiave
gpg --import fwknopd@spaserver.gpg
gpg --sign-key fwknopd@spaserver
</code></pre>

<pre><code class="language-bash"># importazione e firma della chiave
gpg --import fwknop@spaclient.gpg
gpg --sign-key fwknop@spaclient
</code></pre>

<h3 id="configurazione-access-conf-d-test-conf-e-fwknoprc">Configurazione <code>access.conf.d/test.conf e .fwknoprc</code></h3>

<p>Analogamente a quanto fatto con la cifratura simmetrica:</p>
<ul><li><p>access.conf.d/test_gpg.conf</p>

<pre><code>SOURCE                      ANY
REQUIRE_SOURCE              Y
HMAC_KEY_BASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==
GPG_ALLOW_NO_PW             Y  
GPG_REMOTE_ID               1B0D9549
GPG_DECRYPT_ID              5408C7DB 
</code></pre></li>

<li><p>.fwknoprc</p>

<pre><code>[test_gpg]
USE_GPG                     Y
GPG_RECIPIENT               5408C7DB
GPG_SIGNER                  1B0D9549
HMAC_KEY_BASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==
USE_HMAC                    Y
</code></pre></li></ul>

<h3 id="test-client">Test client</h3>

<pre><code class="language-bash">fwknop --verbose -n test_gpg -A tcp/80 -R -w /usr/bin/wget -D 107.23.186.49 -N 10.0.0.132:3306
mysql -h 107.23.186.49:80 -u &lt;user&gt; -p
</code></pre>

<hr>

<p><strong>N.B.</strong>: Gli scenari 2, 3 e 4 sono le riproposizioni di ciò che viene presentato da Michael Rash durante lo <strong>ShmooCon del 2013</strong> in <a href="https://www.youtube.com/watch?v=GCGiI6DJuIc" rel="nofollow">https://www.youtube.com/watch?v=GCGiI6DJuIc</a> (scenario 2)  e nel suo blog (<a href="https://www.cipherdyne.org/blog/categories/port-knocking-and-spa.html" rel="nofollow">https://www.cipherdyne.org/blog/categories/port-knocking-and-spa.html</a>) in  <a href="https://www.youtube.com/watch?v=tz-xK1BarKk" rel="nofollow">https://www.youtube.com/watch?v=tz-xK1BarKk</a>  (scenario 3 e 4)</p>

<p><strong>Ghost Service</strong> e <strong>SPA across gateway NAT</strong> non sono chiarissimi negli esempi forniti, mancano alcuni dettagli per me, che non sono un esperto di reti, fondamentali come la giusta evidenza e l&#39;importanza sull&#39;uso corretto del local nat nel primo caso e di SNAT negli altri due.</p>

<p>Tutti gli esempi, in particolare 3 e 4, sono stati testati con un&#39;infrastruttura speculare a quella usata nel 2° video, ottenuta non già attraverso AWS ma con il più modesto VirtualBox che ha comunque svolto egregiamente il suo compito.</p>

<p>Per chi volesse effettuare delle prove sul campo, spero, in futuro, di mettere a disposizione questo piccolo laboratorio attraverso Vagrant e di dare indicazioni sulle configurazioni degli apparati che si occupano di routing e nat.</p>

<hr>

<h2 id="osservazioni-su-access-conf">Osservazioni su <strong>access.conf</strong></h2>

<p><strong>access.conf</strong> permette di stabilire chi accede e su quali risorse.</p>

<p>Le porte specificate nella clausola <strong>ACCESS</strong> permetteranno al clent di accedere con la stessa chiave:</p>
<ol><li>a <strong>tutti i servizi</strong> relativi, se lo spaserver è installato sulla stessa macchina che li eroga;</li>
<li>a <strong>tutti i server</strong> relativi (eroganti i servizi indicati in <strong>ACCESS</strong>) nattati dallo spaserver;</li>
<li>ad <strong>uno solo</strong> dei servizi, e solo fra quelli “nattabili”, se nell&#39;access.conf uso le clausole <strong>FORCE_NAT/SNAT</strong>, per quanto siano larghe le maglie della clausola <strong>ACCESS</strong>. Inoltre posso usare <strong>ACCESS</strong> per concedere o meno la possibilità di ghostare un servizio</li></ol>

<p>Vediamo con un po&#39; di esempi cosa possiamo fare</p>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/634f2a4e4-291f24/aE1N98kHGiRq/0YWH7vt1MGJmSHVTYMD7nNr8L7yVgH6Ed10atavg.png" alt="fwknop bastion host"></p>

<p>Questo scenario riprende ed estende quello visto finora, dove si evidenzia il natting sia dei client che dei server, entrambi nelle loro lan private.</p>

<p>A differenza degli scenari precedenti, lo spaserver non è direttamente esposto ma è anch&#39;esso nel backend. Gli altri server espongono un server web sulla porta <strong>8080</strong>, un remote-desktop sulla <strong>3389</strong> e un db mysql sulla <strong>3306</strong>.</p>

<p>Per mostrare quanto fwknop possa essere flessibile, supponiamo di avere 3 utenti, <strong>Alice</strong>, <strong>Bob</strong> e <strong>Carol</strong>, ognuno con privilegi differenti.
fwknop sarà configurato come bastion host.</p>

<p>Supponiamo sempre che lo spaserver esponga pubblicamente un sito web sulla porta 80 (utile per un eventuale ghosting dei servizi) .</p>

<h4 id="configurazione-stanze-con-spa-server-come-bastion-host">Configurazione stanze con spa server come bastion host</h4>

<p>La configurazione delle stanze richiederà al client anche di specificare l&#39;utente.</p>
<ul><li><p>access.conf.d/alice.conf</p>

<pre><code># alice
SOURCE                      ANY
REQUIRE_SOURCE              Y
SPOOF_USER                  &lt;username_alice&gt;
HMAC_KEY_BASE64             0xRNOSrVTy6B7PmBHiZG5jzTLwxsPrOd6kUb5/p45VjFfWp3eXMG8hVz4JRjoP89JbtMDhghghco7pV9cdQzdw==
GPG_ALLOW_NO_PW             Y  
GPG_REMOTE_ID               1B0D9549
GPG_DECRYPT_ID              5408C7DB 
</code></pre></li>

<li><p>access.conf.d/bob.conf</p>

<pre><code># bob
SOURCE                      ANY
OPEN_PORTS                  tcp/3306, tcp/3389
SPOOF_USER                  &lt;username_bob&gt;
REQUIRE_SOURCE              Y
KEY_BASE64                  /bUdrMWFbc754iitBPAm2iwpzJ9CeetVxKXJOY0b9yI=
HMAC_KEY_BASE64             K22gfP5eq8Hveg58NeCWbXJEL/S/R74wGhxG3S6Gv+hl/bbqOZhExsRuLRrIvyZmW7iseEN8E48wHRQsUMozgA==
</code></pre></li>

<li><p>access.conf.d/carol.conf</p>

<pre><code># carol
SOURCE                      154.23.162.32/27, 154.23.162.96/27
OPEN_PORTS                  tcp/3306
SPOOF_USER                  &lt;username_carol&gt;
REQUIRE_SOURCE              Y
KEY_BASE64                  GK1CE1BE+ItAfZCMH9NPUkAd+rQv2mTm5df1wjN1w6w=
HMAC_KEY_BASE64             ewbyRRz2B7mqQnXRa7Mm67Qa4xIzr1/oyKAhHSQ7+rwtNcEZrZbXeHb97drG8ebZ06F7OOLjp1i9Fy+DtN3F7Q==
</code></pre></li></ul>

<h4 id="alice">Alice</h4>

<p>Con le stanze configurate in questo modo, alice, che ha una chiave gpg, può usare la stessa chiave da qualunque ip, per raggiungere uno qualunque fra i 3 server in backend.
Es.</p>

<pre><code class="language-bash">#webserver
fwknop -n alice -A tcp/8080 -R -w /usr/bin/wget -D 5.112.84.211 -U &lt;username_alice&gt; -N 192.168.100.112
</code></pre>

<p>o</p>

<pre><code class="language-bash"># remote-desktop
fwknop -n alice -A tcp/3389 -R -w /usr/bin/wget -D 5.112.84.211 -U &lt;username_alice&gt; -N 192.168.100.25
</code></pre>

<p>o</p>

<pre><code class="language-bash"># mysql
fwknop -n alice -A tcp/3306 -R -w /usr/bin/wget -D 5.112.84.211 -U &lt;username_alice&gt; -N 192.168.100.109
</code></pre>

<p>Alice può anche “ghostare” il servizio, ad es. mysql</p>

<pre><code class="language-bash"># mysql
fwknop -n alice -A tcp/80 -R -w /usr/bin/wget -D 5.112.84.211 -U &lt;username_alice&gt; -N 192.168.100.109:3306
</code></pre>

<h4 id="bob">Bob</h4>

<p>Bob può raggiungere il db o il server windows in remote desktop, non il webserver.
Ad es.</p>

<pre><code class="language-bash"># mysql
fwknop -n bob -A tcp/3306 -R -w /usr/bin/wget -D 5.112.84.211 -U &lt;username_bob&gt; -N 192.168.100.109
</code></pre>

<h4 id="carol">Carol</h4>

<p>A Carol invece è consentito solo l&#39;accesso al db mysql  e solo da due subnet specifiche.</p>

<p>Ad es.</p>

<pre><code class="language-bash"># mysql
fwknop -n carol -A tcp/3306 -a 154.23.162.99 -D 5.112.84.211 -U &lt;username_carol&gt; -N 192.168.100.109
</code></pre>

<p>Né Bob, né Carol possono ghostare servizi.</p>

<p><small> Riferimenti:</p>
<ul><li><a href="https://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html" rel="nofollow">https://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html</a>
</small></li></ul>

<p><a href="/aytin/tag:fwknop" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">fwknop</span></a> <a href="/aytin/tag:spa" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">spa</span></a> <a href="/aytin/tag:crittografia" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">crittografia</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/fwknop-proteggere-servizi-con-single-packet-authorization-spa</guid>
      <pubDate>Sun, 15 Dec 2024 11:44:33 +0000</pubDate>
    </item>
  </channel>
</rss>