[Volver al índice principal] [Sección 12.0 - Para usuarios avanzados] [Sección 14.0 - Uso de discos en OpenBSD]
Partes de este documento proceden de:
IPSec es un grupo de extensiones de la familia del protocolo IP. IPSec provee servicios criptográficos de seguridad. Estos servicios permiten la autenticación, integridad, control de acceso, y confidencialidad. IPSec provee servicios similares a SSL, pero a nivel de redes, de un modo que es completamente transparente para sus aplicaciones y mucho más robusto. Es transparente porque sus aplicaciones no necesitan tener ningún conocimiento de IPSec para poder usarlo. Puede usar cualquier protocolo IP sobre IPSec. Puede crear túneles cifrados (VPNs), o simple cifrado entre computadoras (ordenadores). Debido a que dispone de tantas opciones, IPSec es más bien complejo (¡mucho más que SSL!).
Antes de empezar a usar IPSec, le recomendamos encarecidamente que mire la «lectura recomendada» de la sección 6 de las preguntas frecuentes. En particular, si todavía no lo entiende, el documento Understanding IP Addressing es muy recomendable.
De un modo lógico, IPSec funciona en cualquiera de estos tres modos:
Como puede ver, IPSec se puede usar como túnel de tráfico para conexiones de «Redes Privadas Virtuales» (VPN, "Virtual Private Networks"). Sin embargo, su utilidad va más allá de las VPNs. Con un registro central de «Intercambio de Claves de Internet» (IKE, "Internet Key Exchange"), cada máquina en internet podría comunicarse con otra y usar cifrado y autenticación fuerte.
El protocolo de internet, IP, también conocido como IPv4, no provee por sí mismo de ninguna protección a sus transferencias de datos. Ni siquiera puede garantizar que el remitente sea quien dice ser. IPSec intenta remediarlo. Estos servicios vienen tratados como dos servicios distintos, pero IPSec ofrece soporte para ambos de un modo uniforme.
IPSec provee confidencialidad, integridad, autenticidad, y protección a la réplica a través de dos nuevos protocolos. Estos protocolos se llaman «Cabecera de Autenticación» (AH, "Authentication Header") y «Cargo de Seguridad Encapsulado» (ESP, "Encapsulated Security Payload").
AH provee auntenticación, integridad, y protección a la réplica (pero no confidencialidad). Su principal diferencia con ESP es que AH también asegura partes de la cabecera IP del paquete (como las direcciones de origen o destino).
ESP puede proveer autenticación, integridad, protección a la réplica, y confidencialidad de los datos (asegura todo lo que sigue a la cabecera en el paquete). La protección a la réplica requiere autenticación e integridad (éstas dos van siempre juntas). La confidencialidad (cifrado) se puede usar con o sin autenticación y/o integridad. Del mismo modo, puede usar la autenticación y/o la integridad con o sin la confidencialidad.
La Cabecera de Autenticación (AH) viene de la cabecera básica IP y contiene resúmenes criptográficos ("hash") de los datos e información de identificación. Los resúmenes criptográficos también pueden cubrir las partes invariables de la misma cabecera de IP. Hay varios RFCs diferentes que ofrecen una elección de algoritmos para AH, sin embargo todos deben seguir las líneas especificadas en el RFC2402.
La cabecera del Cargo de Seguridad Encapsulado (ESP) permite reescribir el cargo en modo cifrado. La cabecera ESP no considera los campos de la cabecera IP que van delante, y por lo tanto no garantiza nada excepto el cargo. Los distintos tipos de ESP aplicables deben seguir conformar con el RFC2406. Una cabecera ESP también puede proveer autenticación para el cargo (pero no la cabecera exterior).
Una división ortogonal (en su mayor parte) de funcionalidad de IPSec, se aplica dependiendo de si el extremo que está llevando a cabo la encapsulación IPSec es la fuente original de los datos o una pasarela:
Los enlaces seguros de IPSec se definen en términos de «Asociaciones de Seguridad» (SAs). Cada SA viene definida por un único flujo unidireccional de datos, y por regla general (ignorando multicast) desde un único punto hasta otro, cubriendo el tráfico que se distingue por algún «selector único». Todo el flujo de tráfico sobre un único SA se trata del mismo modo. Algo del tráfico puede estar sujeto a varios SAs, cada uno de los cuales aplica algún tipo de transformación criptográfica. Un grupo de SAs se conoce como un «Haz» ("SA Bundle"). Los paquetes entrantes se pueden asignar a un SA particular por medio de los tres campos de definición:
Un ejemplo de un paquete AH en modo túnel es:
| IPhdr | AH | IPhdr2 | TCPhdr | datos |
Un ejemplo de un paquete AH en modo transporte es:
| IPhdr | AH | TCPhdr | datos |
Debido a que una cabecera ESP no puede autenticar la cabecera IP exterior, es útil combinar una cabecera AH y una ESP para obtener lo siguiente:
| IPhdr | AH | ESP | TCPhdr | datos |
A esto se le llama «Adyacencia de Transporte». La versión del túnel sería algo así:
| IPhdr | AH | ESP | IPhdr2 | TCPhdr | datos |
Sin embargo, no se menciona en el RFC. Como ocurre con la adyacencia de Transporte, esto autenticaría todo el paquete excepto unas cuantas cabeceras de la cabecera IP, y también cifraría la carga (en el ejemplo, en bastardilla). Cuando una cabecera AH y una ESP se aplican juntas directamente como en este caso, el orden de las cabeceras debería ser como el que se ha mostrado. En modo túnel es posible hacer encapsulación recursiva arbitraria para que no se especifique el orden.
La forma en la que se configuran los sistemas IPSec y las pasarelas es, hasta un cierto punto, trabajo del diseñador; sin embargo, el RFC contiene algunas recomendaciones importantes sobre cómo se debería implementar para evitar al máximo la confusión.
Existen dos entidades administrativas que controlan lo que le ocurre a un paquete. Una es la «Base de Datos de Asociación de la Seguridad» (SAD, "Security Association Database", llamado TDB o tabla TDB en el código fuente de IPSec de OpenBSD), y el otro es la «Base de Datos de Política de la Seguridad» (SPD, "Security Policy Database").
Las dos se parecen en que, dado un número de selectores que describan algo de tráfico, entregarán una entrada que describa el proceso necesario. Sin embargo, SPD se elimina a dos pasos del proceso: SPD se usa para paquetes salientes, para decidir qué entradas SAD se deben usar, y qué entradas SAD describen el proceso y sus parámetros. Las entradas SPD especifican las entradas SAD existentes a usar (si es un «haz» puede haber más de una), pero si no hay una que se pueda usar, entonces se usa para crear otras nuevas. Los campos de SA que se crean se pueden tomar de la entrada SPD o del paquete que inició la creación.
Los paquetes salientes van desde la entrada SPD a la especificada de SA, para obtener parámetros de codificación. Los paquetes entrantes obtienen la SA correcta directamente, usando el trío SPI/DestIP/Protocolo, y de ahí van a la entrada SPD.
SPD también puede especificar qué tráfico debería circunvalar IPSec, y cuál se debería dejar caer, así que también debe ser consultado para tráfico no IPSec entrante. Las entradas SPD se deben ordenar de forma explícita, ya que varias podrían coincidir con un paquete particular, y el proceso debe ser reproducible.
Se puede pensar en SPD como algo parecido a un filtro de paquetes, en el que las acciones que se deciden son la activación de procesos SA. Los selectores pueden incluir direcciones de origen y destino, números de puertos si fueran relevantes, nombres de anfitriones, niveles de sensibilidad de seguridad, protocolos, etc...
Una entrada SAD incluye:
Una entrada SPD contiene:
Cada SA puede definir una cabecera ESP y una cabecera AH. Una sesión de IPSec debe tener una de las dos o ambas, pero no se puede definir sin ninguna de las dos (en caso contrario no habría cabeceras para especificar el SPI que deba buscar la SA). El RFC no dice qué sucedería si las cabeceras AH y ESP estuvieran en desacuerdo sobre el valor de SPI. Se puede pensar que esto implicaría múltiples SAs en un haz.
En OpenBSD, SPD se gestiona a través de la orden ipsecadm flow (sólo se cambiaría si estuviera usando el sistema de claves manual). Las entradas de SAD se pueden configurar manualmente con ipsecadm(8), sin embargo el IETF también ha definido mecanismos automáticos para la iniciación de sesiones y otras cosas como el intercambio de claves. OpenBSD implementa Photuris (RFC2522 y RFC2523) e intercambio automático de claves ISAKMP (RFC2407, RFC2408, y RFC2409) en los dæmons photurisd(8) e isakmpd(8).
El sistema de claves manuales es el más sencillo para empezar con IPSec. Con este método puede activar los sistemas criptográficos de cifrado entre redes y crear VPNs. Después de que haya leido esta sección, puede investigar cómo configurarlo de forma automática mediante el uso de /usr/share/ipsec/rc.vpn.
Para empezar debe activar las opciones IP AH e IP ESP en el núcleo del sistema de OpenBSD (si sólo está usando ESP, como con el guión rc.vpn, entonce no necesita activar AH; de hecho, puede haber problemas relacionados con la seguridad activando AH si no lo está usando).
Hay un sysctl para activar estos protocolos:
También tendrá que generar sus claves manuales. Como la seguridad del VPN se basa en que estas claves no se puedan «adivinar», es muy importante escoger las claves usando una fuente aleatoria fuerte. Un método práctico de generarlas es usar el dispositivo random(4). Por ejemplo, para producir 160 bits de aleatoriedad, ponga:
Algoritmo Tamaño de cifrado de la Clave ---------- ----------- DES 56 bits 3DES 168 bits BLF Variable (40-160, 160 bits recommended) CAST Variable (40-128, 128 bits recommended) SKIPJACK 80 bits
Ahora tiene que configurar las SAs («Asociaciones de Seguridad»). Una SA es una combinación de sus direcciones IP, un SPI, y su protocolo de seguridad (AH y/o ESP). Las direcciones IP son la suya y la de su destino. El SPI («Índice del Parámetro de Seguridad») es un número que OpenBSD usa para clasificar distintas SAs.
En estos ejemplos sólo se usa ESP para cifrar su tráfico. ESP incluye la autenticación de los datos cifrados contenidos, pero no autentica la cabecera IP a su alrededor. Esta «autenticación limitada» es, sin embargo, suficiente para la mayoría de casos, especialmente para ESP en un entorno de túneles.
Llevémoslo a la práctica con dos enrutadores, 192.168.5.1 y 192.168.25.9.
En el anfitrión 192.168.5.1:
En el anfitrión 192.168.25.9:
Nótese que los SPI son distintos. Vea la sección Sobre el formato "wire" para una descripción completa sobre qué es el SPI y sobre dónde se está usando.
Ahora que ya tiene sus Asociaciones de Seguridad en su sitio, configure sus flujos.
En 192.168.5.1:
Aquí se crearán dos flujos, uno será la dirección de origen local, que cubrirá todos los paquetes que originen del anfitrión local hacia el destino, y el otro será el flujo de vuelta desde el destino hasta el anfitrión local.
Si no necesita tanta carga en sus VPN Huésped-a-Huésped puede crear el SPI sin -forcetunnel, lo que le permitirá usar el modo de transporte (mientras que -forcetunnel asegura que todo en el paquete IP, incluida la cabecera IP, sea encapsulado por SPI). Si el origen o el destino es una red, tendrá que usar el modo de túnel. Crear una SA hacia o desde una red le asegurará automáticamente que se estén creando los SPI en modo túnel.
Éste es un método simple para empezar a usar IPSec.
Puede usar IPSec para pasar los espacios de direcciones IP privados por túneles en Internet. He aquí un buen ejemplo: Queremos pasar 192.168.99.0/24 (que se encuentra detrás de 208.1.1.1) por túneles a 208.1.2.0/24 y 208.1.5.0/24 (que están detrás de 208.2.2.2). Estos ejemplos se han generado usando el guión rc.vpn.
Como puede ver, cuando está usando el sistema de claves manuales con IPSec tiene que especificar con exactitud lo que quiere hacer. No lo adivinará por usted. Mire estos ejemplos:
Primero configure las asociaciones de seguridad (SA):
(esto configura los SPI, métodos de cifrado, y claves)
Al igual que antes, configuramos las SA...
Si ha usado ipsecadm, y quiere librarse de cualquier trabajo que haya hecho y empezar desde cero, haga
El uso de photuris no está tan extendido y por lo que concierne al estado del RFC, se considera experimental. Sin embargo, muchas personas lo han usado con OpenBSD.
Para configurar photurisd, primero edite /etc/photuris/secrets.conf en cada anfitrión con photurisd.
bsd# cat /etc/photuris/secrets.conf # Palabras claves aceptadas: # identity local "id" "secret" # identity pair local "receivedid" "myid" "secret" # identity remote "id" "secret" # identity lookup ""ag" "username" # Simple identity local "Default" "This should be changed." identity remote "Default" "This should be changed."Cambie "This should be changed." por una clave de su elección en el fichero de configuración local, y otra clave de su elección en el fichero de configuración remota (use la misma configuración en su máquina remota pero cambie el lugar de "local" por el de "remote", y viceversa, para que se vea a sí misma como la clave local). Note que estas claves serán substituidas en una versión futura de photurisd que llevará a cabo su intercambio inicial de claves con claves públicas.
Asegúrese de que net.inet.ah.enable está configurado al valor 1.
bsd# sysctl -w net.inet.ah.enable=1 net.inet.ah.enable: 0 -> 1Y ejecute startkey.
bsd# startkey dst=remote.hostAhora ejecute tcpdump para verificar que sus paquetes estén siendo cifrados con AH (ejecute ping en otra ventana o sesión para generar tráfico).
Si está pensando en VPNs u otras aplicaciones tradicionales de IPSec, probablemente vaya a usar ISAKMP. Algunas implementaciones comerciales de IPSec no proveen ningún tipo de sistema de claves manual, y en su lugar requieren que use algún tipo de ISAKMP.
Fase 1 - Los dos extremos de conexiones ISAKMP establecen un canal seguro, autenticado, sobre el cual se comunican entre dos dæmos. Ésto establece una Asociación de Seguridad (SA) entre ambos anfitriones. Los métodos usados para establecer este canal son el Modo Principal y el Modo Agresivo. El Modo Principal envía la variada información sobre autenticación en una cierta secuencia, al tiempo que provee protección para la identidad. El Modo Agresivo no provee esta protección a la identidad porque toda la información sobre la autenticación se envía al mismo tiempo. El modo agresivo sólo se debería usar en casos en los que preocupe el ancho de banda de la red.
Fase 2 - Las Asociaciones de Seguridad se negocian en nombre de IPSec. La fase 2 establece túneles o SAs términos entre anfitriones IPSec. El Modo Rápido se usa en la fase 2 porque no es necesario repetir una autenticación total debido a que la fase 1 ya ha establecido las SA.
Resumiendo, la fase 1 se usa para obtener un canal seguro en el que llevar a cabo las configuraciones (más rápidas) de la fase 2. Puede haber múltiples configuraciones de la fase 2 en el mismo canal que la fase 1. La fase 2 se usa para configurar los túneles. En la fase 1, sus nodos de IPSec establecen una conexión en la que intercambian autenticación (bien sea un certificado X509 ó un secreto precompartido). Esto permite que cada extremo se asegure de que el otro extremo sea autenticado. La fase 2 es un intercambio de claves que determinan cómo se cifran los datos entre los dos.
OpenBSD viene con los binarios para ISAKMP y para todo IPSec por definición, pero no con los ficheros de muestra. Para obtenerlos necesita bajarse /usr/src/sbin/isakmpd/samples/VPN-east.conf y /usr/src/sbin/isakmpd/samples/policy del árbol de fuentes. Puede usar su CD (si tiene uno), cvsweb, o el cliente de CVS en la línea de órdenes (Cvsweb tiene VPN-east.conf y policy disponibles). Para este ejemplo, copie policy a /etc/isakmpd/isakmpd.policy, y VPN-east.conf a /etc/isakmpd/isakmpd.conf. Intentaremos mostrarle cómo configurar una VPN (túnel). Si desea usar isakmpd entre anfitriones únicos, hay otros ficheros de configuración en el directorio samples. Las páginas de manual contienen información detallada. No se olvide de isakmpd.conf(5) e isakmpd.policy(5).
Su primer paso es activar ESP. Al
principio de la sección 13.6
se explica cómo hacerlo, tanto durante el arranque como con el
sistema funcionando. Después debe editar /etc/isakmpd.policy.
Este fichero indica a ISAKMP quién puede acceder a IPSec. En
este ejemplo, el fichero policy indica que cualquiera que
envíe datos usando ESP, y que se haya autenticado con la
contraseña mekmitasdigoat (o cualquier otra
contraseña que Vd. determine), puede comunicarse con isakmpd.
Puede modificar este fichero para indicar a ISAKMP que sólo
quiere permitir datos firmados con ciertos certificados digitales o
usando una cierta transformación de cifrado. También
puede permitir el acceso a IPSec a cualquiera. Esto sólo es
recomendable para pruebas. Para ello, edite su fichero policy
para que contenga sólo las siguientes líneas:
KeyNote-Version: 2 Authorizer: "POLICY"
El mismo fichero policy contiene dos líneas que empiezan con el carácter $. Debe eliminar esas líneas antes de usarlo, son sólo para cvs.
Un fichero policy más útil para este ejemplo
sería:
KeyNote-Version: 2
Comment: This policy accepts ESP SAs from a remote that uses the right password
Authorizer: "POLICY"
Licensees: "passphrase:mekmitasdigoat"
Conditions: app_domain =="IPSec policy" &&
esp_present =="yes" -> "true";
Implementando esto obtendrá solamente una VPN (túnel)
básica que use ESP. En el anfitrión A, edite
/etc/isakmpd/isakmpd.conf. La dirección IP de muestra
249.2.2.2, debe ser reemplazada con la dirección IP externa del
anfitrión A.
[General] Retransmits= 5 Exchange-max-time= 120 Listen-on= 249.2.2.2Haga algo parecido con isakmpd.conf en el anfitrión B. 249.3.3.3 representa la dirección IP externa para el anfitrión B.
[General] Retransmits= 5 Exchange-max-time= 120 Listen-on= 249.3.3.3
Aquí es donde puede configurar las variables que afectarán al comportamiento principal de isakmpd. El uso de los predefinidos aquí es correcto. El valor Listen-on= especifica el IP en el que isakmpd debe estar a la escucha. Sólo es necesario el IP de Internet de su pasarela. Si tiene interfaces múltiples externas en su pasarela, podría especificar una lista de las interfaces en las que quiere que esté a la escucha, introduciéndolas, separadas por comas, en una lista.
A continuación, en el anfitrión A, edite isakmpd.conf otra vez:
[Phase 1] 249.3.3.3= HostBY en el anfitrión B:
[Phase 1] 249.2.2.2= HostA
Esta sección describe qué direcciones IP se deben aceptar para negociar la conexión de la fase 1. Su valor señala a la sección de más abajo (recuerde que la fase 1 sólo autentica la conexión remota para asegurar que sean quienes afirman ser). Puede dar una lista de múltiples direcciones con líneas adicionales en el formato IP_Address= <PEER-NAME>..
A continuación, en el anfitrión A:
[Phase 2] Connections= HostA-HostBY en el anfitrión B:
[Phase 2] Connections= HostB-HostA
Esto describe la fase 2 de la conexión. Ésta es la fase que determina qué protocolos usarán las dos partes para comunicarse.
El indicador Connections= se refiere a la sección de más abajo. Inicia los requisitos o los métodos aceptados para activar la fase 2. También le indica a ISAKMPD qué conexiones debe iniciar una vez haya comenzado. Puede tener secciones múltiples, como se ilustra abajo, si va a conectar con múltiples anfitriones.
Si no tiene la dirección IP del anfitrión remoto, puede especificar un Default= que señale a una sección que describa una entrada genérica que servirá de referencia para cualquier IP entrante que no esté en la lista del indicador Connections=.
En el anfitrión A:
[HostB] Phase= 1 Transport= udp Local-address= 249.2.2.2 Address= 249.3.3.3 Configuration= Default-main-mode Authentication= mekmitasdigoat #Flags=En el anfitrión B:
[HostA] Phase= 1 Transport= udp Local-address= 249.3.3.3 Address= 249.2.2.2 Configuration= Default-main-mode Authentication= mekmitasdigoat #Flags=Éstas representan las secciones a las que se refiere en la sección anterior sobre la fase 1. Cada una de ellas describe los requisitos que debe cumplir la pasarela del extremo que intenta conectar, para proceder a la fase 2. Aquí hay muchas otras opciones, pero las que se mencionan son los requisitos mínimos.
Hay otros indicadores que permiten configurar otras opciones. Lea la página de manual de isakmpd.conf(5) para ver las descripciones.
En el anfitrión A:
[HostA-HostB] Phase= 2 ISAKMP-peer= HostB Configuration= Default-quick-mode Local-ID= Net-A Remote-ID= Net-BEn el anfitrión B:
[HostB-HostA] Phase= 2 ISAKMP-peer= HostA Configuration= Default-quick-mode Local-ID= Net-B Remote-ID= Net-A
Éstas representan las secciones a las que se refiere en la sección anterior sobre la fase 2. Son las configuraciones individuales que ISAKMPD debe usar para hablar entre las dos pasarelas de la conexión.
Hay otro indicador que tiene soporte aquí llamado Flags=. Si necesita este indicador, lea la página de manual de isakmpd.conf(5).
Ésta es la sección de IPSec-ID. Estas entradas deben existir en los ficheros isakmpd.conf del anfitrión A y del anfitrión B. Este ejemplo configurará 192.168.1.0/255.255.255.0 para el anfitrión A (que se conectó arriba a Net-A) y 192.168.20.0/255.255.255.0 para el anfitrión B (arriba Net-B).
[Net-A] ID-type= IPV4_ADDR_SUBNET Network= 192.168.1.0 Netmask= 255.255.255.0 [Net-B] ID-type= IPV4_ADDR_SUBNET Network= 192.168.20.0 Netmask= 255.255.255.0
Estas dos secciones están en el fichero de configuración de cada anfitrión. Son las secciones a las que se hace referencia en los identificadores Local-ID y Remote-ID. Describen las rutas que se deben configurar para permitir el paso del tráfico desde una red privada hasta otra. ID-type= puede ser IPV4_ADDR_SUBNET o IPV4_ADDR (RFC2708 menciona más valores posibles. En la actualidad sólo hay soporte en la implementación de OpenBSD para IPv4. El soporte para IPv6 puede estar en OpenBSD-current).
Ahora, en ambos anfitriones, el fichero de muestra debería ser:
[Default-main-mode] DOI= IPSEC EXCHANGE_TYPE= ID_PROT Transforms= 3DES-SHA
Esta sección describe los requisitos para los métodos de cifrado de las conexiones de la fase 1. El nombre refleja el valor de la variable Configuration=. Como se puede ver aquí, estamos indicando nuestro Dominio de Interés, que es IPSec. La variable EXCHANGE_TYPE está configurada con el valor ID_PROT para la fase 1, que identifica los protocolos que cubrirá esta autenticación. Transforms= es la transformación criptográfica requerida (o asignada) para este intercambio. En este caso señala a la sección de abajo en el fichero de configuración, que indica que estamos recibiendo un paquete cifrado con 3DES y una suma de comprobación verificable con SHA. Hay muchas transformaciones criptográficas definidas en el fichero de muestra VPN-east.conf. Éstas se proveen porque 3DES y SHA no siempre tienen soporte en las diferentes plataformas. Para OpenBSD no hay razón para cambiar esta configuración básica. Si desea crear copias de esta sección y cambiar la variable Transforms=, puede hacerlo. El único requisito es que cambie la variable Configuration=.
[Default-quick-mode] DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-3DES-SHA-PFS-SUITE,QM-ESP-DES-MD5-PFS-SUITE
Esta sección describe los requisitos para el cifrado de los datos que se envían a través de la VPN, y la referencia a ella está arriba en Configuration. Note que la diferencia entre esta sección y su equivalente en la fase 1 anterior es que EXCHANGE_TYPE es QUICK_MODE. Suites= señala a una sección Suite de IPSec que describe los distintos esquemas de cifrado disponibles entre los dos anfitriones. Se podría decir mucho más sobre ISAKMP e IPSec, pero usando las descripciones básicas que hemos mencionado debería ser capaz de crear una VPN simple pero sólida, que se cuidara de sí misma. Esto es el mínimo indispensable de isakmpd.conf para ambos anfitriones.
Puede usar
la primera vez que decida invocar este dæmon. El dæmon no funcionará en modo dæmon, sino como un proceso regular. Grabará todo en su terminal. Para parar isakmpd y limpiar las rutas, tiene que matar el proceso isakmpd en cada modo, y ejecutar ipsecadm flush.
Configurar isakmpd para el uso de certificados en lugar de claves precompartidas no es mucho más difícil en una gran red con muchas conexiones entrantes no fiables de lo que sería en una pequeña red. En realidad puede simplificar la configuración, y más importante, la gestión de claves.
Hay una buena descripción sobre cómo generar claves y certificados en el fichero README.PKI del directorio de fuentes de isakmpd. Debe tener una clave CA, el correspondiente certificado CA X.509, una clave privada para cada máquina en la red que use isakmpd, y un certificado X.509 para cada una de esas claves.
Los certificados X.509 necesitan tener una extensión de «Asunto Nombre Alternativo» (SubjectAltName), que describa al poseedor del certificado. Cómo configurar una extensión SubjectAltName usando certpatch para un certificado, también se describe en README.PKI para el caso de configuración de una dirección IP como la extensión SubjectAltName. Aquí, el uso de una dirección IP también es el comportamiento por definición de isakmpd.
Certpatch también tiene soporte para el uso de «Nombres de Dominio Totalmente Cualificados» (FQDN, "Fully Qualified Domain Name") o UFQDN (FQDN de Usuario). Un ejemplo de un FQDN sería www.openbsd.org, y un ejemplo de un UFQDN sería una dirección de correo electrónico, como por ejemplo Jorgen.Granstam@abc.se.
En este documento usaré FQDNs como SubjectAltNames. El uso de direcciones IP debería ser algo más fácil, ya que es el comportamiento por definición de isakmpd pero no es muy diferente, como veremos más adelante.
Para introducir un SubjectAltName FQDN en un certificado, haríamos algo como esto:
Aquí, ca.key es la clave privada de la «Autoridad de Certificación» (CA), por lo tanto esto sólo lo puede hacer quien tenga acceso a la clave privada del CA. home.mysite.se es el FQDN que se introduce en el certificado. Los nombres de los ficheros originalcert.crt y nuevocert.crt podrían tener el mismo nombre, en cuyo caso el fichero original sería anulado por el certificado modificado nuevo.
Ponga las claves y certificados en los directorios tal y como se describe al final de README.PKI. Si se van a usar las clave de una forma seria, la clave CA (ca.key) se debe guardar en algún sitio seguro.
Ahora veamos el fichero de configuración /etc/isakmpd/isakmpd.conf. Originalmente se tomó del fichero de ejemplo en isakmpd.conf(5), pero se ha modificado mucho. También usaré un fichero mucho más corto que en el fichero de ejemplo en la página de manual. He eliminado de ese fichero la mayoría de las partes no necesarias para esta configuración. En parte para simplificar la comprensión de esta configuración. También he añadido algunos comentarios (algunos comentarios los he dejado como estaban en isakmpd.conf(5)), y he cambiado algunos nombres. Ninguno de los nombres de dominio aquí usados existen (que yo sepa).
En realidad, puesto que todo el que lea esto ya tendrá una configuración que funcione del caso de claves precompartidas (ver la sección anterior), no habrá muchas sorpresas en este fichero. No lo explicaré en detalle, mire isakmpd.conf(5) para descripciones de las partes que no comente.
Asumamos que nuestra configuración es parecida a ésta:
one.mysite.se one.worksite.se
192.168.1.2--+ 10.0.0.1====/======10.0.0.2 +--192.168.2.2
| gw.mysite.se gw.worksite.se |
+--192.168.1.1 192.168.2.1---+
two.mysite.se | | two.worksite.se
192.168.1.3--+ +--192.168.2.3
O sea, dos redes que deben conectarse usando un túnel IPSec sobre una red de otro modo insegura. Ignore el hecho de que aquí esté usando direcciones IP reservadas para Internets privadas (RFC1918), debo usar algo. No explicaré cómo usar isakmpd en combinación con NAT ni nada parecido (ya que no lo he probado).
Ahora, veamos el fichero de configuración. Éste es el fichero para la pasarela de seguridad gw.mysite.se:
# ***************************************************************** # ************* Fichero isakmpd.conf de gw.mysite.se ************** # ***************************************************************** # Una configuración de muestra para el dæmon isakmpd de # ISAKMP/Oakley (conocido como IKE) [General] Policy-File= /etc/isakmpd/policy Retransmits= 5 Exchange-max-time= 120 Listen-on= 10.0.0.1 # Aquí, el nombre work-gw se usa sólo como un nombre de # sección y una etiqueta para usarlo en este fichero de # configuración, y no tiene porqué ser el nombre real del # anfitrión ni el nombre de dominio del extremo de la # conexión (pero podría serlo). Fase 1, como ya # sabrá, es la negociación de una asociación de # seguridad ISAKMP (SA). Debería haber un IP y un nombre por # cada extremo con el que queramos comunicarnos. [Phase 1] 10.0.0.2= work-gw # Fase 2 es la negociación de SAs de IPSec. Como en fase 1, # aquí el nombre es un nombre de sección que se # usará más tarde. Puede ser una lista de nombres de # sección separados por comas. De este modo, si el # tráfico desde muchas redes (o anfitriones individuales) # tuviera que ser reenviado a través de este túnel, la # mayoría de nombres de sección serían # añadidos (y las correspondientes secciones nuevas más # abajo). [Phase 2] Connections= work-gw-my-gw # Los siguientes parámetros son para negociaciones de SA de # ISAKMP. El nombre de sección es el anterior de la fase 1. La # etiqueta más interesante es la de ID. La etiqueta ID # está configurada con el nombre de la sección, en donde # se puede encontrar la información de la identidad sobre este # anfitrión, que se presentará a los extremos que # conecten. Si la etiqueta ID no se encontrara disponible, isakmpd # asumirá que se debe identificar a sí mismo usando la # dirección IP. Note que ya no hay ninguna etiqueta de # autenticación en esta configuración. Los datos de # autenticación se usan sólo en el caso de claves # precompartidas. [work-gw] Phase= 1 Transport= udp Local-address= 10.0.0.1 # Local address Address= 10.0.0.2 # Peer address ID= my-ID Configuration= Default-main-mode # Éstos son los datos de identidad. ID-type también # puede ser IPV4_ADDR (por definición), IPV4_ADDR_SUBNET o # UFQDN. La etiqueta Name se usa paraa FQDN y UFQDN; para IPV4_ADDR # se usaría una etiqueta Address. Para IPV4_ADDR_SUBNET se # usaría una etiqueta Network y Netmask. [my-ID] ID-type= FQDN Name= gw.mysite.se # Ésta es la sección para la conexión IPSec. El # nombre de la sección viene de la lista en la sección # anterior de fase 2. ISAKMP-peer es, por supuesto, la etiqueta de # nuestro extremo de conexión en la sección fase 1 # anterior. Las etiquetas Local-ID y Remote-ID deben ser los nombres # de las secciones que describen qué paquetes se deben reenviar # por el túnel IPSec hacia la red remota. [work-gw-my-gw] Phase= 2 ISAKMP-peer= work-gw Configuration= Default-quick-mode Local-ID= Net-west Remote-ID= Net-east # Cualquier paquete cuyo origen sea una máquina en la red # aquí descrita... [Net-west] ID-type= IPV4_ADDR_SUBNET Network= 192.168.1.0 Netmask= 255.255.255.0 # ... y cuyo destino coincida con la red descrita aquí, # será cifrado y reenviado por el túnel IPSec al sistema # remoto. [Net-east] ID-type= IPV4_ADDR_SUBNET Network= 192.168.2.0 Netmask= 255.255.255.0 # Descripciones del modo principal # Aquí están los datos para el modo principal. Usar # aquí DES no es una buena idea, ya que DES ya no está # considerado como un algoritmo de cifrado seguro. 3DES está # considerado como mucho más seguro debido a que tiene # suficientes bits en la clave como para ser seguro. Transforms es una # lista de etiquetas que describen las transformaciones # criptográficas del modo principal. En este ejemplo # sólo tenemos una. [Default-main-mode] DOI= IPSEC EXCHANGE_TYPE= ID_PROT Transforms= 3DES-MD5 # Certificados almacenados en formato PEM. Esta parte es importante # cuando se usen certificados. Los certificados CA deben estar en # CA-directory (pero no la clave privada CA). Cert-directory debe # tener, al menos, el certificado para el anfitrión local, pero # también están permitidos otros certificados. La clave # privada debe ser la clave privada del anfitrión local. [X509-certificates] CA-directory= /etc/isakmpd/ca/ Cert-directory= /etc/isakmpd/certs/ Private-key= /etc/isakmpd/private/local.key # Transformaciones criptográficas del modo principal #################################################### # Aquí va nuestra transformación del modo principal; lo # más importante aquí es usar RSA_SIG como método # de autenticación cuando se usen certificados. Por el momento, # es el único método que tiene soporte cuando se usan # certificados. Las entidades comerciales en los EE.UU. tendrán # que esperar hasta septiembre de 2.000 para usarlo, debido a la # patente de RSA. Por suerte, yo no vivo en los EE.UU. También # es importante la etiqueta GROUP_DESCRIPTION. Debe coincidir con la # etiqueta GROUP_DESCRIPTION en las transformaciones # criptográficas del modo rápido descritas más # adelante. Aquí la etiqueta Life se podría modificar. # LIFE_60_SECS podría ser más corta de lo necesario para # el uso normal. [3DES-MD5] ENCRYPTION_ALGORITHM= 3DES_CBC HASH_ALGORITHM= MD5 AUTHENTICATION_METHOD= RSA_SIG GROUP_DESCRIPTION= MODP_1024 Life= LIFE_60_SECS,LIFE_1000_KB # Descripción del modo rápido ############################# [Default-quick-mode] DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-3DES-MD5-PFS-SUITE # Grupos de protección del modo rápido ###################################### # 3DES [QM-ESP-3DES-MD5-PFS-SUITE] Protocols= QM-ESP-3DES-MD5-PFS # 3DES [QM-ESP-3DES-MD5-PFS] PROTOCOL_ID= IPSEC_ESP Transforms= QM-ESP-3DES-MD5-PFS-XF # Transformaciones criptográficas del modo rápido # No lo olvide. GROUP_DESCRIPTION debe coincidir con GROUP_DESCRIPTION # en el modo principal anterior. Para reenviar paquetes entre dos # redes (o desde un anfitrión a una red) usamos el modo TUNNEL. # Entre dos anfitriones también podemos usar el modo TRANSPORT. [QM-ESP-3DES-MD5-PFS-XF] TRANSFORM_ID= 3DES ENCAPSULATION_MODE= TUNNEL AUTHENTICATION_ALGORITHM= HMAC_MD5 GROUP_DESCRIPTION= MODP_1024 Life= LIFE_60_SECS # Como ya sabemos por la página de manual de isakmpd.config, # aquí LIFE_DURATION es un valor de oferta (60), un valor # mínimo aceptable, y un valor máximo aceptable. El # ejemplo de isakmpd.conf tiene configurado esto a 600,450/720. Este # valor puede ser mejor para un uso normal. [LIFE_60_SECS] LIFE_TYPE= SECONDS LIFE_DURATION= 60,45:72 [LIFE_1000_KB] LIFE_TYPE= KILOBYTES LIFE_DURATION= 1000,768:1536 # ***************************************************************** # ********* Fin del fichero isakmpd.conf de gw.mysite.se ********** # *****************************************************************
Hasta aquí la configuración para el sistema local. El sistema remoto se configura exactamente del mismo modo, sólo que al revés. Por lo tanto, la primera parte del fichero isakmpd.conf es diferente. Echemos un vistazo a esa primera parte del fichero isakmpd.conf para la pasarela de seguridad de gw.worksite.se:
# ***************************************************************** # ************* Fichero isakmpd.conf de gw.worksite.se ************ # ***************************************************************** [General] Policy-File= /etc/isakmpd/policy Retransmits= 5 Exchange-max-time= 120 Listen-on= 10.0.0.2 [Phase 1] 10.0.0.1= my-gw [Phase 2] Connections= work-gw-my-gw [my-gw] Phase= 1 Transport= udp Local-address= 10.0.0.2 # Local address Address= 10.0.0.1 # Peer address ID= work-ID Configuration= Default-main-mode [work-ID] ID-type= FQDN Name= gw.worksite.se [work-gw-my-gw] Phase= 2 ISAKMP-peer= my-gw Configuration= Default-quick-mode Local-ID= Net-east Remote-ID= Net-west # ***************************************************************** # ************************ ... continuará ************************* # *****************************************************************
No ha sido tan difícil, tal vez algo aburrido de leer. La siguiente parte es algo más interesante.
El fichero policy puede ser algo confuso para alguien que no lo haya usado con anterioridad, especialmente si las cosas no funcionan como se espera. La página de manual de isakmpd.policy(5) no está tan mal. Tal vez sea poco clara en algunas partes, pero en general es buena.
El fichero policy más simple que es posible sería uno que contuviera una única línea:
authorizer: "POLICY"
Básicamente, esto significa que no hay limitaciones en policy sobre quién puede conectar. Por lo tanto, no es una configuración muy segura. La etiqueta authorizer es para indicar quién tiene la autorización para decidir la política a seguir. El autorizador especial "POLICY" tiene la autoridad total sobre policy. Cualquier otro authorizer debe primero ser autorizado por "POLICY" para poder tener cualquier autoridad.
También puede haber un grupo de condiciones sobre qué está autorizado. El siguiente policy vendría a decir que sólo alguien que use el protocolo ESP con algo de cifrado real, estaría autorizado (bueno, alguien que usara DES también estaría autorizado aquí, aunque DES casi está considerado como muy inseguro, se deja como ejercicio para el lector el cambiar este fichero policy para no permitir tampoco DES). Note que cualquiera que cifre con ESP todavía estaría autorizado.
authorizer: "POLICY"
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" -> "true";
También se puede «sublicenciar» la autoridad a alguien más (podría ser una o más entidades). El caso simple sería el caso de la clave precompartida. En ese caso, cualquiera que sepa que la contraseña precompartida, estará autorizado. Por lo tanto:
authorizer: "POLICY"
licensees: "contraseña:algo muy secreto"
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" -> "true";
Esto autorizaría a cualquiera que supiera esta contraseña para conectar y cumplir con las condiciones (pero recuerde que la contraseña también se debe activar en la etiqueta Authentication de isakmpd.conf).
Hasta ahora, nada complicado. Ahora viene la parte interesante. Primero, puede haber muchos con licencias, aunque deben estar todos autorizados por "POLICY". Además, aquéllos que dispongan de licencias y estén autorizados, pueden «sublicenciar» a otros. Un licenciado puede ser simplemente una cadena si está más descrito en el fichero policy:
authorizer: "POLICY" licensees: "subpolicyAH" || "subpolicyESP" conditions: app_domain =="IPsec policy" -> "true"; authorizer: "subpolicyESP" licensees: "contraseña:algo muy secreto" conditions: esp_present =="yes" -> "true"; authorizer: "subpolicyAH" licensees: "contraseña:algo muy secreto" conditions: ah_present =="yes" -> "true";
Y ahora, a por lo que todos estaban esperando. policy también se puede sublicenciar o delegar a una clave. En este caso suele ser un certificado X.509. El uso más simple de certificados sería usarlos como las contraseñas. Simplemente introduzca certificados de usuarios individuales en el fichero policy:
keynote-version: 2
comment: This is an example of a policy delegating to a key.
authorizer: "POLICY"
licensees: "x509-base64:\
MIIBsTCCARoCAQAwDQYJKoZIhvcNAQEEBQAwITELMAkGA1UEBhMCc2UxEjAQBgNV\
BAMTCUlLRUxBQiBDQTAeFw0wMDAxMjgxNzQyMTZaFw0wMTAxMjcxNzQyMTZaMCEx\
CzA Esto es un certificado de usuario AQEB\
BQA IUuz\
eOW8P5UGJUH2JVkiA2CTDryFf0CHYwd2P003dtVYw5RvET7XLMpRZiCcWtBdxneW\
ct+016zUBP/cQMMl+KownxAUq9ezA8GvTyUWC97SOMOgoVj/QR3FHmEjpUi3AgMB\
AAEwDQYJKoZIhvcNAQEEBQADgYEALGShaAxHvGncev0iFnKrJI4x5T4vlaMP1ad+\
iWLV5q9H3wickVGN0NPerq0YLwx/VA9WaecYN8V+ALtNKYPuDiT11zwvE8GQeaai\
NuzgmQ9hh3GifEgN9VEiC3j4kTytonKr0Q+vTLM7xYzheOxvrtUErRwZ9Xs1KzHe\
yiXHSU8="
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" -> "true";
Esto, obviamente, es una idea estúpida si hay muchos usuarios. Los certificados que isakmpd lee de los directorios CA- y Certificate, y los certificados recibidos desde el otro extremo de la conexión se convierten en pseudocredenciales. Estos certificados convertidos en pseudocredenciales serían algo así:
authorizer: "x509-base64:\
MIIBsTCCARoCAQAwDQYJKoZIhvcNAQEEBQAwITELMAkGA1UEBhMCc2UxEjAQBgI2\
CzA Esto es la clave/certificado público del firmante AQEB\
BQA del certificado de usuario (El certificado CA) IUuz\
eOW8P5UGJUH2JVkiA2CTDryFf0CHYwd2P003dtVYw5RvET7XLMpRZiCcWtBdxneW\
ct+016zUBP/cQMMl+KownxAUq9ezA8GvTyUWC97SOMOgoVj/QR3FHmEjpUi3AgMB\
AAEwDQYJKoZIhvcNAQEEBQADgYEALGShaAxHvGncev0iFnKrJI4x5T4vlaMP1ad+\
iWLV5q9H3wickVGN0NPerq0YLwx/VA9WaecYN8V+ALtNKYPuDiT11zwvE8GQeaai\
NuzgmQ9hh3GifEgN9VEiC3j4kTytonKr0Q+vTLM7xYzheOxvrtUErRwZ9Xs1KzHe\
yiXHSU8="
licensees: "x509-base64:\
MIIBsTCCARoCAQAwDQYJKoZIhvcNAQEEBQAwITELMAkGA1UEBhMCc2UxEjAQBgNV\
BAMTCUlLRUxBQiBDQTAeFw0wMDAxMjgxNzQyMTZaFw0wMTAxMjcxNzQyMTZaMCEx\
CzA Esto es la clave del asunto del AQEB\
BQA certificado IUuz\
eOW8P5UGJUH2JVkiA2CTDryFf0CHYwd2P003dtVYw5RvET7XLMpRZiCcWtBdxneW\
ct+016zUBP/cQMMl+KownxAUq9ezA8GvTyUWC97SOMOgoVj/QR3FHmEjpUi3AgMB\
AAEwDQYJKoZIhvcNAQEEBQADgYEALGShaAxHvGncev0iFnKrJI4x5T4vlaMP1ad+\
iWLV5q9H3wickVGN0NPerq0YLwx/VA9WaecYN8V+ALtNKYPuDiT11zwvE8GQeaai\
NuzgmQ9hh3GifEgN9VEiC3j4kTytonKr0Q+vTLM7xYzheOxvrtUErRwZ9Xs1KzHe\
yiXHSU8="
conditions: app_domain =="IPsec policy" -> "true";
Note que éstos no están autorizados por "POLICY" y por lo tanto no tendrán ningún efecto sin que estén de alguna manera autorizados. Además, esto muestra lo que le ocurre internamente a los certificados. La credencial anterior no se ve en el fichero policy. Sin embargo, se puede dar una sublicencia a tales credenciales. Recuerde el tema sobre sublicencias. Es posible dar licencias a todos los certificados que estén firmados por una cierta CA, poniendo el certificado de la CA como un licenciado de "POLICY":
keynote-version: 2
comment: This is an example of a policy delegating to a key.
authorizer: "POLICY"
licensees: "x509-base64:\
MIIBsTCCARoCAQAwDQYJKoZIhvcNAQEEBQAwITELMAkGA1UEBhMCc2UxEjAQBgNV\
BAMTCUlLRUxBQiBDQTAeFw0wMDAxMjgxNzQyMTZaFw0wMTAxMjcxNzQyMTZaMCEx\
CzA Esto es un certificado CA AQEB\
BQA IUuz\
eOW8P5UGJUH2JVkiA2CTDryFf0CHYwd2P003dtVYw5RvET7XLMpRZiCcWtBdxneW\
ct+016zUBP/cQMMl+KownxAUq9ezA8GvTyUWC97SOMOgoVj/QR3FHmEjpUi3AgMB\
AAEwDQYJKoZIhvcNAQEEBQADgYEALGShaAxHvGncev0iFnKrJI4x5T4vlaMP1ad+\
iWLV5q9H3wickVGN0NPerq0YLwx/VA9WaecYN8V+ALtNKYPuDiT11zwvE8GQeaai\
NuzgmQ9hh3GifEgN9VEiC3j4kTytonKr0Q+vTLM7xYzheOxvrtUErRwZ9Xs1KzHe\
yiXHSU8="
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" -> "true";
El fichero policy que hemos visto es un simple ejemplo de fichero policy que delega en una CA. Cualquier usuario que tenga un certificado firmado por la CA de este certificado, y que además cumpla las otras condiciones configuradas en policy y en el fichero de configuración, estará autorizado.
Desafortunadamente, esto no es suficiente para estar realmente seguro. Hay formas para atacar una pasarela de seguridad configurada de esta forma. Si no quiere leer los detalles, pase a la sección siguiente ahora. Para el resto, intentaremos entender porqué esto no es seguro. No es difícil.
Considere a qué información tiene acceso en este momento uno de los isakmpd. Del fichero de configuración, isakmpd sabe cuál es el IP-address desde el que se conectarán (en la sección Fase 1). De la información que obtiene durante la negociación de la fase 1, sabe el ID con el que el extremo que se conecta presenta a sí mismo y el certificado que obtiene desde ese extremo de la conexión prueba que que ese ID le pertenece.
Si la información del ID era el IP (si no ponemos una sección ID en fase 1, ésta es la situación por definición), todo va bien. La CA habrá ligado el IP al certificado, y el IP en la configuración será toda la información que necesitemos. Un impostor podría usar el mismo IP de otra máquina en algunos casos (si ambas máquinas estuvieran en la misma red local y la máquina que tuviera este IP estuviera fuera de servicio por cualquier motivo). Sin embargo, el impostor no podría tener un certificado y la correspondiente clave privada que probara que este IP pertenece al impostor.
Si esto ocurriera alguna vez, el impostor habría conseguido robar la clave privada del auténtico propietario del IP, o el impostor habría conseguido engañar la CA para que le diera un certificado que contuviera información falsa. En el primer caso significaría que la clave privada no se habría protegido lo suficientemente bien, y en el segundo la CA habría fallado al comprobar la identidad del impostor como debiera (o la información del ID del certificado) o la clave privada de la CA no habría estado bien protegida. Como todo esto son prerrequisitos para que la seguridad funcione, ninguna de estas situaciones debería suceder nunca.
En nuestro ejemplo la situación es diferente. Aquí tenemos un FQDN en el certificado en lugar de una dirección IP. Como todavía tenemos una dirección IP en la sección de fase 1, tenemos por tanto un posible problema de seguridad. Lo que ocurriría durante la negociación de fase 1 de ISAKMP sería que podríamos comprobar que el extremo de la conexión se hubiera llevado a cabo desde el IP supuesto (pero como hemos explicado anteriormente, en algunos casos se podría falsificar). Podríamos comprobar que ese ID que presenta nuestro extremo de la conexión realmente pertenece a éste. Pero lo que no podríamos comprobar ahora sería si ese ID es realmente el ID que suponemos, porque isakmpd nunca ha sabido qué ID debería ser.
Alguien podría decir que el sistema de DNS ata el IP al FQDN para el anfitrión. Es cierto, sin embargo el sistema de DNS actual no es seguro y se le puede, bajo ciertas circunstancias, engañar para que entregue información falsa (o podría ser víctima de una ataque de «denegación de servicio» (DoS, "Denial of Service") por parte de un atacante, y la máquina del atacante podría falsificar la respuesta del servidor de DNS). DNS seguro aparecerá en el futuro, pero todavía no está aquí (o por lo menos la mayoría de servidores de DNS todavía no son seguros); por lo tanto, hoy en día, el uso de DNS para comprobar si el FQDN en el certificado corresponde al IP supuesto, no es una garantía. De hecho, isakmpd no lo comprueba con DNS. Aun cuando DNS fuera seguro, la comprobación no serviría en el caso de usar un UFQDN.
Así pues, en caso de tener un FQDN como ID, sería posible que un atacante obtuviese su propia clave privada y que ésta estuviera firmada por la misma CA que usamos nosotros (pero con el FQDN del atacante). Y podría lanzar un ataque DoS sobre nuestra conexión para hacerla caer (de hecho, existen unos agujeros en el mismo protocolo ISAKMP, que probablemente se podrín usar para lanzar un ataque DoS remoto contra la conexión y hacerla caer, aunque no sé qué sensibles a estos ataques sería isakmpd). Entonces, el atacante podría configurar su propia máquina del mismo modo que la de nuestra conexión, conectarla a la red de nuestra conexión, e intentar conectarse mediante su ID, clave privada y certificado propios.
Nuestro isakmpd no habría sido informado sobre qué ID por nuestra conexión (debido a que el atacante está configurado de forma idéntica a nuestra conexión, aparte del certificado, ID y clave privada). Nuestro isakmpd podría comprobar que el certificado estuviera firmado por la misma CA (pero la mayoría de CAs firman muchos certificados, y un certificado no es tan difícil de conseguir), y que el ID presentado fuera el mismo que el ID en el certificado. Sin embargo, con la configuración presentada hasta ahora, no comprobaría que este ID fuera el supuesto. Por lo tanto, el atacante tendría permiso para conectar.
Ahora la cuestión es, ¿cómo podemos informar a isakmpd sobre qué ID debe esperar? Por suerte esto es fácil, y está documentado en la página de manual de isakmpd.policy(5). Debemos hacer la comprobación en policy, como esto:
keynote-version: 2
comment: This is an example of a policy delegating to a key.
authorizer: "POLICY"
licensees: "x509-base64:\
MIIBsTCCARoCAQAwDQYJKoZIhvcNAQEEBQAwITELMAkGA1UEBhMCc2UxEjAQBgNV\
BAMTCUlLRUxBQiBDQTAeFw0wMDAxMjgxNzQyMTZaFw0wMTAxMjcxNzQyMTZaMCEx\
CzA Esto es un certificado CA AQEB\
BQA IUuz\
eOW8P5UGJUH2JVkiA2CTDryFf0CHYwd2P003dtVYw5RvET7XLMpRZiCcWtBdxneW\
ct+016zUBP/cQMMl+KownxAUq9ezA8GvTyUWC97SOMOgoVj/QR3FHmEjpUi3AgMB\
AAEwDQYJKoZIhvcNAQEEBQADgYEALGShaAxHvGncev0iFnKrJI4x5T4vlaMP1ad+\
iWLV5q9H3wickVGN0NPerq0YLwx/VA9WaecYN8V+ALtNKYPuDiT11zwvE8GQeaai\
NuzgmQ9hh3GifEgN9VEiC3j4kTytonKr0Q+vTLM7xYzheOxvrtUErRwZ9Xs1KzHe\
yiXHSU8="
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" &&
remote_id =="gw.worksite.se" -> "true";
Ahora sólo gw.worksite.se podría obtener una conexión IPSec. Se pueden añadir más permisos para otros IDs, añadiendo más comprobaciones remote_id alternativas, o sea, teniendo condiciones en policy como esta:
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" &&
(remote_id =="gw.worksite.se" ||
remote_id =="gw.whatsite.se") -> "true";
Con esta policy podrían conectar tanto gw.worksite.se, como gw.somesite.se, como gw.whatsite.se.
Algunos afirman que es desafortunado que tengan que haber certificados enteros introducidos en policy. Reformatear los certificados en el formato de policy requiere algo de esfuerzo, y hace que policy sea poco legible. Si alguien substituyera por error, un certificado de usuario con el correspondiente certificado de CA en alguna parte de un fichero policy complejo, podría provocar que usuarios no autorizados obtuvieran permiso para conectar en algunos casos y, aún peor, no sería fácilmente detectable leyendo el fichero policy (porque los certificados X.509 no están en un formato humano legible).
Ahora, para aquellos a quienes les gusta estar al borde del precipicio, existe una solución a este problema. Ahora se puede usar el certificado «Nombre Distinguido» (DN, "Distinguished Name") en lugar de un certificado en policy (por supuesto que el correspondiente certificado debe estar disponible desde los directorios cert o ca del disco, de modo que isakmpd lo pueda encontrar). Con este formato, el fichero policy anterior acabaría siendo algo así:
keynote-version: 2
comment: This is an example of a policy delegating to a key.
authorizer: "POLICY"
licensees: "DN:\C=se\CN=IKELAB CA"
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" &&
(remote_id =="gw.worksite.se" ||
remote_id =="gw.somesite.se" ||
remote_id =="gw.whatsite.se") -> "true";
Mucho más legible, ¿o no? La información sobre lo que es el exacto DN para un certificado se puede encontrar mirando al certificado, usando la utilidad openssl:
Se pueden hacer configuraciones de policy más complicadas pero esto es suficiente para empezar, y todavía hay otro ejemplo en la siguiente sección.
Esto debería proveerle con la información necesaria sobre el certificado en ca.crt. Esto será bueno siempre que tengamos un fichero policy pequeño o, por lo menos, uno razonable. Sin embargo, todavía no es suficiente si tenemos un sitio enorme con muchos usuarios que deban tener permiso de conexión.
Veamos ahora algunas características interesantes de isakmpd. Hasta ahora hemos asumido que el supuesto extremo remoto de la conexión era conocido y tenía una dirección IP estática. Esto no siempre es así. Muchas personas usan IPs asignados de forma dinámica, o usan muchas máquinas diferentes. En otros casos, como en el caso de los servidores, podríamos no estar seguros de quién quiere conectar.
Por lo tanto, una funcionalidad interesante de isakmpd es que puede usar en la sección de fase 1 una etiqueta predefinida en lugar de un IP, permitiendo de este modo negociaciones isakmpd desde cualquier IP. Esto se haría del siguiente modo:
[phase 1] Default= work-gw
Primero, hay que decir que esta configuración podría no ser segura frente a ataques de DoS. Como se ha dicho anteriormente, existen algunos agujeros en los protocolos ISAKMP/IKE. De todos modos, el uso de una sección de fase 1 predefinida también nos permite usar un tipo de «certificados de autorización».
Imagine que tuviéramos muchos usuarios autorizados, pero que no aceptáramos a cualquier usuario, como podría ocurrir en una compañía. Nos gustaría que los empleados tuvieran permiso para conectar, pero nadie más. Ahora imagine que la compañía tuviera miles de empleados, y que quisiéramos que todos ellos pudieran conectar desde cualquier máquina (no sólo desde dentro de la red de la compañía), pero que no todos tuvieran permiso para hacer cualquier cosa. Se podría escribir un fichero policy como éste:
keynote-version: 2
authorizer: "POLICY"
licensees: "telnet@work" || "telnet@lab" || "pop3@work"
conditions: app_domain =="IPsec policy" &&
esp_present =="yes" &&
esp_enc_alg !="null" &&
remote_id_type =="UFQDN" &&
(remote_id =="telnet@worksite.se" ||
remote_id =="pop3@worksite.se" ||
remote_id =="telnet@lab.worksite.se") -> "true";
authorizer: "telnet@work"
licensees: "DN:\C=se\CN=IKELAB CA"
conditions: remote_id =="telnet@worksite.se" &&
local_filter_type =="IPv4 address" &&
local_filter_port =="23" &&
local_filter =="192.168.002.003"
authorizer: "telnet@lab"
licensees: "DN:\C=se\CN=IKELAB CA"
conditions: remote_id =="telnet@lab.worksite.se" &&
local_filter_type =="IPv4 address" &&
local_filter_port =="23" &&
local_filter =="192.168.002.002" -> "true";
authorizer: "pop3@work"
licensees: "DN:\C=se\CN=IKELAB CA"
conditions: local_filter_type =="IPv4 address" &&
local_filter_port =="110" &&
local_filter =="192.168.002.003" &&
remote_id =="telnet@worksite.se" -> "true";
Puede que esto no sea exactamente como debería ser. Por lo que sé, no está comprobado (de hecho, estas condiciones de filtros podrían no funcionar como espero). Además, un fichero policy como éste (cualquiera con un IP del extremo de la conexión predefinido) requeriría reescribir partes del fichero isakmpd.conf también. Esto conllevaría algunas implicaciones en la seguridad. Para este tipo de conexiones en las que cualquiera debe tener permiso para conectar, es probablemente deseable grabar el DN de cualquiera que conecte. Que yo sepa, isakmpd todavía no tiene soporte para esto. Además, también podría tener otras implicaciones en la seguridad. De cualquier modo la idea básica está clara.
Por si acaso alguien no ha visto las interesantes posibilidades que esto tiene: Si todas la máquinas que usan ISAMKP/IKE de este modo, tuvieran un grupo de condiciones estándar para todos los servicios que los usuarios quisieran usar de forma remota, la CA podría autorizar a los usuarios poniendo las extensiones SubjectAltName correctas en sus certificados. Además, la fecha de caducidad para estos certificados se podría configurar para que caducara a menudo, aunque los usuarios podrían obtener nuevos certificados cuando sus certificados actuales estuvieran a punto de caducar. Si los usuarios hicieran un mal uso de sus autorizaciones, bastaría con no volver a emitir los certificados para que no pudieran acceder después de la fecha de caducidad. No sería necesario cambiar los ficheros policy en todas las máquinas simplemente porque un empleado, por ejemplo, dejara el trabajo. El mismo esquema podría funcionar para propósitos distintos a ISAKMP/IPSec (¡incluida la autorización para sistemas fuera de la conexión!), aunque eso requeriría un software especial. En cualquier caso, cualquier organización que hiciera esto es probable que también quisiera ser su propia CA.
Las configuraciones de multiusuarios (usuarios móviles) como ésta, también son posibles con claves precompartidas, pero entonces se requiere que se use el modo AGGRESSIVE en lugar del modo ID_PROT, ya que en este caso necesitaremos poder escoger la frase de la contraseña correcta basada en el ID, debido a que en este caso no lo podemos saber por el ID (en modo AGGRESSIVE el ID se envía durante un estado más temprano de la negociación, pero se envía descifrado, por lo tanto el modo AGGRESSIVE es más rápido porque necesita menos intercambios de mensajes, pero también es un poco menos seguro debido a que el ID se envía en claro).
isakmpd es el dæmon de la gestión de claves de ISAKMP/Oakley que viene con OpenBSD. Sospechamos que interacciona, por lo menos en parte, con la mayoría de implementaciones ISAKMP, pero sólo los siguientes han sido comprobados. Note que algunos software isakmp que puede encontrar están basados en el dæmon iskamp de OpenBSD.
Los siguientes clientes para MS-Windows son compatibles según los informes recibidos:
Las siguientes pasarelas/enrutadores son compatibles según los informes recibidos:
Para solventar problemas, la primera herramienta que debe usar es tcpdump(8). Use tcpdump para buscar varias cosas.
Si está usando tcpdump en OpenBSD, dispone de una versión mejorada de tcpdump que puede mostrarle algo de información sobre paquetes ESP y AH. Si está usando tcpdump desde OpenBSD 2.5 o desde otro sistema operativo, es posible que tenga una versión anticuada que sólo le muestre el número del protocolo para AH o ESP (el protocolo IP de ESP es 50, y el de AH es 51).
vpn# ping -c 3 208.1.1.1 PING esp.mil (208.1.1.1): 56 data bytes 64 bytes from 208.1.1.1: icmp_seq=0 ttl=255 time=190.155 ms 64 bytes from 208.1.1.1: icmp_seq=1 ttl=255 time=201.040 ms 64 bytes from 208.1.1.1: icmp_seq=2 ttl=255 time=165.481 ms --- esp.mil ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 165.481/185.558/201.040 msY en otra sesión puedo ver mis "pings" encapsulados:
vpn# tcpdump -ni fxp7 host 208.1.1.1 tcpdump: listening on fxp7 14:12:19.630274 esp 208.2.2.2 > 208.1.1.1 spi 0x00001000 seq 4535 len 116 14:12:19.813519 esp 208.1.1.1 > 208.2.2.2 spi 0x00001001 seq 49313 len 116 14:12:20.630277 esp 208.2.2.2 > 208.1.1.1 spi 0x00001000 seq 4536 len 116 14:12:20.832458 esp 208.1.1.1 > 208.2.2.2 spi 0x00001001 seq 49314 len 116 14:12:21.630273 esp 208.2.2.2 > 208.1.1.1 spi 0x00001000 seq 4537 len 116 ^C 1831 packets received by filter 0 packets dropped by kernel
# Passing in ISAKMP traffic from the security gateways pass in on ne0 proto udp from gatewB/32 port = 500 to gatewA/32 port = 500 pass out on ne0 proto udp from gatewA/32 port = 500 to gatewB/32 port = 500 # Passing in encrypted traffic from security gateways pass in proto esp from gatewB/32 to gatewA/32 pass out proto esp from gatewA/32 to gatewB/32
# Passing in Photuris traffic from the security gateways pass in on ne0 proto udp from gatewB/32 port = 468 to gatewA/32 port = 468 pass out on ne0 proto udp from gatewA/32 port = 468 to gatewB/32 port = 468 # Passing in encrypted traffic from security gateways pass in proto ah from gatewB/32 to gatewA/32 pass out proto ah from gatewA/32 to gatewB/32
o (para saltar la información más detallada de depurado del temporizador
# Passing in traffic from the designated subnets. pass in on enc0 from netB/netBmask to netA/netAmask
En /kern hay una tabla de SA/SPIs actuales, incluidos los que tienen flujos (SAs salientes) y los que no (SAs entrantes). También hay contadores de tráfico que puede usar para ver qué tráfico pasa y a dónde va.
vpn% netstat -rn -f encap Routing tables Encap: Source Port Destination Port Proto SA(Address/SPI/Proto) 0.0.0.0/32 0 192.168.99/24 0 0 208.1.1.1/00001000/50 0.0.0.0/32 0 208.1.1.1/32 0 0 208.1.1.1/00001000/50 208.1.2.0/24 0 192.168.99/24 0 0 208.1.1.1/00001000/50 208.1.2.0/24 0 208.1.1.1/32 0 0 208.1.1.1/00001000/50 208.1.5.0/24 0 192.168.99/24 0 0 208.1.1.1/00001000/50 208.1.5.0/24 0 208.1.1.1/32 0 0 208.1.1.1/00001000/50 208.2.2.2/32 0 192.168.99/24 0 0 208.1.1.1/00001000/50 208.2.2.2/32 0 208.1.1.1/32 0 0 208.1.1.1/00001000/50
IPSec está parcialmente documentado en la página de manual de vpn(8). Hay varios modelos de configuración en el directorio /usr/share/ipsec/ que le pueden ser de ayuda. Las páginas de manual de enc(4), ipsec(4), ipsecadm(8), photurisd(8), startkey(1), isakmpd(8), isakmpd.conf(5) y isakmpd.policy(5) tienen información más detallada y pueden ayudarle con la configuración y operación de IPSec.
Otros enlaces:
Y en los RFC:
[Volver al índice principal]
[Sección 12.0 - Para usuarios avanzados]
[Sección 14.0 - Uso de discos en OpenBSD]
www@openbsd.org
Originally [OpenBSD: faq13.html,v 1.37 2000/12/26 16:17:40 ericj Exp ]
$Translation: faq13.html,v 1.6 2000/12/26 21:12:09 horacio Exp $
$OpenBSD: faq13.html,v 1.6 2000/12/28 22:00:24 jufi Exp $