Linux Kernel 2.5/2.6 utilizzando isakmpd di OpenBSD

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.

Installazione

Se si utilizzano distribuzioni basate su RPM o Debian l'installazione può avvenire attraverso gli appositi tools 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 tools 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
      

Utilizzare preshared keys (PSK)

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 in the Section called Tunnel Mode 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 policies 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.

Utilizzare certificati X.509

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 files:

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 files 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.