Núcleo Linux 2.5/2.6 empleando isakmpd de OpenBSD

Thomas Walpuski ha portado el servidor IKE del sistema operativo OpenBSED a Linux (http://bender.thinknerd.de/~thomas/IPsec/isakmpd-linux.html). isakmpd puede ahora emplearse con el núcleo Linux 2.5.47+ y 2.6.x para establecer VPNs con IPsec. Este capítulo describe la instalación y configuración de isakmpd.

Instalación

Si emplea una distribución basada en RPM o Debian, la instalación puede realizarse empleando los paquetes correspondientes. El autor de este documento ha realizado un paquete RPM de isakmpd para el núcleo Linux 2.6.0 (http://www.spenneberg.org/VPN/Kernel-2_6_IPsec). Este paquete puede no funcionar en las versiones anteriores del núcleo, ya que la interfaz binaria de aplicación (ABI) del núcleo ha cambiado varias veces. El proyecto Debian incluye un paquete que puede instalarse empleando apt-get install isakmpd.

Al instalar desde código fuente necesitará el paquete keynote (http://www1.cs.columbia.edu/~angelos/keynote.html) si desea emplear certificados X.509. Además, necesitará un núcleo Linux 2.5.47+ o 2.6.x.

Para conseguir el código fuente de isakmpd siga los pasos mencionados en la página web de Thomas Walpuski. Tras ello, edite el GNUmakefile de manera adecuada y active la línea OS=linux. Si no almacena el núcleo Linux en /usr/src/linux, necesitará modificar además el fichero sysdep/linux/GNUmakefile.sysdep.

La compilación puede realizarse empleando el mandato make.

isakmpd viene con dos mandatos adicionales: keyconv y certpatch. Estas herramientas están en el directorio apps y pueden compilarse a mano (son parte de mi paquete RPM). Certpatch puede añadir un SubjectAltName a un certificado existente, mientras que keyconv convierte de DNSSEC a openssl y viceversa.

Yo logré compilar estas herramientas mediante (su experiencia puede variar):

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 último apunte: Todas las páginas de manual están en formato Latin1. Red Hat 9 no puede mostrar estas páginas de manual. Deberá convertirlas para poder leerlas (hecho en el paquete RPM): iconv --from-code LATIN1 --to-code UTF-8 --output isakmpd2.8 isakmpd.8

Una vez que isakmpd se haya compilado, deberá generar la siguiente estructura de directorios obligatoria:

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
      

Uso de claves precompartidas (PSK)

Isakmpd emplea un fichero de configuración y un fichero de políticas. Estos son /etc/isakmpd/isakmpd.conf y /etc/isakmpd/isakmpd.policy. La configuración emplea el conocido formato .INI. Cada sección comienza con una línea del modo:

[seccion]
      

Y dentro de cada sección puede asignar un valor a una etiqueta:

etiqueta=valor

Si el valor es mayor que una línea puede emplear la técnica de la barra inversa para emplear varias líneas. Los comentarios pueden ponerse en cualquier lugar empleando el símbolo de sostenido #.

Para comenzar examinaremos una configuración simple que emplea un secreto precompartido para realizar la autenticación. Eche un vistazo a Figure 5 in the Section called Modo túnel para la configuración.

[General]
Listen-on=              192.168.1.100
                                                                                
[Phase 1]
192.168.2.100=                ISAKMP-par-oeste
                                                                                
[Phase 2]
Connections=            IPsec-este-oeste
                                                                                
[ISAKMP-par-oeste]
Phase=                  1
Local-address=          192.168.1.100
Address=                192.168.2.100
Authentication=         EstaEsLaContraseña
                                                                                
[IPsec-este-oeste]
Phase=                  2
ISAKMP-peer=            ISAKMP-par-oeste
Configuration=          Modo-rapido-predeterminado
Local-ID=               Red-este
Remote-ID=              Red-oeste
                                                                                
[Red-oeste]
ID-type=                IPV4_ADDR_SUBNET
Network=                172.16.2.0
Netmask=                255.255.255.0
                                                                                
[Red-este]
ID-type=                IPV4_ADDR_SUBNET
Network=                172.16.1.0
Netmask=                255.255.255.0

[Modo-rapido-predeterminado]
DOI=                    IPSEC
EXCHANGE_TYPE=          QUICK_MODE
Suites=                 QM-ESP-3DES-MD5-PFS-SUITE
                                       
      

Este fichero de configuración describe un túnel entre las dos pasarelas 192.168.1.100 y 192.168.2.100. Este túnel puede ser usado por 172.16.1.0/24 y 172.16.2.0/24. Este fichero de configuración es el de la pasarela 192.168.1.100.

Veamos las secciones de una en una. La primera sección [General] describe la configuración general, indicando si isakmpd debería asociarse a direcciones IP específicas durante el arranque. Se recomienda si tiene varias direcciones IP en su gateway VPN.

La sección [Phase 1] describe qué configuración debe usarse para el par 192.168.2.100. Si la dirección IP del par no es conocida (roadwarrior) puede emplear default en su lugar.

La sección [Phase 2] describe los túneles a crear una vez que la autenticación de primera fase se establece. Si fuera posible que isakmpd no iniciara las conexiones, puede emplear Passive-connections en su lugar.

Ahora debe definir los nombers a los que se refiere en las secciones Phase 1 y Phase 2. Primero definimos ISAKMP-par-oeste. Esta definición se emplea en Phase 1 y sabemos la dirección local (Local-address) y la dirección remota (Address). Si no conociéramos la dirección remota, elimine esta última etiqueta. Authentication indica que la autenticación deberá realizarse a través de una contraseña precompartida dada en texto en claro.

Después se define el túnel IPsec-este-oeste. Se usa en la Phase 2 y se establecerá con el par ISAKMP (ISAKMP-peer ISAKMP-par-oeste. Deseamos definir la configuración (Configuration) de la conexión y los IDs adicionales para el túnel (Local-ID y Remote-ID.

Al no estar definidos estos IDs, deberemos hacerlo. El tipo de identificador (ID-type) puede ser IPV4_ADDR, IPV6_ADDR, IPV4_ADDR_SUBNET y IPV6_ADDR_SUBNET.

Finalmente debemos definir la configuración del modo rápido, al que nos referimos en la descripción del túnel. Definimos el DOI (de manera predeterminada: IPSEC), el tipo de intercambio (EXCHANGE_TYPE) (de manera predeterminada: QUICK_MODE) y las Suites (protocolos y estándares que se emplearán). El modo del ejemplo (QM-ESP-3DES-MD5-PFS-SUITE) es el QuickMode-Encapsulated-Security-Payload-3DES-Encryption-MD5-HMAC-Perfect-Forward-Secrecy. Puede especificar varias suites separadas por comas. Consulte la página de manual para obtener un listado de todos las suites y transformaciones posibles.

El fichero isakmpd.policy es mucho más corto. El siguiente listado muestra un ejemplo:

KeyNote-Version: 2
Authorizer: "POLICY"
Licensees: "passphrase:EstaEsLaContraseña"
Conditions: app_domain == "IPsec policy" &&
            esp_present == "yes" &&
            esp_enc_alg == "3des" &&
            esp_auth_alg == "hmac-md5" -> "true";
      

Para probar la conexión, inicie isakmpd empleando la siguiente línea:

isakmpd -d -4 -DA=90

Esto iniciará isakmpd en primer plano (-d) empleando IPv4 (-4) y un nivel de depuración de 90.

Una vez que la conexión se haya iniciado se podrá realizar un ping de una subred a la otra. Si también ha instalado las ipsec-tools podrá emplear el mandato setkey para ver las políticas y asociaciones de seguridad añadidas por isakmpd. Si detiene el isakmpd en ejecución con ctrl-c, no vaciará las SAD y SPD. Deberá hacer esto manualmente con el mandato setkey. Si detiene isakmpd empleando kill -TERM vaciará las SAD y SPD.

Empleando certificados X.509

isakmpd también puede emplear certificados X.509 para el proceso de autenticación. Puede crear sus certificados empleando las herramientas habituales. Necesitará para cada máquina que vaya a formar parte de la VPN los siguientes ficheros:

Para que isakmpd encuentre y utilice el certificado, éste debe incluir un SubjectAltName. Esta extensión X.509v3 puede definirse durante la generación del certificado o con posterioridad empleando la orden certpatch. Esta orden necesita la clave privada de la CA, extrae el certificado, añade la extensión, y vuelve a firmar el certificado.

certpatch -i ip-address -k ca.key  originalcert.crt newcert.crt
      

Certpatch puede añadir una dirección IP, un FQDN o un UFQDN al certificado.

Una vez que estos ficheros se almacenen en las carpetas adecuadas y tengan asignados los permisos adecuados, puede crear el fichero de configuración y el fichero de políticas. En el fichero de configuración deberá eliminar la línea Authentication y añadir una línea ID=Este a la sección ISAKMP-par-oeste. Después deberá definir Este. Además, deberá especificar los directorios X.509. A continuación se muestra el fichero de configuración completo:

[General]
Listen-on=              192.168.1.100
                                                                                
[Phase 1]
192.168.2.100=                ISAKMP-par-oeste
                                                                                
[Phase 2]
Connections=            IPsec-este-oeste
                                                                                
[ISAKMP-par-oeste]
Phase=                  1
Local-address=          192.168.1.100
Address=                192.168.2.100
ID=                     Este
                                                                                
[Este]
ID-type=                IPV4_ADDR
Address=                192.168.1.100
                                                                                
[IPsec-este-oeste]
Phase=                  2
ISAKMP-peer=            ISAKMP-par-oeste
Configuration=          Modo-rapido-predeterminado
Local-ID=               Red-este
Remote-ID=              Red-oeste
                                                                                
[Red-oeste]
ID-type=                IPV4_ADDR_SUBNET
Network=                172.16.1.0
Netmask=                255.255.255.0
                                                                                
[Red-este]
ID-type=                IPV4_ADDR_SUBNET
Network=                172.16..2.0
Netmask=                255.255.255.0
                                                                                                               
[Modo-rapido-predeterminado]
DOI=                    IPSEC
EXCHANGE_TYPE=          QUICK_MODE
Suites=                 QM-ESP-3DES-MD5-PFS-SUITE                                                                                
[X509-certificates]
CA-directory=           /etc/isakmpd/ca/
Cert-directory=         /etc/isakmpd/certs/
Private-key=            /etc/isakmpd/private/local.key
      

El fichero de políticas también necesita modificarse. Como sólo se desea permitir la conexión de pares que utilicen certificados firmados por la autoridad de certificación en que se confía, debe añadir una la línea tras la línea Authorizer. A continuación se muestra el fichero 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";
      

El texto que sigue a DN: debe coincidir con la línea subject del certificado de la CA:

openssl x509 -in ca/ca.crt -noout -subject
      

Ahora puede iniciar isakmpd de la manera normal para probar la configuración.

Uso de FreeS/WAN en el núcleo Linux 2.6

Por hacer (la semana que viene ;-)