Guida [miniGuida_spiegata.bene] Infarinata/Ripassino/Accenni su IPsec

Stato
Discussione chiusa ad ulteriori risposte.

syscall

Utente Emerald
21 Settembre 2013
683
43
581
475
Ultima modifica da un moderatore:
Ciao ragazzi,

oggi ce l'ho particolarmente girate e quindi mi sfogo un po' scrivendo per inforge, come sempre quando voglio pestare sulla tastiera immaginando di "buttare" in /dev/null qualsiasi cosa.. comunque..ho notato che non c'e' niente in merito, pardon anticipatamente se m'e' sfuggito.. e volevo condividere con voi una sorta di "riassunto/miniguida" o chiamatela come volete, su IPsec che scrissi tempo fa e non ricordo piu' per cosa sinceramente (e che ho riordinato e semplificato un attimo (aggiungendo molto piu' testo) per inforge), si', scrivo boiate in papers piu' o meno seri da anni e salvo tutto LOL, ma che comunque potrebbe essere utile per chi fosse interessato all'argomento e volesse avere una preview generale ovviamente da approfondire successivamente.

Vabeh, torniamo seri, o almeno proviamoci!

Tralasciando i soliti wikipedia & co (che spesso (anche se suona strano) non sono proprio esaustivi e ordinati ma che comunque magari linkero' alla fine, come sempre, per la felicita' di tutti) spieghiamolo a modo nostro ed in maniera piu' semplice possibile.

Diciamo subito che IPsec e' l'acronimo di Internet Protocol Security, non e' altro che una suite di protocolli che e' stata principalmente progettata al fine di rendere sicure comunicazioni IP, grazie appunto alla possibilita' di trasferire pacchetti cifrati e di autenticare i nodi.

L'IPsec e' supportato nativamente da IPv6 ma lo si puo' avere anche su IPv4.

Con IPsec e' possibile sapere se due nodi possono connettersi oppure no, ed e' possibile fare un'autenticazione sull'origine dei dati, non e' quindi possibile fare spoofing, si garantisce inoltre l'integrita' dei campi immutabili, confidezialita' dei dati, in quanto sono cifrati, e si garantisce la protezione da replay grazie allo sliding window con contatore!

E' composto da una suite di protocolli, l'Authentication Header che e' usato per l'integrita' e l'autenticazione + protezione da replay e dall'Encapsulating Security Payload, che e' usato per la confidenzialita'.

Ambedue i protocolli usano una security association per lo scambio delle chiavi, identificata dal campo security parameter index.

Quindi, ad ogni connessione IPsec e' abbinata una security association (ovvero i nodi che hanno intenzione di comunicare si mettono "d'accordo" sugli algoritmi crittografici da utilizzare, le chiavi e quant'altro). Le security association sono diverse per authentication header ed encapsulating security payload e sono stabilite staticamente o dinamicamente, rispettivamente amministratore di rete che configura la rete (1) | protocolli che stabiliscono lo scambio delle credenziali e parametri di sicurezza(2)

Come abbiamo detto precedentemente, con IPsec e' possibile avere protezione da attacchi di replay ed in modo particolare l'authentication header fa uso dello sliding window, che consiste nell'accettare, in un determinato intervallo di tempo, solo i pacchetti contenuti in una data finestra temporale, quindi tipo se ricevo solo pacchetti numerati dal 5 al 9 saranno scartati quelli inferiori al 5 o superiori al 9. Lo sliding window fa riferimento al fatto che se vogliamo reinizializzare il counter bisognera' accordarsi su un nuovo security assosation!

L'algoritmo sliding window non e' particolarmente complesso, si inizializza a 0 un array di lunghezza L (in genere si parla di 64bit), che rappresenta la finestra temporale, quindi:

Codice:
window[L]=0

Appena si riceve un pacchetto con un dato indice n (esempio 110), ne si tiene traccia inserendolo alla fine dell'array, quindi:

Codice:
window[L]=n;

