============================================================================== =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- --------------------[ previous ]---[ index ]---[ next ]--------------------- ------------------------------[ i P S E C ]----------------------------------- -------------------------[ ARCHiTETTURA Di BASE ]----------------------------- --------------------------------[ FuSyS ]------------------------------------- NO(C)1999 FuSyS ############################################################################# DISCLAIMER Ragazzi ve lo dico. Preparatevi ad un overflow di acronimi, molti sono di tipo TLA, quindi fuori le aspirine, l'acutil fosforo o le vostre sostanze preferite. Questo e' un sunto tecnico di RFC, white papers e testi letti in giro su IPSec. No. Non sulle brochures dei firewall allo SMAU :) ############################################################################# Questo articolo vuole descrivere l'architettura base di IPSec. Proposto e creato per far fronte alle richieste di sicurezza emerse nel RFC1636, IPSec dovrebbe porre fine ai problemi che sembrano affliggere (guarda un po' :) la rete da ormai qualche anno. La proposta e' tutto fuorche' recente. I vari RFC sono stati avanzati nel lontano 1995 dalla IETF e sono: RFC1825, RFC1826, RFC1827, RFC1828 ed RFC1829. Eppure questo articolo NON e' affatto in ritardo. Questo perche' l'implementazione pratica dell'architettura non e' uno standard ed anzi viene lasciato ai produttori largo spazio alla creativita' e disponibilita' all'utilizzo di diverse caratteristiche, che facciano comunque capo agli RFC. Infatti IPSec e' da ritenersi obbligatorio solo per IPv6 ed appena opzionale per IPv4. Fatto che sta comunque permettendo a vari prodotti di router e firewall di presentare soluzioni per VPN che si basino su IPSec. I servizi di base vengono forniti al livello del layer IP. Cosa vuol dire questo? Semplicemente trasparenza nei confronti delle applicazioni. Pensiamo ad esempio alla crittografia dei dati in corso di trasmissione, come con SSH. In questo caso c'e' bisogno di un protocollo apposito, ma anche e soprattutto di un'architettura client/server differente dalla usuale telnet o rlogin. Quindi le diverse parti possono trasmettere solo se tutte siano in possesso dei servizi SSH. SSL invece si trasferisce a livello del layer di trasporto. Infatti noi possiamo usare un browser quale Netscape indipendentemente per server normali o sicuri, utilizzando un sistema di crittografia mediante chiavi che critta lo stream TCP. Ma in questo caso NON posso ad esempio usare un server sicuro con lynx. Ho quanto meno bisogno di un modulo o patch per lynx perche' possa usare SSL. Esistono, e' vero, implementazioni gratuite di SSL, quali SSLeay dell'autore di libdes. Ma ogni codice deve essere linkato alla libreria opportuna. Spostandoci a livello IP con IPSec, invece, potremo continuare ad usare il nostro caro vecchio telnet, da bravi utenti pigroni, senza che il nostro admin si debba mai preoccupare (si spera :) delle password inviate. A dire il vero per gli utenti comuni e le loro applicazioni non cambiera' proprio un accidenti, almeno finche' non si parla di possibili argomenti tipo policy, uso/scambio di chiavi user/user piuttosto che host/host (vedi dopo). Potranno lavorare come prima, lasciando che sia il layer base ad occuparsi di: -controllo degli accessi -integrita' dei dati -autenticazione dell'origine della trasmissione -rifiuto di pacchetti ritrasmessi (tipico attacco contro Kerberos e PPTP) -confidenzialita' dei dati (crittazione) IPSec dovrebbe garantire tutto questo mediante l'utilizzo di due nuovi protocolli: uno di autenticazione basato sull'header AH, Authentication Header; l'altro di autenticazione e crittografia basato sull'header ESP, Encapsulating Security Payload. SA - Associazioni di Sicurezza Questo e' un concetto chiave dell'implementazione. Un SA e' una relazione univoca tra originante e destinatario che permette l'uso dei sistemi di sicurezza per il flusso di dati della loro trasmissione. Nel caso ci debba essere una relazione di tipo peer si dovranno usare due SA, una per verso della trasmissione. Ogni SA e' definito da tre parametri: 1) SPI - Security Parameters Index Si tratta semplicemente di una stringa di bit presente su ogni pacchetto inviato, che permetta di far riferimento alla SA in uso. 2) indirizzo IP di destinazione 3) Security Protocol Identifier Questo indica se sia in uso una SA con AH o con ESP. Come vengono gestite o scelte queste SA? In ogni implementazione deve essere presente, anche se non viene bene spiegato come, [e' praticamente evidente che ogni produttore abbia le mani libere] un database di SA, o SAD :), che definisca per ogni SA questi parametri: Sequence Number Counter Un valore a 32bit usato per generare il numero di sequenza negli header AH e ESP Sequence Number Overflow Una flag per indicare se dopo overflow del numero di sequenza si debba generare un log e prevenire ulteriori trasmissioni di pacchetti nella SA in corso Anti-Replay Window Usata per capire se un pacchetto inbound di tipo AH o ESP sia un reinvio invece di un originale AH Info Algoritmi di autenticazione, chiavi, validita' delle stesse, e parametri relativi. ESP info Idem come sopra, con marcato riguardo alla crittografia Lifetime Intervallo di tempo o di byte dopo il quale sia necessario variare SA o terminare la connessione. IPSec Protocol Mode Tunnel, trasporto o * MTU Ora che siamo parecchio nella melma, relativamente a tutti questi parametri, cerchiamo di capire come effettivamente vengano utilizzati o finalizzati allo scopo di "Servire e Proteggere"(C). IPSec fornisce all'amministratore notevole flessibilita' di spceifica relativamente alle SA. Esiste una sorta di database delle policy, o SPD, Security Policy Database, che gestisce dei record ognuno dei quali puo' associare un determinato flusso di dati IP ad una o piu' SA insieme per fornire la protezione ed integrita' desiderata ai nostri dati. Un po' come le rules dei firewall, in grado di avere dei positivi o negativi a seconda del tipo di traffico, ed in base a questi agire secondo le rules stesse. Ogni record dentro al SPD contiene i selettori delle SA, che devono essere comparati con quelli contenuti nei pacchetti della trasmissione e la serie di SA associate a quei selettori. Dopodiche' il sistema sara' in grado di operare il processo IPSec. I selettori usati per l'associazione delle SA sono: - indirizzi IP sorgente/destinazione Abbastanza ovviamente, come per i firewall possiamo discriminare in base ai punti base del traffico. Potremo specificare indirizzi unicast, wildcard e range di indirizzi. Se useremo delle wildcard o dei range potremo ovviamente mappare piu' SA a seconda di ulteriori altri selettori discriminanti. - UserID Ehi questo e' interessante davvero. Poter finalmente discriminare in base agli sgarbi subiti :). Cioe' no, in base alle richieste o necessita' di singoli utenti, piuttosto che di interi sistemi. - Data Sensivity Level WOW. Non solo utenti, ma anche tipo di dati maneggiati, divisibile in Secret o Unclassified. - Transport Layer Protocol Ehi il solito campo ip->protocol del caro IPv4 o ip->nexthdr del novello IPv6. - IPSec Protocol AH o ESP - porte sorgente/destinazione univoche, range o wildcard ovviamente :) - IPv6 Class e Flow Label Ottenuti dall'header IPv6 - IPv4 TOS Type Of Service Ok. Ora sappiamo, piu' o meno, come dovrebbe decidere lo stack IPSec sul da farsi. Ma una volta deciso? Esistono due modalita' principali di funzionamento: trasporto e tunnel. TRASPORTO Questa modalita' gestisce protezione in primo luogo solo per i protocolli dei layer soprastanti. Ovvero si associa al cosiddetto payload, carico dei pacchetti IP. Questo vuol dire, ad esempio, gli header TCP/UDP, quelli ICMP, ed i dati ad essi connessi. Quindi usando AH o ESP verranno protetti, autenticati o criptati solo i dati dopo l'header IP, in IPv4 subito dopo, in IPv6 dopo gli header estesi. ESP cripta solo il carico, laddove AH lo autentica occupandosi anche di alcuni campi dell'header IP. TUNNEL In questo modo invece e' possibile fornire ed estendere la protezione all'intero pacchetto IP. Questo perche' viene incapsulato all'interno di un nuovo stream punto punto in nuovi pacchetti IP, dopo che gli originali siano stati sottoposti ad AH o ESP. Questo incapsulamento e' alla base delle cosiddette VPN, o Virtual Private Networks. Vediamo uno schema: IP prima --------------------------- | IPHDR | PAYLOAD A/B | --------------------------- HOST A <-----> FIREWALL/GATEWAY1 | | INCAPSULAMENTO PER VPN | | --------------FIREWALL/GATEWAY2 <-----> HOST B IP durante l'incapsulamento operato dai gateway ----------------------------------------- | IPHDR GW<>GW | IPHDR | PAYLOAD A/B | ----------------------------------------- payload dell'IP incapsulato Come possiamo vedere ora il pacchetto IP e' stato rinchiuso all'interno di un nuovo pacchetto, che mostra i dati relativi alla connessione tra i due gateway e NON quelli relativi ad A<>B ... il GW dell'host destinatario si adoprera' per decapsulare il pacchetto e trasmetterlo al legittimo destinatario. Ovviamente, se protetto con ESP non sara' possibile capire che il payload del secondo pacchetto sia in realta' un pacchetto IP incapsulato. Conseguenze prime: riservatezza e possibilita' di non divulgare all'esterno nomi ed indirizzi di sistemi privati. Questo almeno finche' i gateway non siano compromessi. AH - AUTHENTICATION HEADER Questo header fornisce un supporto per l'integrita' e l'autenticazione dei dati trasmessi e delle parti in causa nella trasmissione. La prima dovrebbe garantire che i pacchetti non siano stati in alcun modo alterati durante il loro tragitto, mentre la seconda fornisce un aiuto per il riconoscimento del sistema od utente remoto, oltre ad IMPEDIRE attacchi di spoofing. Oltretutto garantisce contro attacchi di replay dei pacchetti. Questi tipi di autenticazione sono basati su di un codice di autenticazione dei messaggi, o MAC, che richiede l'uso di una chiave segreta per entrambe le parti. Vediamo ora questo AH: 0 8 16 31 --------------------------------------------------------- | next header | payload len | RESERVED | --------------------------------------------------------- | Security Parameters Index (SPI) | --------------------------------------------------------- | Sequence Number | --------------------------------------------------------- | | | Authentication DATA | | variable | --------------------------------------------------------- NextHeader, 8bit per identificare il tipo di header successivo ad AH. PayLoad len, 8bit per specificare la lunghezza in parole a 32bit meno 2. 16bit riservati per usi futuri. SPI, di cui abbiamo gia' parlato Sequence Number, un numero di sequenza necessario per il rifiuto di pacchetti gia' trasmessi. Authentication Data, variabile, ma deve comunque essere un numero di parole a 32bit che contiene il MAC del pacchetto. AH fornisce un servizio AntiReplay per poter discriminare tra pacchetti gia' ricevuti in modo da proteggersi da attacchi di ritrasmissione dei dati. Questo servizio e' mediato dal numero di sequenza contenuto in AH. Questo viene generato uguale a 0 ed incrementato per ogni pacchetto generato all'interno della stessa SA. Di default il servizio antireplay e' attivo, per cui chi trasmette non deve permettere al suo numero di sequenza di superare 2^32-1, altrimenti ci sarebbero piu' numeri validi. Per ovviare a cio' si scarta la SA in corso e se ne inizia una nuova. Ricordiamo che IP puo' andare incontro a perdita o mancato ricevimento sequenziale dei pacchetti. IPSec non fa eccezione, quindi la finestra di accettazione dei pacchetti dovra' essere flessibile, ovvero di una dimensione uguale a 64, col numero a destra come il piu' alto numero di sequenza ricevuto. Ogni numero compreso tra N (il numero stesso) - 64 + 1 viene marchiato come ricevuto. Se viene ricevuto un pacchetto alla destra della finestra e se il MAC corrisponde, la finestra avanza di uno. Se viene ricevuto a sinistra viene scartato, cosi' come nel caso che il MAC non sia valido e viene generato un log. Ma come viene autenticato ogni pacchetto? Con il MAC per l'appunto. Ovvero?! :) Gli RFC specificano che si usi uno di questi due algoritmi per la gestione del MAC: HMAC-MD5-96 e HMAC-SHA1-96. Non sta a me delucidarvi su questi due algoritmi (ne avrei bisogno anche io :) ma posso dirvi con quali elementi siano usati per autenticare il pacchetto. Sostanzialmente usa elementi dell'header IP che siano immutabili o prevedibili, poi tutto l'header AH ed infine il payload, che puo' essere un semplice header di trasporto come TCP + dati, oppure tutto il pacchetto IP nel caso di modalita' tunnel. Gli elementi dell'header che non variano sono ihl e version e l'IP sorgente ad esempio. Prevedibile e' l'IP destinatario. Campi variabili sono invece il ttl ed il checksum che quindi vengono azzerati prima di essere computati nel MAC. Dal momento che gli indirizzi IP vengono utilizzati per il computo destinato all'autenticazione dei pacchetti, e' evidente come questo possa proteggere dallo spoofing gli host che ne facessero uso. Per IPv6 invece sono utilizzati la Versione (che non varia), l'indirizzo di destinazione (variabile, ma prevedibile dalle tabelle di routing ad esempio); mentre viene azzerato il Flow Label che e' invece totalmente variabile. MODALITA' DI TRASPORTO E TUNNEL Per quanto riguarda IPv4 in modalita' trasporto, l'AH viene inserito dopo l'header IP originale e prima del payload, comprensivo dei layer superiori; L'autenticazione copre l'intero pacchetto, tranne che per quei campi variabili suddetti che vengono azzerati nel computo del MAC. --------------------------------- prima | IP Hdr | TCP Hdr | Data | --------------------------------- ----------------------------------------- dopo | IP Hdr | AH | TCP Hdr | Data | ----------------------------------------- per IPv6 invece, l'AH viene posto dopo gli header originali, anche quelli estesi (tranne quello di opzioni per la destinazione che puo' essere prima o dopo), ma non viene considerato o processato dai router intermedi, anzi viene visto come normale payload punto-punto. Anche in questo caso l'autenticazione copre l'intero pacchetto. ----------------------------------------- prima | IP Hdr | Xtnd | TCP Hdr | Data | ----------------------------------------- ------------------------------------------------- dopo | IP Hdr | Xtnd | AH | TCP Hdr | Data | ------------------------------------------------- In modalita' tunnel invece, tutto il pacchetto e' si autenticato, ma l'AH viene posto tra l'header originale ed il nuovo ed esterno header incapsulante. ESP - Encapsulating Security Payload Questo protocollo permette ad IPSec di fornire servizi di confidenzialita' dei dati. Puo' anche fornire opzionalmente gli stessi servizi di AH in merito all'autenticazione dei dati stessi. Ecco l'header ESP: 0 16 24 31 ------------------------------------------------- | Security Parameters Index (SPI) | ------------------------------------------------- | Sequence Number | ------------------------------------------------- | | | | | Payload Data (variable) | | --------------------------------- | | | ----------------- ------------------------- | Padding (0-255) | Pad Len | Next HDR | ------------------------------------------------- | Authentication Data (variable) | ------------------------------------------------- Beh, l'SPI l'abbiamo ormai visto e rivisto, identifica le SA. Anche il numero di sequenza dovrebbe esser chiaro. Payload data non e' altro che il segmento di trasporto o, nel caso di modalita' tunnel, il pacchetto IP incapsulato. Il PADDING e' importante. Serve a tre scopi: - se un algoritmo per la crittografia dei dati richiede che il testo in chiaro sia un multiplo di qualche valore, possiamo aumentare i dati fino a renderli tali - ESP richiede che i campi successivi siano allineati in una parola di 32bit. Oltretutto il testo cifrato dev'essere un multiplo intero di 32 - puo' essere usato per aumentare la confidenzialita' dei dati, oscurando la reale lunghezza dei dati, una volta che siano stati cifrati Pad len indica il numero di byte precedenti questo campo. Next header identifica il tipo di dati contenuti nel payload, una volta che sia stato cifrato. Authentication data contiene il MAC computato su tutto il resto dell'header ESP. Gli algoritmi utilizzati nella crittografia dei pacchetti IP o dei payload nel caso di semplice trasporto sono: triploDES con 3 chiavi, RC5, IDEA, triploIDEA con 3 chiavi, CAST e Blowfish. Per algoritmi che richiedano dati specifici come l'IV, initialization vector, questi possono essere inseriti all'inizio del payload. La specifica base richiede almeno il DES in CBC, cipher block chaining. Ogni prodotto che sia stato certificato come IPSec compliant deve rispondere a questi requisiti. MODALITA' DI TRASPORTO E TUNNEL In modalita' trasporto, ESP puo' essere utilizzato per criptare ed autenticare i dati trasportati da IP, come con TCP. In questo caso l'header ESP si trova tra l'originale IP e quello dei layer superiori. Come avrete immaginato, se TCP e dati vanno nel campo payload di ESP, dove finiranno gli altri campi di ESP? Semplicemente in un suffisso DOPO il pacchetto IP originale. Avremo ad esempio per IPv4: -------------------------------------------------- | IP hdr | ESP hdr | TCP hdr | data | ESPe | ESPa| -------------------------------------------------- dove ESPe include Padding, PAD len, next hdr ed ESPa invece l'authentication data. Le operazioni di trasporto di ESP consistono in: - alla sorgente il payload (TCP e dati) ed il suffisso ESP, o trailer, vengono crittati. Nel caso di autenticazione si aggiunge il campo apposito e si calcola il MAC. - ogni hop puo' esaminare l'header, ma NON il payload cifrato - alla destinazione, in possesso delle chiavi, il payload viene decrittato in base all'SPI dell'header ESP. La modalita' tunnel e' diventata famosa con l'avvento delle VPN. In questo caso viene criptato TUTTO il pacchetto IP e poi incapsulato in un altro con gli indirizzi dei gateway. In questo caso l'ESP si trova prima dell' header originale, ma DOPO il nuovo header IP. In questo caso il peso dei processi criptograffici investe solo i sistemi che si occupano del routing in internet, laddove gli host sulle LAN protette possono inviare tranquillamente i loro pacchetti in chiaro, sicuri che il firewall mediante la gestione delle SA, incapsuli le loro connessioni tra un gateway e l'altro. - la sorgente preleva il pacchetto, gli prepende un ESP, postpende il trailer e cripta tutto il pacchetto, dopodiche' lo incapsula in un altro IP e lo invia - gli hop intermedi possono solo processare gli header esterni aggiunti dal router IPSec e non i dati criptati. - alla destinazione il pacchetto viene liberato dall'incapsulamento e decriptato per essere poi inviato in chiaro nella LAN protetta. E' chiaro che le varie SA possano essere combinate per venire incontro alle esigenze delle varie configurazioni di rete. In due modi sostanzialmente: mediante adiacenza o tunnel iterativo. Nel primo caso si decide di utilizzare l'AH e l'ESP indipendentemente sullo stesso pacchetto, in maniera sequenziale, mentre nel secondo modo si inseriscono tunnel uno dentro l'altro, un po' come per i remailer cipherpunk. GESTIONE DELLE CHIAVI Come abbiamo visto sono necessarie chiavi segrete sia per il MAC dell'AH che per gli algoritmi dell'ESP. Ebbene e' inutile girarci intorno. :) Ci sono in pratica solo due modi: o gestirle in un database statico, nel caso le comunicazioni siano limitate a pochi sistemi, oppure mediante un sistema sicuro di presentazione dinamica delle chiavi. Per questo secondo metodo si usano due protocolli specificati negli RFC: ISAKMP e Oakley. Il primo non si occupa letteralmente della gestione delle chiavi. In realta' serve a negoziare tra le parti in modo da poter gestire le chiavi con il protocollo Oakley. Questo e' una modifica dell'algoritmo Diffie-Hellman. Tale modifica si basa sull'uso di gruppi di calcolo di cookie utilizzati per l'estrapolazione di una comune chiave di sessione cercando di proteggersi da attacchi tipo man-in-the-middle. Eventualmente le parti in gioco possono anche utilizzare firme digitali basate su hash ottenibili da userid ed altri parametri, oppure mediante crittazione a chiave pubblica .... Non e' compito di questo articolo la presentazione degli algoritmi per lo scambio e la gestione delle chiavi, quanto presentare una introduzione all'architettura di IPSec. Per chi volesse saperne di piu' e' consigliabile rivolgersi a testi di un certo calibro e peso :) tipo Applied Cryptography di B.Schneier o Cryptography and Network Security di W.Stallings. Questo e' in soldoni un primo "what's!??!" su IPSec. Ovviamente non deve bastarvi questo se siete realmente interessati. Gli RFC che ho nominato possono fare per voi. Come al solito un buon libro potra' di certo esser d'aiuto per TCP/IP in generale, e saprete ormai a memoria quale suggerirei, vero?! :P Per gli aspetti relativi alla sicurezza sull'uso delle chiavi rifatevi ai libri che ho nominato piu' sopra per la criptografia. ED IL CODICE ?! Sorry, ma non c'e' codice in questo articolo. Iiiiihhhhhh! Lo so :) ma non c'e' molto in giro. Anche per Linux sono dolori al momento. Dovreste patcharvi il kernel per usare il modulo x-kernel su cui stanno sviluppando un applicazione IPSec free. Cercate su altavista ipsec+xkernel+linux e ci arriverete. Al momento vi dovete accontentare di IPv6. Cercate nella dir /usr/src/linux/net/ipv6 del kernel 2.2.x e guardate anche in /usr/src/linux/Documentation . Ma ci sara' sicuramente tempo per i codici e gli attacchi/difese. Non manca ancora molto ad IPv6 ed IPSec: arriveranno prima che tutti voi vi siate stufati di questi giochi :) ed allora per ballare bisognera' capire e codare, come sempre... See you there, FuSyS --------------------[ previous ]---[ index ]---[ next ]--------------------- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ==============================================================================