Si illustrerà prima una connessione manuale in transport mode. Probabilmente è il modo più facile per iniziare poichè è la connessione più semplice da realizzare. Poniamo che vi siano due macchine con indirizzi IP 192.168.1.100 e 192.168.2.100 che comunicano attraverso IPsec.
Tutti i parametri contenuti nel SAD e nel SPD possono essere modificati attravreso il comando setkey. Esiste una man page piuttosto esaustiva su questo comando. Dunque solo le opzioni necessarie per realizzare una connessione in transport mode sono mostrate qui di seguito. setkey legge i propri parametri da un file quando invocato con l'opzione -f setkey -f /etc/ipsec.conf. Un modello di /etc/ipsec.conf piuttosto realistico:
#!/usr/sbin/setkey -f
# Configurazione per 192.168.1.100
# Svuoto il SAD e SPD
flush;
spdflush;
# Attenzione: utilizzate queste chiavi solo per i test!
# Generate delle chiavi vostre!
# Le AH SA utilizzano chiavi di 128 bit
add 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md5 \
0xc0291ff014dccdd03874d9e8e4cdf3e6;
add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md5 \
0x96358c90783bbfa3d7b196ceabe0536b;
# Le ESP SA utilizzano chiavi di 192 bit (168 + 24 parity)
add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc \
0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;
add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc \
0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;
# Security policy
spdadd 192.168.1.100 192.168.2.100 any -P out ipsec
esp/transport//require
ah/transport//require;
spdadd 192.168.2.100 192.168.1.100 any -P in ipsec
esp/transport//require
ah/transport//require;
|
Saranno necessarie delle chiavi per rimpiazzare quelle dello script di esempio in caso si desideri utilizzare una connessione manuale in transport mode in un ambiente di produzione. Per generare le proprie chiavi è possibile utilizzare il seguente metodo:
$ # chiavi a 128 Bit
$ dd if=/dev/random count=16 bs=1| xxd -ps
16+0 Records ein
16+0 Records aus
cd0456eff95c5529ea9e918043e19cbe
$ # chiavi a 192 Bit
$ dd if=/dev/random count=24 bs=1| xxd -ps
24+0 Records ein
24+0 Records aus
9d6c4a8275ab12fbfdcaf01f0ba9dcfb5f424c878e97f888
|
Utilizzate sempre il device /dev/random quando generate delle chiavi poichè garantisce un buon grado di casualità.
Per prima cosa lo script effettua il flush del security association database (SAD) e del security policy database (SPD). Quindi crea le AH SA e le ESP SA. Il comando add aggiunge una security association al SAD e richiede un IP sorgente ed uno di destinazione, il protocollo IPsec (ah), l'SPI (0x200) e l'algortimo. L'algoritmo di autenticazione viene specificato con l'opzione -A (la cifratura utilizza -E, la compressione -C; la compressione di IP non è ancora supportata però). Dopo l'algoritmo deve essere inserita la chiave. Quest'ultima deve essere formattata in double-quoted “ASCII” o in esadecimale con prefisso 0x.
Linux supporta i seguenti algoritmi per AH ed ESP: hmac-md5 and hmac-sha, des-cbc and 3des-cbc. Tra poco sarà possibile anche utilizzare: simple (senza cifratura), blowfish-cbc, aes-cbc, hmac-sha2-256 and hmac-sha2-512.
spdadd aggiunge una security policy ad un SPD. Con queste è possibile specificare quali protocolli vadano protetti con IPsec e quali chiavi utilizzare. Il comando richiede l'indirizzo IP sorgente e destinazione del pacchetto da proteggere, il protocollo (la porta, nel nostro esempio any) e la policy da utilizzare (-P). La policy indica la direzione (in/out), l'azione da intraprendere (ipsec/discard/none), il protocollo (ah/esp/ipcomp), la modalità (transport) ed il livello (use/require).
Un file di configurazione simile va creato su entrambe le parti interessate alla comunicazione IPsec. Il nostro esempio funziona senza alcun cambiamento su 192.168.1.100, ma sono necessarie alcune modifiche per 192.168.2.100, per riflettere la diversa direzione dei pacchetti. La maniera più semplice per adattare la configurazione è scambiare le direzioni nelle security policy: sostituire -P in con -P out e vice versa. Qui di seguito un esempio:
#!/usr/sbin/setkey -f
# Configurazione per 192.168.2.100
# Flush SAD e SPD
flush;
spdflush;
# Attenzione: utilizzate queste chiavi solo per i test!
# Generate delle chiavi vostre!
# Le AH SA utilizzano chiavi di 128 bit
add 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md5 \
0xc0291ff014dccdd03874d9e8e4cdf3e6;
add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md5 \
0x96358c90783bbfa3d7b196ceabe0536b;
# Le ESP SA utilizzano chiavi di 192 bit (168 + 24 parity)
add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc \
0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;
add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc \
0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;
# Security policy
spdadd 192.168.1.100 192.168.2.100 any -P in ipsec
esp/transport//require
ah/transport//require;
spdadd 192.168.2.100 192.168.1.100 any -P out ipsec
esp/transport//require
ah/transport//require;
|
Quando il file di configurazione è correttamente posizionato per entrambe le parti, è possibile renderlo operativo con il comando setkey -f /etc/ipsec.conf. Il corretto caricamento può essere verificato visualizzando il contenuto dei due database, SAD ed SPD:
Il setup attuale ricalca lo scenario in Figure 4.
Se si effettua un ping da una macchina all'altra il traffico viene cifrato e tcpdump mostra il seguente risultato:
12:45:39.373005 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x1):
ESP(spi=0x00000201,seq=0x1) (DF)
12:45:39.448636 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x1):
ESP(spi=0x00000301,seq=0x1)
12:45:40.542430 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x2):
ESP(spi=0x00000201,seq=0x2) (DF)
12:45:40.569414 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x2):
ESP(spi=0x00000301,seq=0x2)
|