Mini lezione
di reti
Per capire dove ci stiamo muovendo,
è fondamentale spiegare seppur brevemente e in maniera semplicistica,
come il protocollo TCP/IP funziona.
Per ridurre
la complessità di progettazione, la maggior parte delle reti sono
organizzate come una serie di strati o livelli, ognuno costruito su quello
inferiore: il livello inferiore fornisce dei servizi a quello superiore.(fig.
1)
TCP/IP indica
quindi il tipo di protocollo utilizzato, ed in particolare IP si riferisce
al livello di rete ( Internet Protocol ), mentre il TCP ( Trasmission Control
Protocol) è il protocollo di livello di trasporto impiegato.
Queste possono apparire solo come
delle sigle ma dietro ad esse, esiste tutto il progetto di Internet.
Il compito dell'IP
è quello di permettere ad un host, di inserire pacchetti in una
qualsiasi rete, in modo tale che questi viaggino indipendentemente verso
la destinazione. L'importante è notare che questi pacchetti così
instradati possono arrivare in un ordine diverso da quello con cui erano
stati spediti, sarà poi compito del livello superiore (TCP) ordinarli
per fornirli a sua volta all'applicazione ( WEB, FTP, E-mail, ecc. ).
Si capisce quindi che il protocollo di livello di trasporto TCP, fornisce
un ordinamento dei pachetti ed eventualmente richede quei pacchetti andati
persi nel routing tra reti. A livello trasporto esiste anche il protocollo
UDP (User Data Protocol ) che è un protocollo non confermato, e
viene utilizzato per lo più per applicazioni non affidabili, o che
comunque non rientrano nell'utilizzo del TCP (quest'ultimo è un
protocollo pesante e quindi per applicazioni real-time, quali voice su
IP e videoconferenze viene utilizzato l'UDP dato che dalla richiesta di
un pacchetto andato perso a quando arriva effettivamente, la deadline scadrebbe
) fig.2.
Nei primi numeri
di questa rivista, si è spiegato come in Java sia possibile tramite
la classe Socket effettuare delle comunicazioni tra host. Quello era un
esempio di connessione affidabile e quindi basata su TCP. Mentre la classe
DatagramSocket costituisce il punto di accesso all'UDP.
La sicurezza
in ambiente TCP/IP
Sono possibili
diversi di approcci per ottenere una sicurezza in ambiente TCP/IP. Questi
sono simili nel servizio che forniscono e nei meccanismi che usano, ma
differiscono rispetto al loro ambiente di applicabilità e nella
loro relativa localizzazione all’interno dello stack TCP/IP.
Tra questi meccanismi
vi è l’IP Security. Con esso si fornisce trasparenza agli utenti
finali e quindi alle applicazioni, e ottiene una soluzione general-purpose.Inoltre,
include una capacita’ di filtering, in modo da permettere al solo traffico
selezionato, il processamento del suo header.Implementando la sicurezza
a livello IP, un'organizzazione può assicurare un networking sicuro
non solo per le applicazioni che hanno meccanismi di sicurezza, ma anche
per molte applicazioni che non le hanno, dette appunto security-ignorant.
Altra soluzioni,
relativamente general-purpose, permettono di implementare la sicurezza
appena sopra al TCP. Il primo esempio di questo approccio e’ il Security
Socket Layer (SSL), e il susseguente internet standard del SSL conosciuto
come Transport Layer Security(TLS). A questo livello, ci possono essere
due scelte implementative. Per essere totalmente generale, SSL (o TLS)
potrebbe essere pensato come parte della sottostante suite di protocolli
e perciò essere trasparente all’applicazione. Alternativamente,
l’SSL potrebbe essere inglobato in uno specifico packages.
Servizi di sicurezza
specifici sono inglobati in particolari applicazioni; il vantaggio di quest’approccio
e’ che la sicurezza potrebbe essere dettagliata per le specifiche necessita’
di una data applicazione ( e quindi una chiave abbastanza lunga ad esempio,
leggi di export permettendo). Nel contesto della web Security un importante
esempio di questo approccio è dato dal Security Electronic Transaction
(SET).In Internet, sono stati sviluppati meccanismi di sicurezza specifici
per le applicazioni, quali e-mail (PGP, S/MIME), client/server (Kerberos)
ecc.
Secure Socket
Layer (SSL)
Il Secure Socket
Layer è stato ideato dalla Netscape. La versione 3 del protocollo
è stato esaminato pubblicamente e pubblicato come Internet draft
document. Successivamente, quando è stato raggiunto un ampio consenso
per stadardizzare il protocollo ( come accade in Internet prima nasce lo
"standard de facto" e poi quello effettivo), è stato formato nell’IETF,
il TLS working group, che studia standard comuni. Il corrente lavoro sul
TLS è mirato allo sviluppo di una versione iniziale come Internet
standard. La prima versione del TLS potrebbe essere vista essenzialmente
come una SSLv3.1, ed è veramente vicino e quindi compatibile alla
precedente SSLv3.
Il protocollo
SSL combina le capacità dei tre principali ma separati protocolli
IPSec e li applica per una protezione a livello di trasporto. Il più
comune uso che si fa dell’SSL è di includerlo sul World Wide Web.
Questi tre protocolli inclusi nell’SSL comprendono autenticazione, criptaggio
e scambio chiavi. Nell’IPSec questi sono forniti dai protocolli separati:
AH, ESP e protocolli per scambio chiave quali SKIP e ISAKMP. I dati dell’SSL
sono sempre trasmessi in un formato speciale che incorpora una checksum
simile all’AH e un identificatore per security association simile all’ESP.
Quando due host iniziano a comunicare usando l’SSL, il messaggio iniziale
usa uno speciale protocollo di handshake per stabilire gli algoritmi di
criptaggio e le chiavi da usare. Vediamo comunque in dettaglio i vari aspetti
del protocollo.
SSL Architecture.
SSL è
stato progettato per essere usato dal TCP e fornire un servizio end-to-end
affidabile e sicuro. L’SSL non è rappresentato da un singolo protocollo,
ma piuttosto da un protocollo a due livelli:
L’SSL Record
Protocol fornisce i servizi basilari di sicurezza ai vari protocolli di
livello più alto. Ad esempio, l’HTTP, che fornisce i servizi di
trasferimento per le interazioni WEB client-server, può operare
alla cima del SSL. I tre più alti livelli del protocollo sono definiti
come parte del SSL: l’Handshake protocol, il Change Cipher Spec Protocol
e l’ Alert Protocol. Questi specifici protocolli dell’SSL sono usati nel
management degli scambi SSL e saranno analizzati più avanti.
Due importanti
concetti dell’SSL sono l’SSL session e la SSL connection,
che sono definiti nello specifico come segue:
Connection:
una connessione è un trasporto ( nella definizione del modello di
layering OSI) che fornisce un adatto tipo di servizio.Per SSL, questa connessione
è una peer-to-peer relationships. Le connessioni sono transitorie
e ogni connessione è associata con una sessione.
Session:
una sessione SSL è un’associazione tra un client e un server.
Sessioni sono create dal Handshake Protocol. Sessioni definiscono un set
di parametri di sicurezza crittografica che possono essere condivisi su
multiple connessioni. Sessioni sono usate per permettere la negoziazione
di nuovi parametri per ogni connessione.
Tra ogni coppia
di parti ( i.e. client e sever nel HTTP) ci potrebbero essere più
connessioni sicure. In teoria ci potrebbero essere anche mutiple e simultanee
sessioni tra le parti, ma questa caratteristica in pratica non è
usata.
Ci sono anche
un numero di stati associati con ogni sessione.Appena una sessione è
stabilita, esistono degli stati operanti per lettura e scrittura ( i.e.
recevive e send). In aggiunta , durante l'Handshake Protocol, vengono creati
degli stati quali "letture sospese" e/o "stati scrivibili".
Quando si conclude con successo l’Hanshake Protocol, gli stati sospesi
diventano stati correnti.
Uno stato di
sessione è definito dai seguenti parametri:
-
Session identifier:
una sequenza di byte arbitrari scelta dal server per identificare uno stato
di sessione, attivo o recuperabile
-
Peer certificate:
Un certificato X509.v3 del peer, elemento che potrebbe anche essere nullo.
-
Compression method:
l’algoritmo usato per comprimere i dati prima della criptazione.
-
Cipher spec:
specifica l’algoritmo di data encryption e l’hash algorithm usato per il
calcolo del MAC. Esso definisce anche attributi crittografici quali l’hash_size.
-
Master secret:48
byte segreti condivisi tra client e server.
-
Is resumable:
un flag che indica se la sessione può essere usata per iniziare
una nuova connessione.
Uno stato della
connessione è definito dai seguenti parametri:
-
Server e client
random: una sequenza di byte random che sono scelti dal server e dal
client per ogni connessione.
-
Server write
MAC secret: la chiave segreta usata nelle MAC operation sull’invio
di dati dal server.
-
Client write
MAC secret: la chiave segreta usata nelle MAC operation sull’invio
di dati dal client.
-
Server write
key: la chiave di encryption convenzionale per i dati criptati dal
server e decriptati dal client.
-
Client write
key: la chiave di encryption convenzionale per i dati criptati dal
client e decriptati dal server.
-
Initialization
vectors: quando viene usato un block cipher nel CBC mode, un vettore
di inizializzazione è mantenuto per ogni key. Questo campo è
prima inizializzato dal SSL Handshake Protocol. Dopo di ciò, il
blocco di testo cifrato finale di ogni record è conservato per essere
usato come vettore di inizializzazione nel seguente record.
-
Sequence numbers:
ogni parte mantiene numeri di sequenza separate per trasmettere e ricevere
messaggi per ogni connessione. Quando una parte manda o riceve un change
cipher spec message, l’appropriato numero di sequenza è settato
a zero. Il numero non può eccedere 2^64-1
SSL Record Protocol
-
Il SSL Recor Protocol
fornisce due servizi per la connessione SSL:
-
Confidenzialità:
definisce una chiave segreta comune che è usata per il criptaggio
convenzionale del payload SSL.
-
Integrità
dei messaggi: l’Handshake Protocol definisce anche una chiave segreta
comune, che è usata per formare un message authentication code (MAC).
Il Record Protocol
prende un messaggio applicativo da essere trasmesso, frammenta i dati in
blocchi manipolabili, opzionalmente comprime i dati, applica un MAC, cripta,
aggiunge un header e trasmette la risultante unità in un segmento
TCP. I dati ricevuti sono decriptati, verificati, decompressi e riassemblati
e allora consegnati all’utente del livello più alto.
-
Il primo passo,
è dunque la frammentazione. Ogni messaggio di livello più
alto è frammentato in blocchi di massimo 2^14 byte .
-
Successivamente
è applicata la compressione, operazione comunque opzionale. Essa
deve essere lossless, cioè priva di errori e non deve incrementare
la lunghezza del contenuto di più di 1024 byte. Nella versione 3
dell’SSL non è specificato nessun algoritmo di compressione, e quindi
quello di default è il null.
-
Lo step successivo
consiste nel calcolare un Message Autentication Code (MAC) sui dati compressi.
A tale scopo viene usata una chiave segreta.
-
Il passo ancora
successivo prevede che il messaggio compresso più il MAC, vengano
criptati, usando una criptazione simmetrica. La criptazione non può
aumentare la lunghezza del contenuto più di 1024 byte, così
che la lunghezza totale non ecceda 2^14+2048. Sono permessi i seguenti
algoritmi:
Una fondamentale
assunzione nella crittanalisi, enunciata per prima da Dutchman A. Kerckhoffs
nello scorso secolo, è che la sicurezza di un algoritmo di crittografia
deve risiedere interamente nella chiave. Kerckhoffs, assume quindi che
il crittanalista, abbia una completa conoscenza dei dettagli dell'algoritmo
e quindi una sua implementazione. In generale rompere un algoritmo di criptaggio,
non necessariamente significa trovare un modo per permettere ad un intruso,
di risalire al plaintext, dal ciphertext. Rompere un algoritmo di criptaggio
semplicemente significa trovare delle debolezze, che possono essere espresse
con una complessità minore del brute force attack (ricerca esaustiva
delle chiavi).
Quest'inciso permette di capire che
in genere nella crittografia più lunga è una chiave e più
sicure sono le informazioni ( anche quì comunque esistono le eccezioni
vedi il Two DES). A causa delle leggi statunitensi sull'esportazione della
crittografia, solo alcuni degli algoritmi di fig.6 sono esportabili (utilizzabili
tra USA e resto del mondo), ed in particolare l'RC4, l'RC2 e il DES nella
versione a 40 bit.
Per gli stream
encryption, il messaggio compresso più il MAC vengono criptati,
da notare che il MAC è calcolato prima del criptaggio e inoltre
il MAC è poi criptato con il plaintext o il plaintext compresso.Per
i block encryption, il padding può essere aggiunto dopo il
MAC prima del criptaggio. Il padding è nella forma di un numero
di padding byte seguiti da un byte che indica la lunghezza del padding.
La quantità totale di padding è la più piccola quantità
tale che la grandezza totale del dato da criptare (plaintext più
MAC più padding) è un multiplo della lunghezza del blocco
dell’algoritmo di criptaggio. Ad esempio se il plaintext è di 58
byte, con un MAC di 20,usando un block cipher quale il DES con 8 byte di
blocco, allora il campo padding.length sarà 78 byte, e per rendere
la lunghezza totale un intero multiplo di 8, saranno aggiunti due byte
come padding.
-
Lo step finale dell’SSL
Record Protocol, è di preparare un header, consistente dei seguenti
campi:
-
Content Type
(8 bits): il protocollo di più alto livello usato per processare
il frammento.
-
Major Version
(8 bits): indica la maggiore versione dell’SSL in uso. Per l’SSL v3 questo
valore è tre.
-
Minor version
(8 bits): indica la minore verisone in uso. Per l’SSL v3 questo valore
è zero.
-
Compressed length
(16 bits): la lunghezza in byte del frammento di plaintext ( anche
compresso nel caso in cui si usi una compressione). Il massimo valore è
2^14+2048.
I Content
Type che sono stati definiti, sono change_cipher_spec, alert,handshake,
and application_data, dove i primi tre sono specifici protocolli dell’SSL.
Si noti inoltre che non viene fatta nessuna distinzione tra le varie applicazioni
(HTTP, SMTP ecc.) che possono usare l’SSL, rendendolo del tutto generale.
Change Cipher
Spec Protocol
Esso è uno
dei tre SSL-specific protocol, che usano l’SSL Record Protocol, ed esso
è anche il più semplice. Questo protocollo consiste di un
singolo messaggio, che è un singolo byte con valore 1. L’unico scopo
di questo messaggio è che lo stato pendente è copiato nello
stato corrente, e si aggiorna la suite di criptaggio per essere usata su
questa connessione.
Alert Protocol
E’ usato per trasportare
l’SSL relativo alert alla peer entity. Come con altre applicazioni che
usano l'SSL, i messaggi di alert sono compressi e criptati, come specificato
dallo stato corrente.
Ogni messaggio in questo protocollo
è formato da due byte. Il primo byte ha il valore warning o fatal
per trasportare la gravità del messaggio. Se il livello è
fatale, l'SSL immediatamente termina la connessione. Altre connessioni
sulla stessa sessione possono continuare, ma non nuove connessioni su questa
sessione possono essere stabilite. Il secondo byte contiene un codice che
indica lo specifico alert.
Handshake Protocol
Questa è
la più complessa parte del SSL. Questo protocollo permette al server
e al client di autenticare ogni altro e di negoziare un algoritmo di encryption,
MAC e le cryptographic keys da essere usate per proteggere i dati inviati
in un SSL record. L’Handshake Protocol consiste in una serie di messaggi
scambiati dal client e dal server. Questi hanno tutti un formato <tipo,lunghezza,valore>.
Lo scambio iniziale
necessario per stabilire una connessione logica tra client e server prevede
quattro fasi:
-
Fase 1 Stabilire
le capacità di sicurezza
Questa fase
è usata per iniziare una connessione logica e per stabilire le capacità
di sicurezza che saranno associate ad essa. Lo scambio è iniziato
dal client che manda un client_hello message fig7a con i seguenti
parametri:
Versione:
La più alta versione SSL capita dal client.
Random:
Una struttura random generata dal client, consistente di un 32 bit timestamp
e di 28 byte generati da un sicuro generatore di numeri casuale. Questi
valori servono per prevenire replay attacks e sono usati durante il key
exchange.
SessionID:
un identificatore di sessione a lunghezza variabile. Un valore non zero
indica che il client vorrebbe aggiornare i parametri di una esistente connessione
o creare una nuova connessione su questa sessione. Un valore zero invece
significa, che il client vorrebbe stabilire una nuova connessione su una
nuova sessione.
CipherSuite:
questa è una lista che contiene la combinazione di algoritmi supportati
dal client, in ordine decrescente di preferenza. Ogni elemento della lista
( ogni cipher suite) definisce sia un algoritmo di scambio chiave sia un
CipherSpec.
Metodo di
compressione: questa è una lista di metodi di compressione supportati
dal client.
Dopo l’invio
del messaggio client_hello, il client aspetta un server_hello message
fig7b, che contiene gli stessi parametri del client_hello message.
Per il server_hello message è applicata la seguente convenzione:
Version field contiene la più bassa delle versioni suggerite dal
client e la più alta supportata dal server. Il Random field è
generato dal server ed è indipendente da quello del client. Se il
campo SessionID era non zero, gli stessi valori sono usati dal server,
viceversa il campo del server SessionID conterrà il valore della
nuova sessione. Il campo CipherSuite contiene la singola cipher suite selezionata
dal server tra quelle proposte dal client. Il campo di compressione contiene
il metodo di compressione selezionato dal server tra quelli supportati
dal client.
Il primo elemento
dei parametri del Cipher Suite è il metodo di scambio chiave ( poi
conventional encryption e MAC). Sono supportati i seguenti metodi di scambio
chiave:
RSA
Fixed Diffie-Hellman
Ephemeral Diffie-Hellman
Anonymous Diffie-Hellman
Fortezza
Dopo la definizione
di un metodo di scambio chiave abbiamo il CipherSpec che include i seguenti
campi:
Cipher
Algorithm
MAC Algorithm
CipheType: cioè
a blocchi o a stream
IsExpotable
HashSize
Key Material
IV Size
A questo
punto per far capire meglio cosa avviene, facciamo un esempio di questa
fase dell'Handshake protocol: in fig 7c si evidenzia un possibile messaggio
del client verso il server che quindi viene svegliato ( corrisponde alla
fig. 7a )
Una possibile
risposta del server, può essere allora quella di figura 7d:
Come si vede
dall’esempio sarà il client a dare la preferenza, ma la scelta finale
spetta al server fornitore del servizio, che però deve rispettare
la priorità. Si noti inoltre che il numero random del server è
diverso da quello del client.
Fase
2. Autenticazione del server e scambio chiave
Il server inizia
questa fase mandando il suo certificato, se esso è necessario, per
essere autenticato.
Il certificate
message è richiesto per ogni metodo di scambio chiave su cui
si è d’accordo eccetto per anonymous Diffie-Hellman.
Dopo, un server_key_exchange
message potrebbe essere mandato, se richiesto. Esso non è richiesto
in due casi: se certificati con il fixed Diffie-Hellman oppure se si usa
un algoritmo RSA per lo scambio chiave. Questo messaggio è necessario
quindi solo in alcuni casi.
Il certificate_request
message include due parametri: tipo certificato( indica l’algoritmo a chiave
pubblica) e l’autorità del certificato ( cioè una lista dei
nomi distinti di varie autorità). Il messaggio finale della fase
2 è sempre richiesto: server_done message, che è mandato
dal server per indicare la fine del server hello e associati messaggi.
Dopo aver mandato questi messaggi il server aspetterà per una client
response. Questo messaggio non ha parametri. In figura 8 vengono specificati
questi messaggi dove quelli evidenziati sono opzionali e quindi dipendenti
dalle particolari situazioni.
Fase 3. Autenticazione
del Client e scambio chiave
Dopo la ricezione
del server_done message, il client dovrebbe verificare che il server ha
fornito un valido certificato, se richiesto e controlla che i parametri
del server_hello sono accettabili. Se tutto è soddisfatto, il client
manda uno o più messaggi indietro al server.
Se il server
ha richiesto un certificato, il client inizia questa fase mandando un certificate
message. Se nessuna certificazione adatta è disponibile, il client
manda un no_certificate alert.
Successivamente
il client_key_exchange message, che deve essere mandato in questa fase.
Il contenuto di questo messaggio dipende dal tipo di key exchange.
Infine, in questa
fase il client potrebbe mandare un certificate_verify message che provvede
ad una esplicita verifica del certificato del client (fig.9).
Fase
4. Terminazione
Questa fase
completa il settaggio della connessione sicura. Il client manda un change_cipher_spec
message e copia il CipherSpec pendente nel corrente CipherSpec. Si può
notare che questo messaggio non è considerato parte del HandShake
Protocol ma è mandato usando il Change Cipher Spec Protocol. Il
client allora immediatamente manderà il finished message con il
nuovo algoritmo. Il finished message verifica che lo scambio di chiave
e il processo di autenticazione sono stati fatti con successo. In risposta
a questi due messaggi il server manda un proprio change_chiper_spec message,
trasferendo il pendente al corrente CipherSuite, e mandando il suo messaggio
finale. A questo punto l’handshake è completato ( finalmente...)
e il client e il server possono iniziare lo scambio di dati dell’application
layer.
Questo è
quindi il Secure Socket Layer ( per ulteriori approfondimenti si veda lo
standard direttamente ); il Transport Layer Security è grosso modo
il SSL, ma con delle piccole eccezioni che riguardano per lo più
la tipologia di algoritmi supportati: ad esempio il TLS non supporta il
Fortezza come scambio chiave, e il calcolo degli schemi di MAC.
Un'analisi
del SSL è stata fatta da Bruce Schneier, uno dei maggiori esperti
di crittografia, evidenziando come il Record Protocol sia estremamente
sicuro, e l'Handshake Protocol potrebbe esserlo in dipendenza dall'implementazione
utilizzata.
La prossima
volta, si affronterà quest'argomento dal punto di vista Java. Si
commenterà una possibile implementazione della classe SSLSocket,
quella che potrebbe fornire la sicurezza alle applicazioni, e inoltre si
spiegherà come ottenerla nel protocollo HTTP col Java Plug-in.
Bibliografia
Per la sicurezza
in ambiente TCP/IP:
-
William Stalling
“Cryptography and Network Security” Prentice Hall ed.
-
Richard E. Smith
“Internet Cryptography” Addison Wesley ed.
-
Andrew S. Tanenbaum
“Reti di Computer” Prentice Hall ed.
Per la crittografia
in genere:
-
Bruce Schneier “Applied
Cryptography”second edition J.Wiley &Sons ed., un ottimo libro
-
www.counterpane.com
il sito di B. Schneier dove si trova di tutto per la crittografia.
Le specifiche sul
SSL possono essere trovate in:
http://home.netscape.com/eng/ssl3/
SSL3 specification
I dettagli sul TLS
lo standard del SSL sono dispoonibili in:
http://www.ietf.org/html.charters/tls-charter.html
Altri link sul SSL
possono essere trovati in:
http://www.counterpane.com/hotlist.html
ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/
SSLeay un'implementazione in C del protocollo
http://directory.netscape.com/Computers/Security/Internet/SSL-TLS
dove trovare oltre agli standard anche numerose implementazioni in Java
|