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 |
[section] |
All'interno di una sezione è possibile assegnare un valore ad un tag:
tag=valore |
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.
/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.
certpatch -i ip-address -k ca.key originalcert.crt newcert.crt |
Certpatch può aggiungere un indirizzo IP, un FQDN o un UFQDN al certificato.
[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 |
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.