Piedone - Copertina - Costruire RPM |
Articoli
Come descritto dal draft-ietf-ipsec-arch, lo scopo dell'architettura IPSEC è quello di fornire sicurezza di tipo crittografico all'IP layer, sia per IPv4 sia per IPv6.
L'insieme di servizi forniti riguarda, tra gli altri: controllo d'accesso, integrità, autenticazione, confidenzialità.
Due protocolli concorrono al raggiungimento di questi obiettivi. L'Authentication Header (AH) e l'Encapsulating Security Payload (ESP).
Il vantaggio di tecnologie di questo tipo è la totale trasparenza dal punto di vista dell'utente e la compatibilità con altri host che non adottino questi meccanismi di protezione del traffico di rete.
Sistemi operativi BSD-derived come OpenBSD già offrono un'implementazione IPSEC integrata nel kernel, a partire dalle versioni più recenti.
Per quanto riguarda Linux si stanno affacciando le prime soluzioni sotto licenza GNU GPL, seppur ancora a livello alpha, che aggiungono il supporto IPSEC alla versione stabile del kernel 2.0.33.
Nei prossimi paragrafi verranno esaminate differenze e modalità di installazione di due diverse implementazioni, Klips (conosciuta anche come Freeswan) e ipnsec.
Per i test sono state utilizzate le seguenti versioni:
freeswan
: snapshot del 3 Maggio 1998,
ipnsec
: del 28 Aprile 1998.
L'ambiente di prova è costituito da due macchine Linux collegate in rete ethernet.
Per fare in modo che due sistemi IPSEC arrivino a scambiarsi dinamicamente le Security Associations (SA) e le chiavi crittografiche necessarie a stabilire una connessione sicura è necessario un protocollo di Session Key Management.
Freeswan adotta il protocollo ISAKMP, mentre ipnsec preferisce Photuris.
Nelle versioni testate nessuno dei daemon di keymanagement supporta entrambe i protocolli.
Klips e ipnsec si installano come moduli del kernel.
Le user-level utility e il daemon ISAKMP/Oakley (Pluto) compilano senza dare errori.
Anche il patching del kernel si riduce alla modifica del
Config.in
sotto net/
e alla copia della directory
ipsec/
con i sorgenti e gli include necessari alla compilazione
del modulo ipsec.o
.
In fase di compilazione emergono alcuni problemi legati alle opzioni di debug. Risolti questi il modulo viene compilato.
Effettuato il reboot ed inserito il modulo nel kernel, bisogna ora configurare l'interfaccia ipsec0, mediante semplici comandi.
host1:~# tncfg attach ipsec0 eth0 host1:~# ifconfig ipsec0 10.100.100.1 netmask 255.255.255.0 host1:~# route del 10.100.100.0 host1:~# route add -net 10.100.100.0 netmask 255.255.255.0 dev ipsec0
Analogamente su host2:
host2:~# tncfg attach ipsec0 eth0 host2:~# ifconfig ipsec0 10.100.100.2 netmask 255.255.255.0 host2:~# route del 10.100.100.0 host2:~# route add -net 10.100.100.0 netmask 255.255.255.0 dev ipsec0Dopo aver opportunamente modificato il file
isakmp-secrets
da installare
sotto /etc
, su entrambe gli host si lancia il daemon Pluto.
Alcune distribuzioni di Linux non hanno il device urandom
e Pluto, non
potendo operare un test in fase di avviamento, segnala l'errore via syslog
daemon.
mknod /dev/urandom c 1 9per ovviare al problema.
Dopo aver sistemato interfacce e route table, bisogna convincere i due Pluto ad avviare lo scambio delle SA. Ciò viene fatto mediante l'utility whack.
host:~# whack 501 10.100.100.2 500 10.100.100.1 255.255.255.255 10.100.100.2 255.255.255.255 encrypt
A questo punto, tutto è pronto per la prima connessione in transport mode bidirezionale.
Ciò significa flusso nei due sensi di pacchetti autenticati e crittati.
Ad esempio, un ping da host1 a host2 genera un'ICMP echo request che
prima di essere passata all'eth0 a cui ipsec
è agganciato, viene crittata
in DES e autenticata in MD5. Su host2 l'ICMP echo reply viene
a sua volta crittata e autenticata prima di essere trasferita all'eth0.
È possibile anche effettuare un setup in transport mode unidirezionale. In questo caso i pacchetti di ritorno viaggiano in chiaro.
In un'altra finestra potrete verificare con un network monitor tipo
Iptraf
o
tcpdump
l'effettivo scambio di pacchetti incapsulati.
È sempre possibile controllare IPSEC route e SPI (Security Parameter Index):
cat /proc/net/ipsec-eroute cat /proc/net/ipsec-spi
Supponiamo ora di avere tre segmenti di LAN: lan1
,
lan2
e lan3
.
lan1
comunica con lan3
attraverso lan2
, sulla quale sono presenti i due
gateway per lan1
e lan3
. È
ipotizzabile un tunnel IPIP tra i due gateway
lan1-lan2
lan2-lan3
.
lan2 ---------+------------------+------------------------ | | HOST1 GATEWAY_1-2 | | | GATEWAY_2-3 HOST3 lan1 --+-------------+------ | | ---------+--------------+---- lan3
In questo caso un ping da host su lan1
ad un host
su lan3
genera l'ICMP echo request che raggiunge il
gateway su lan2
, viene incapsulato in IPIP, crittato
in DES, autenticato in MD5, immesso nel tunnel con il secondo gateway,
estratto, decrittato ed inviato all'host di destinazione sul segmento
lan3
.
ipnsec-0.84
Petr Novak, autore di ipnsec
, segue da vicino il lavoro
fatto dal progetto Freeswan ma se ne discosta, come vedremo, per ciò che
concerne alcune scelte progettuali.
Nella versione precedente (0.82) si annunciava la piena interoperabilità con OpenBSD. Le sostanziali modifiche introdotte con la 0.84 hanno per il momento reso incompatibili le due implementazioni del protocollo di gestione delle chiavi (Photuris).
ipnsec
presenta un'interfaccia con lo stack TCP/IP
completamente diversa.
Non vi è più la necessità di configurare con
tncfg
le interfacce ipsec*
. In fase di
caricamento, il modulo ipnsec.o
aggancia automaticamente tutte
le interfacce IP.
Effettuata questa operazione su entrambe le macchine si tratta ora di
configurare nel kernel le SA, operazione fattibile mediante l'utility
ipsecadm
, che può essere utilizzata per specificare le modalità
di crittazione e autenticazione.
Ad esempio su host1, con uno script:
# SP for incoming traffic ipsecadm -enc des -auth md5 -src 10.100.100.2 -dst 10.100.100.1 -spi 1234 -key 11223344aabbccdd -authkey 11223344 # SPI for outgoing traffic ipsecadm -enc des -auth md5 -src 10.100.100.1 -dst 10.100.100.2 -spi 1234 -key 11223344aabbccdd -authkey 11223344 # IPSec AH route for all traffic from host1 to host2 rt 10.100.100.1 255.255.255.255 10.100.100.2 255.255.255.255 -1 -1 -1 10.100.100.2 1234 1In teoria il processo potrebbe essere reso automatico grazie al daemon
photurisd
. Tuttavia, nonostante il successo nella compilazione
il daemon non si avvia per un errore critico in una chiamata
setsockopt()
. Provando la versione precedente (0.82), si
riesce, non senza difficoltà soprattutto nella sistemazione dei file di
configurazione, ad avviare lo scambio dinamico delle SA. Ma il daemon non è
stabile e spesso il processo muore senza dare segnali di errore.
Il setup manuale prima illustrato non espone a questi rischi.
IPSEC porta un indubbio vantaggio in termini di sicurezza, trasferendo al network layer i problemi di autenticazione e confidenzialità prima risolti con soluzioni tipicamente ad application layer (ad es. ssh, kerberos, ssl).
Generalmente queste ultime costringono l'utente ad apprendere nuovi comandi, nuove modalità operative etc. Raramente si ha a che fare con sostituzioni drop-in di client e server.
Lo svantaggio principale al momento è rappresentato dalla scarsa compatibilità di queste versioni GNU GPL con altre implementazioni per sistemi operativi diversi. Si tratta comunque di alpha software che dovrebbe in tempi non troppo lunghi avvicinarsi alla piena interoperabilità con altre soluzioni.
di Paolo Rocchi
Piedone - Copertina - Costruire RPM |