Thomas Walpuski ha effettuato il porting per Linux del demone IKE di OpenBSD (http://bender.thinknerd.de/~thomas/IPsec/isakmpd-linux.html). L'isakmpd può ora venir utilizzato con Linux 2.5.47+ e 2.6.x. Questo capitolo descrive l'installazione e la configurazione di isakmpd.
Se si utilizzano distribuzioni basate su RPM o Debian l'installazione può avvenire attraverso gli appositi strumenti per gestire i pacchetti. L'autore di questo documento ha compilato un pacchetto RPM di isakmpd per il kernel 2.6.0 (http://www.spenneberg.org/VPN/Kernel-2_6_IPsec). Si tenga presente che il pacchetto potrebbe non funzionare con altre versioni, poichè l'ABI nel kernel ha subito diverse modifiche. Il progetto Debian possiede un pacchetto installabile con apt-get install isakmpd.
Quando si installa dai sorgenti è necessario procurarsi il pacchetto keynode (http://www1.cs.columbia.edu/~angelos/keynote.html) se si intende utilizzare certificati X.509. Inoltre e' necessario un kernel 2.5.47+ o 2.6.x.
Per ottenere i sorgenti si seguano le indicazioni presenti nell'home page di Thomas Walpuski. Quindi si editi il GNUmakefile attivando la linea OS=linux. Se i sorgenti del kernel non si trovano in /usr/src/linux è necessario inoltre modificare il file sysdep/linux/GNUmakefile.sysdep indicando il percorso corretto.
La compilazione avviene con il comando make.
Isakmpd è accompagnato da due comandi: keyconf e certpatch. Questi strumenti si trovano nella subdirectory apps e dovranno essere compilati a mano (Sono parte del mio pacchetto RPM). Certpatch è in grado di aggiungere un SubjectAltName ad un certificato già esistente, keyconv converte chiavi DNSSEC in formato openssl e vice-versa.
Sono riuscito a compilare con successo i due programmi in questo modo (i vostri parametri potrebbero essere diversi):
gcc -DMP_FLAVOUR=MP_FLAVOUR_GMP -I../.. -I../../sysdep/linux -I /usr/src/linux-2.6.0 -lcrypto -lgmp certpatch.c -o certpatch gcc -I../.. -I../../sysdep/linux -I /usr/src/linux-2.6.0 -lcrypto -lgmp base64.c keyconv.c -o keyconv |
Un ultimo avvertimento: tutte le manpages sono in formato Latin1. Red Hat 9 non visualizza questo formato. È necessario convertirle per poterle leggere (nel pacchetto RPM lo sono già): iconv --from-code LATIN1 --to-code UTF-8 --output isakmpd2.8 isakmpd.8
Una volta compilato, si creino le seguenti directory:
mkdir /etc/isakmpd mkdir /etc/isakmpd/ca mkdir /etc/isakmpd/certs mkdir /etc/isakmpd/keynote mkdir /etc/isakmpd/crls mkdir /etc/isakmpd/private mkdir /etc/isakmpd/pubkeys |
Isakmpd utilizza un file di configurazione e un file per le policy. Rispettivamente /etc/isakmpd/isakmpd.conf e /etc/isakmpd/isakmpd.policy. Il primo utilizza il ben noto formato in stile .INI. Ciascuna sezione inizia con una linea del tipo:
[section] |
All'interno di una sezione è possibile assegnare un valore ad un tag:
tag=valore |
Se l'assegnamento è più lungo di una riga è necessario terminare la riga con un Backslash per riprendere sulla successiva. I commenti possono essere ovunque e sono introdotti dal simbolo #.
Per iniziare ci concentreremo su di una configurazione semplice che utilizza dei preshared secret per l'autenticazione. Si consulti anche Figure 5 per maggiori informazioni sul setup.
[General] Listen-on= 192.168.1.100 [Phase 1] 192.168.2.100= ISAKMP-peer-west [Phase 2] Connections= IPsec-east-west [ISAKMP-peer-west] Phase= 1 Local-address= 192.168.1.100 Address= 192.168.2.100 Authentication= ThisIsThePassphrase [IPsec-east-west] Phase= 2 ISAKMP-peer= ISAKMP-peer-west Configuration= Default-quick-mode Local-ID= Net-east Remote-ID= Net-west [Net-west] ID-type= IPV4_ADDR_SUBNET Network= 172.16.2.0 Netmask= 255.255.255.0 [Net-east] ID-type= IPV4_ADDR_SUBNET Network= 172.16.1.0 Netmask= 255.255.255.0 [Default-quick-mode] DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-3DES-MD5-PFS-SUITE |
Questo file di configurazione descrive un tunnel tra i due gateways 192.168.1.100 e 192.168.2.100 e si riferisce al primo di questi. Il tunnel viene utilizzato dalle due sottoreti 172.16.1.0/24 e 172.16.2.0/24.
Esaminiamo ora ciascuna sezione. La prima, [General], contiene il setup generale. Qui viene specificato se isakmpd debba stare in ascolto su un determinato IP, opzione importante nel caso in cui sul gateway VPN siano in uso diversi indirizzi IP.
La sezione [Phase 1] illustra quale configurazione utilizzare per instaurare una connessione con l'IP 192.168.2.100. Se il client è un roadwarrior è necessario utilizzare default, al posto dell'IP.
La sezione [Phase 2] descrive i tunnels da realizzare dopo che la Phase 1 di autenticazione ha avuto luogo. Se isakmpd non deve iniziare la connessione, ma attendere passiva, si utilizzi l'opzione Passive-connections.
A questo punto è necessario definire i nomi utilizzati come riferimenti per la Phase 1 e la Phase 2. Incominciamo da ISAKMP-peer-west: viene utilizzata nella Phase 1, sono noti Local-address ed il remote Address. Se quest'ultimo è sconosciuto è sufficiente rimuovere il tag. Authentication nel nostro caso contiene una preshared key, che inseriamo direttamente come testo in chiaro.
Proseguiamo con il tunnel IPsec-east-west: viene utilizzato in Phase 2 e deve essere attivato dall'opzione ISAKMP-peer ISAKMP-peer-west. In questa sezione definiamo il tipo di configurazione per la connessione con Configuration, e gli ID addizionali per i tunnels (Local-ID e Remote-ID).
Poichè questi ID sono ancora riferimenti, dobbiamo definirli. ID-type può assumere i seguenti valori: IPV4_ADDR, IPV6_ADDR, IPV4_ADDR_SUBNET e IPV6_ADDR_SUBNET.
Ultimo ma non meno importante, dobbiamo definire la configurazione quick-mode , alla quale facciamo riferimento nella descrizione del tunnel. Sono necessarie le opzioni: DOI (default: IPSEC), EXCHANGE_TYPE (default: QUICK_MODE) e Suites.Quest'ultima nel nostro caso assume il valore, QuickMode-Encapsulated-Security-Payload-3DES-Encryption-MD5-HMAC-Perfect-Forward-Secrecy. È possibile specificare valori diversi separati da virgole. Si consulti la man-page per un elenco.
isakmpd.policy è molto più stringato. Qui di seguito un esempio:
KeyNote-Version: 2 Authorizer: "POLICY" Licensees: "passphrase:ThisIsThePassphrase" Conditions: app_domain == "IPsec policy" && esp_present == "yes" && esp_enc_alg == "3des" && esp_auth_alg == "hmac-md5" -> "true"; |
Per provare la connessione si avvii isakmpd:
isakmpd -d -4 -DA=90 |
isakmpd partirà in foreground (-d) utilizzzando ipv4 (-4) e un debuglevel pari a 90.
Una volta instaurata la connessione sarà possibile effettuare dei ping da una subnet all'altra. Se sono stati installati gli ipsec-tools utilizzando il comando setkey si potranno visualizzare le policy e le security association aggiunte da isakmpd. Se si usa ctrl-c per fermare isakmpd, non verranno cancellati anche i due database, SAD e SPD. Sarà necessario provvedere manualmente ad essa. Se si utilizza invece kill -TERM saranno svuotati entrambi.
L'isakmpd può utilizzare certificati X.509 per il processo di autenticazione. È possibile creare i certificati utilizzando i normali strumenti a disposizione ed è necessario che per ogni macchina partecipante alla VPN, esistano i seguenti file:
/etc/isakmpd/private/local.key La chiave privata della macchina in .pem format. Con permessi 600.
/etc/isakmpd/ca/ca.crt Il certificato della certification authority.
/etc/isakmpd/certs/ip-address.crt Il certificato della macchina locale.
Perchè isakmpd possa trovare ed utilizzare un certificato quest'ultimo deve possedere un SubjectAltName. Questa estensione del X.509v3 può essere definita durante la generazione del certificato o aggiunta in seguito utilizzando il comando certpatch. Quest'ultimo ha bisogno della chiave privata della CA: estrae il certificato, aggiunge l'estensione e lo rifirma.
certpatch -i ip-address -k ca.key originalcert.crt newcert.crt |
Certpatch può aggiungere un indirizzo IP, un FQDN o un UFQDN al certificato.
Quando questi file sono stati creati e riposti nelle directory appropriate con i giusti permessi è possibile procedere con la creazione del file di configurazione e delle policy. Nel primo è necessario rimuovere l'opzione Authentication ed aggiungere la linea ID=East nella sezione ISAKMP-peer-west. Quindi bisogna definire East. Inoltre è necessario specificare i percorsi per raggiungere i certificati e quanto in relazione con essi. Un file di configurazione completo:
[General] Listen-on= 192.168.1.100 [Phase 1] 192.168.2.100= ISAKMP-peer-west [Phase 2] Connections= IPsec-east-west [ISAKMP-peer-west] Phase= 1 Local-address= 192.168.1.100 Address= 192.168.2.100 ID= East [East] ID-type= IPV4_ADDR Address= 192.168.1.100 [IPsec-east-west] Phase= 2 ISAKMP-peer= ISAKMP-peer-west Configuration= Default-quick-mode Local-ID= Net-east Remote-ID= Net-west [Net-west] ID-type= IPV4_ADDR_SUBNET Network= 172.16.1.0 Netmask= 255.255.255.0 [Net-east] ID-type= IPV4_ADDR_SUBNET Network= 172.16..2.0 Netmask= 255.255.255.0 [Default-quick-mode] DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-AES-SHA-PFS-SUITE [X509-certificates] CA-directory= /etc/isakmpd/ca/ Cert-directory= /etc/isakmpd/certs/ Private-key= /etc/isakmpd/private/local.key |
Anche il file contenente la policy deve essere modificato. Dal momento che intendiamo accettare soltanto host muniti di certificato firmato dalla CA di cui ci fidiamo, aggiungiamo alcune righe dopo l'opzione Authorizer. Un file di policy completo:
KeyNote-Version: 2 Authorizer: "POLICY" Licensees: "DN:/C=DE/ST=NRW/L=Steinfurt/O=Spenneberg.Com/OU=VPN/CN=RootCA" Conditions: app_domain == "IPsec policy" && esp_present == "yes" && esp_enc_alg == "3des" && esp_auth_alg == "hmac-md5" -> "true"; |
Il testo che segue l'opzione DN: deve coincidere con il subject del certificato della CA:
openssl x509 -in ca/ca.crt -noout -subject |
Ora è possibile avviare isakmpd come al solito e provare la connessione.