(se presuppongo che l'array inizi da 0 invece che da 1 l'ultimo elemento sara' ovviamente L-1 e non L)

Da questo momento in poi arriveranno altri pacchetti da un contatore "i" generico e possono verificarsi tre casi:

Codice:
if(i <= n && i >= n-L+1 && check_integrity() == true) {

1) Pacchetto integro e contenuto nella finestra

Il campo dove dovrebbe stare l'indice del pacchetto ricevuto non e' più inizializzato a 0, cio' significa che l'avevo gia' ricevuto.

Codice:
if( window[i+L+n] > 0 ) 
Tentativo di Replay

else

window[i+L+n] = i; // In caso contrario memorizziamo l'indice del pacchetto
 
 }
 else if( i<= n-L) {
2) Pacchetto fuori dalla finestra, piu' vecchio e quindi lo scarto:

Codice:
 }
 else if(i>n && check_integrity() == true) {
3) Pacchetto fuori dalla finestra ma piu' recente. A questo punto sliding (sposto) la finestra in modo tale per cui "i" diventi il nuovo limite accettabile

Codice:
 }
In breve, che e' sta roba..? Inizializziamo l'array della finestra ed aggiorniamo il limite accettabile di pacchetti da ricevere con l'indice del primo pacchetto in ricezione.
Successivamente, ad ogni pacchetto che riceviamo, controlliamo se e' contenuto nella finestra e se e' integro. Se e' contenuto ma l'abbiamo gia' ricevuto in passato allora sara' un replay attack, in caso contrario ne memorizzeremo l'indice nell'array!

E' possibile che potremmo ricevere un pacchetto che vada sotto il limite inferiore della finestra (pacchetto vecchio), in quel caso lo scarteremo, o che potremmo ricevere un pacchetto che vada oltre il limite massimo della finestra. In questo caso, dopo che ne avremo controllato l'integrita', setteremo questo nuovo come indice massimo della finestra, andando quindi a fare uno sliding.

Anyway, come gia' detto l'encapsulating security payload si usa per la cifratura dei pacchetti, che puo' avvenire in due modi:

- Transport: si cifrano i livelli superiori a quello ip, quindi transport (tcp/upd) ecc ecc..
- Tunnel: si cifrano i pacchetti IP

Il problema di IPsec sta nella complessita' di gestirlo con un firewall e non e' assolutamente banale da configurare in sistemi come proxy e NAT che manipolano pacchetti (testato sulla mia pelle, LOL), e penso che sia proprio per questo motivo che non ha riscontrato tutto quel successo che ci si aspettava da una roba simile..

Bon, come al solito, per chi volesse approfondire un attimo consiglio:

- https://www.google.it/url?sa=t&rct=...tna0hyhp16GOE68IqHWUotA&bvm=bv.53537100,d.bGE
- http://net.infocom.uniroma1.it/corsi/Lab_applicazioni/lucidi/Dispense di Network Security.pdf
- IPsec
- http://www.ucci.it/docs/ICTSecurity-2003-17b.pdf
- http://www.matteocicuttin.it/downloads/talk/ipsec-OSD2010.pdf
- Finestra scorrevole - Wikipedia
- Sliding window protocol - Wikipedia, the free encyclopedia (decisamente molto piu' completa la versione english :p)
- http://spazioinwind.libero.it/fanciullimassimiliano/files/universita/IPsec_1_su_1.pdf
- Replay attack - Wikipedia
- http://www.rfc-editor.org/rfc/rfc2401.txt
- http://www.rfc-editor.org/rfc/rfc2406.txt
- http://www.rfc-editor.org/rfc/rfc4302.txt
- http://www.rfc-editor.org/rfc/rfc4303.txt

NOTA: Non so se l'abbia mai detto, mi sa di si da qualche parte, ma comunque lo ripeto. Con le guide che scrivo per inforge fateci quello che volete, usatele come meglio credete, ridistribuitele pure se volete, non me ne importa niente che ci scriviate "by syscall", quello che m'importa e' invece che ci scriviate che vengono da inforge, perche' comunque non devono essere "sempre gli altri a fare robe", ma na volta ogni tanto anche noi possiamo "dare" e "fare" per la comunita' e comunque per alimentare la conoscenza degli aspiranti informatici (sicuristi e non) italiani!

Ciao, ciao o/
 
Stato
Discussione chiusa ad ulteriori risposte.