Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Copyright 2004-2005 Francisco R. Santonja Rodilla Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Índice 0. Índice ......................................................................................................... 1 1. Introducción.............................................................................................. 2 1.1. Tipo de VPN ......................................................................................................2 1.2. Ventajas.............................................................................................................2 1.3. Implementaciones..............................................................................................3 2. VPN Sitio a Sitio usando VPND............................................................... 4 2.1. Instalación..........................................................................................................4 2.2. Configuración del servidor .................................................................................5 2.3. Configuración del cliente....................................................................................5 2.4. Soporte en el servidor para varios clientes.........................................................6 2.5. Comprobación del funcionamiento de la VPN ....................................................7 2.6. Acceso a recursos desde Redes Windows ........................................................8 3. VPN de acceso remoto usando OpenVPN 2.x ....................................... 10 3.1. Instalación..........................................................................................................10 3.2. Configuración de OpenVPN utilizando una clave estática..................................11 3.3. Implantación de una infraestructura de clave pública sobre la VPN ...................13 3.4. Ejecución de OpenVPN como un servicio de INETD .........................................17 3.5. Ejecución de OpenVPN como un demonio ........................................................18 4. VPN usando StrongSWAN 2.x................................................................. 19 4.1. Instalación..........................................................................................................19 4.2. Configuración de StrongSwan utilizando una clave estática ..............................21 4.3. Implantación de una infraestructura de clave pública sobre la VPN ...................22 4.4. Adaptación a distintas arquitecturas...................................................................23 4.5. Acceso desde un cliente Windows 2000/XP ......................................................25 4.6. Consideraciones sobre StrongSWAN ................................................................26 5. Seguridad.................................................................................................. 27 5.1. Cortafuegos .......................................................................................................27 5.1. Distribución de contraseñas y configuraciones ..................................................28 6. Bibliografía................................................................................................ 30 1 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 1. Introducción Una red privada virtual o VPN es una tecnología de red que permite una extensión de la red local sobre una red pública o no controlada, como podría ser el caso de Internet. Esta tecnología permite mediante encapsulación y encriptación el tráfico de paquetes de la red privada sobre la red pública, dando unas garantías de seguridad, integridad y confidencialidad. 1.1. Tipos de VPN Fundamentalmente encontramos 3 tipos de arquitecturas de conexión VPN: VPN de acceso remoto Este modelo es el que esta siendo mas usado en la actualidad, permite que usuarios o proveedores conecten con la empresa desde sitios remotos a través de Internet. Una vez autentificado el cliente, se crea un túnel sobre Internet, que permite al usuario trabajar de forma similar a como lo haría en la red local y con un nivel de acceso similar. VPN Sitio a Sitio Este modelo es similar al anterior, la diferencia esta basada en que las clientes del modelo anterior se conectaban de forma dinámica, es decir que no tenían una localización fija (IP). En las conexiones Sitio a Sitio, conectamos sitios previamente definidos como pudiera ser un la oficina central de una organización con sus sucursales. VPN Interna Este modelo basado en la implementación de la VPN sobre una red local, aunque no esta muy extendido tiene capacidades interesantes, ya que permite aislar zonas dentro de la red local, por ejemplo un servidor que contuviera información sensible, como nominas, etc. Actualmente este modelo esta comenzando a difundirse con la aparición de redes inalámbricas, para definir distintos niveles de acceso y aumentar la seguridad de las mismas. 1.2. Ventajas La principal ventaja que ha motivado la expansión de las redes privadas virtuales ha sido la reducción de costes. En el caso de las redes de acceso remoto en una primera etapa se vio con la reducción en el coste de las llamadas, convirtiéndose llamadas a larga distancia en llamadas locales al ISP y en la actualidad se ha reducido aun más con la aparición de tarifas planas y los nuevos servicios de banda ancha. También en el caso de la redes Sitio a Sitio, se han reducido los costes frente al uso de enlaces WAN dedicados a los servicios de Internet de banda ancha. Además de la reducción de costes esta tecnología también ha añadido otras mejoras como pueden ser el aumento de las capacidades de los enlaces en el caso de las conexiones de marcado frente al uso de banda ancha. El uso de redes VPN abre también las puertas a mejoras en otros campos como podrían ser el tele-trabajo o la tele-formación, puesto que un usuario puede tener a su alcance los mismos recursos en su hogar que en la red de área local. 2 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 1.3. Implementaciones En la actualidad podríamos clasificar las distintas implementaciones dentro de 3 categorías: Soluciones basadas en hardware, soluciones basadas en software y soluciones mixtas o basadas en firewall. Comentaremos brevemente las distintas implementaciones pero en nuestro caso nos centraremos en las aplicaciones VPN basadas en software. Las soluciones hardware tienen la ventaja de tener un mayor rendimiento y facilidad de configuración aunque no ofrece la flexibilidad de las implementaciones por software. Las soluciones por firewall añaden un nivel de seguridad superior aunque esto también produce una perdida de rendimiento, que muchas veces supone la inclusión de hardware adicional para soportar la carga de la VPN. Finalmente las aplicaciones VPN por software son las mas configurables, aunque tienen un rendimiento menor y una mayor dificultad de configuración puesto que a la seguridad de la VPN, se une la del sistema. En cuanto a implementaciones software encontramos soluciones que utilizan distintos protocolos: IPSec Es un estándar de la IETF que provee confidencialidad, integridad, autenticidad y protección, utilizando para ello dos protocolos Authentification Protocol (AH) y Encapsulated Security Payload (ESP). Actualmente hay varias implementaciones para la plataforma Linux que utilizan este estándar, entre ellas podríamos destacar FreeS/WAN que actualmente ha derivado en dos evoluciones distintas StrongSWAN y OpenSWAN. SSL/TLS El protocolo SSL/TLS permite la definición de canales seguros sobre TCP. El protocolo SSL está compuesto por dos capas, la primera capa (SSL Record Protocol), encapsula los protocolos de nivel mas alto y la segunda capa (SSL Handshake protocol) gestiona la negociación de los algoritmos de encriptación, y la autentificación entre el cliente y el servidor. Una vez terminada la autentificación, se establece el túnel y se pasa al control a la capa de aplicación. Una solución basada en este protocolo es OpenVPN que comentaremos mas tarde. L2TP El Layer-2 Tunneling Protocol es un protocolo utilizado para encapsular paquetes PPP a través de UDP. Este protocolo se encarga de la confidencialidad, autenticidad e integridad entre los extremos del túnel. PPTP Point to Point Tunneling Protocol originalmente desarrollado por 3com, Microsoft y US Robotics entre otros, nos permite encapsular cualquier protocolo de red en datagramas IP, basándose en el protocolo Generic Routing Encapsulation (GRE). Para la autentificación tenemos tres opciones. CHAP (Intercambia una clave que debe coincidir en ambos extremos), MS-CHAP (Extensión de Microsoft al protocolo CHAP) y PAP consistente en el envío de contraseñas sin encriptar. Para la encriptación PPTP utiliza RC4 de RSA con una clave de sesión de 40 bits. Este protocolo pese a ser muy flexible, flojea en cuanto a seguridad. Una implementación de este protocolo es el servidor PopTop. VPND Virtual Private Network Daemon (VPND). Crea un dispositivo serie virtual y usa encriptación Blowfish. 3 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 2. VPN Sitio a Sitio usando VPND VPND monta una interfaz virtual SLIP en la maquina local y añade hasta 9 rutas estáticas a hosts/redes a la interfaz, conectando al nodo remoto sobre TCP/IP. La transferencia se realiza en bloques de datos encriptados con Blowfish en modo CFB y usa un buffer de blanqueado circular de 256 bytes para dificultar ataques por fuerza bruta. La longitud de las claves usadas para la encriptación puede variar entre 0 y 576 bits, dependiendo de las necesidades del sistema. 2.1. Configuración Los pasos para montar una red virtual sobre este software no son excesivamente complejos tan solo requiere: • Activar el soporte SLIP en el kernel de LINUX ya sea estáticamente mediante la recompilación del propio kernel o mediante módulos cargados en el momento de la operación (slip.o, cslip.o). Para ello accederemos a la interface para la configuración del Kernel: > make menuconfig Una vez seleccionadas las opciones deseadas recompilaremos el Kernel mediante el siguiente conjunto de comandos y reiniciaremos: > > > > > make make make make init depmake clean bzlilo modules modules_install 6 • Tener instaladas versiones los paquetes zlib y zlib-devel posteriores a la 1.1.3. Aunque en la mayoría de las distribuciones de LINUX estos paquetes ya vienen instalados de serie, este paso lo podríamos considerar opcional en el caso de no utilizar la compresión de paquetes (añadiendo las líneas ‘nocompress’ y ‘nocslip’ al fichero de configuración vpnd.conf tanto en el cliente como el servidor). • Deberíamos también tener presente el dispositivo /dev/random o /dev/urandom. En el caso no tener el soporte activado en el kernel, podemos recompilar el kernel y activarlo o continuar sin el a costa del soporte para encriptación de datos. • Una vez realizada la preparación del sistema operativo podemos proceder a la instalación del paquete vpnd. En la actualidad esta instalación se puede realizar rapidamente mediante las utilidades graficas para la gestión de paquetes proporcionadas por las distribuciones de LINUX. • Finalizada la instalación procederemos a la creación de la clave de sesión utilizando la siguiente orden: > vpnd –m /etc/vpnd/vpnd.key 4 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla • Tras generar la clave esta debería ser pasada al otro extremo de la VPN, mediante un medio seguro ya que esta clave es compartida por ambos extremos. Una bueno opción para la transferencia de la clave podría ser el envío utilizando SSH. • Una vez transferida la clave tan solo queda la edición del archivo vpnd.conf tanto en el cliente como en el servidor, que comentaremos más adelante y el lanzamiento de los demonios tanto en la maquina servidor como en el cliente mediante la orden: > /etc/init.d/vpnd start 2.2. Configuración del servidor Archivo /etc/vpn/vpnd.conf para el servidor: mode server server a.b.c.d 2001 client w.x.y.z 2001 local a.b.c.d remote w.x.y.z # # # # Direccion Direccion Direccion Direccion IP IP IP IP y puerto del servidor y puerto del cliente privada del servidor privada del cliente IP IP IP IP y puerto del cliente y puerto del servidor privada del servidor privada del cliente # Opciones generales autoroute Keepalive 10 noanswer 3 keyfile /etc/vnpd/vnpd.key pidfile /var/run/vpnd.pid keyttl 120 ramdomdev /dev/urandom mtu 1600 suspend 240 sendbuf 3072 2.1. Configuración del cliente Archivo /etc/vpn/vpnd.conf para el cliente: mode client client w.x.y.z 2001 server a.b.c.d 2001 local w.x.y.z remote a.b.c.d # # # # Direccion Direccion Direccion Direccion # Opciones generales autoroute Keepalive 10 noanswer 3 keyfile /etc/vnpd/vnpd.key pidfile /var/run/vpnd.pid keyttl 120 ramdomdev /dev/urandom mtu 1600 5 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 2.5. Soporte en el servidor para varios clientes Inicialmente el VPND no incluye soporte para varios clientes pero este puede ser configurado lanzando varias instancias del mismo para ello podríamos utilizar un script similar al siguiente como sustituto de la llamada del demonio original. #################################### #(/etc/init.d/vpns) #################################### VPND=/usr/sbin/vpnd DESC="Virtual Private Network Daemon (MultiHost)" NAME=vpnd VPNPATH=/etc/vpnd/ HOSTPATH=/etc/vpnd/hosts/ test -f $VPND || exit 0 case "$1" in start) cd $HOSTPATH for nodo in *; do if [ ! -f $VPNPATH/vpnd-$nodo.key ] then echo "No se ha encontrado la clave vpnd.key para: $nodo" exit 0 fi echo -n "Starting $DESC: para $nodo " $VPND -f $VPNPATH/vpnd-$nodo.conf echo "vpnd-$nodo." done ;; stop) cd $HOSTPATH for nodo in *; do if [ ! -f $VPNPATH/vpnd-$nodo.key ] then echo "No se ha encontrado la clave vpnd.key para: $nodo" exit 0 fi echo -n "Stopping $DESC: para $nodo " kill -9 `cat /var/run/vpnd-$nodo.pid` echo "vpnd-$nodo." done ;; restart) sh /etc/init.d/vpns stop quiet sleep 3 /etc/init.d/vpns start ;; *) echo "Usage: /etc/init.d/$NAME {start|stop|restart}" exit 1 esac exit 0 6 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Además del script requiere unos pequeños cambios en la gestión del servidor que se resumen a continuación: • La creación de un archivo con el nombre del nodo en el directorio /etc/vpnd/hosts: > touch /etc/vpnd/hosts/XXX • Uso de archivos de configuración propios para cada host: > cp /etc/vpnd/vpnd.conf /etc/vpnd/vpnd-XXX.conf • Generación de claves propias para cada host: > vpnd –m /etc/vpnd/vpnd-XXX.key • O el uso de una clave común para todos los hosts: > cp /etc/vpnd/vpnd.key /etc/vpnd/vpnd-XXX.key También deberemos tener en cuenta de que cada host se conecte a través de un puerto distinto, puesto que si no tomamos esta precaución continuaremos teniendo el problema de que solo se puede conectar a un host dado que el puerto ya estará previamente reservado 2.6. Comprobación del funcionamiento de la VPN En caso de que la ejecución del demonio VPND fallara y nos reportara un error a continuación tenemos una guía de posibles fallos y causas. Crypto init failed, reason <TO BE ADDED LATER> El dispositivo /dev/random o /dev/urandom no esta presente, deberíamos activar el soporte para el generador de números aleatorios en el núcleo. Crypto init failed, reason 1 Ha habido un problema con el envío de la clave. Podría ser debido a que la clave no es la correcta, a una mala conexión TCP con pérdida de paquetes o simplemente a que los buffers de transmisión no han sido limpiados todavía. Slip link failed, reason 4 Significa que el la conexión ha fallado, esto indica que el cliente no puede conectar con el servidor (servidor caído) o que el servidor no puede crear el enlazar el socket del cliente (otro instancia de VPND se esta ejecutando en el mismo puerto). Este error también puede producirse si se utiliza la opción ‘suspend' y se ha iniciado una desconexión automática en el caso de conexiones dial up, esto indicaría que el soporte para SLIP o CSLIP no ha sido configurado correctamente. En caso de utilizar el soporte SLIP mediante módulos podemos comprobar si se han cargado correctamente con el comando ’lsmod’ 7 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Peer link failed, reason 105 Este error se debe a un fallo en la recepción de datos, normalmente es causado por una mala conexión TCP. Esto puede ser solucionado con las opciones ‘rxmax’ (aumentando el tiempo de retransmisión) y ‘sendbuf’ (aumentando el tamaño de buffer) en el archivo de configuración. Otra posible causa de este error seria la falta de la librería zlib que podría ser subsanada mediante la opción ‘nocompress’ (desactivando la compresión de datos). Peer link failed, reason 106 Este error se debe a un fallo en el envío de datos y tanto las causas como las soluciones son las mismas que en el caso del problema de recepción datos. Tras la ejecución sin mensajes de error de demonio comprobaremos que la interfaz SLIP haya sido creada y funcione correctamente para ello con la llamada a ‘ifconfig –a’ deberíamos obtener un resultado similar al siguiente: > ifconfig -a sl0 Link encap: VJ Serial Line IP Inet addr: 10.0.0.1 P-t-P: 10.0.0.2 Mask : 255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU: 1600 Metric: 1 Rx packets:0 errors: 0 dropped:0 overruns: 0 frame: 0 compressed: 0 Tx packets:0 errors: 0 dropped:0 overruns: 0 carrier: 0 collisions: 0 compressed: 0 txqueuelen: 10 RX bytes: 0 (0.0 b) TX bytes; 0 (0.0 b) Una vez comprobado el correcto funcionamiento de la interfaz SLIP, tan solo queda realizar alguna prueba mediante los comandos ‘ping’ y ‘traceroute’ a la IP virtual del host remoto, para ver si los paquetes llegan correctamente (ping) y si el enrutamiento también se realiza correctamente (traceroute). 2.7. Acceso a recursos desde Redes Windows Aunque VPND ha sido creado para trabajar en entornos Linux también cabe la posibilidad del acceso desde entornos de trabajo de Windows mediante el NETBIOS forwarding. Así podemos configurar un grupo de trabajo de Windows con un host Linux con acceso a la VPN para que poder acceder a recursos remotos de la VPN. El entorno de red de Microsoft se basa en una tecnología llamada NETBIOS sobre TCP/IP. Aunque esto funciona bien sobre una LAN debido a que se basa en difusiones, pero en redes WAN esto falla porque muchos routers no pueden redirigir las difusiones NETBIOS o existen fallos en las la traducción de direcciones de red (NAT). En el caso de poder acceder a la red utilizando UNC (\\servidor\recurso), pero las maquinas no son visibles desde el entorno de trabajo, son necesarias difusiones NETBIOS. Para ello se puede configurar la maquina Linux (con un kernel posterior a la versión 2.2.0) para que realice el NETBIOS forwarding. El siguiente paso seria modificación del código de Samba y su posterior recompilación para que acepte el soporte para NETBIOS forwarding. El código fuente de Samba lo podemos obtener en http://www.samba.org y el parche nbfw para Samba 2.0.x en la siguiente dirección: http://malt-whisky.student.utwente.nl/nbfw/download.html 8 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Una vez descargados los ficheros necesarios procederemos al parcheado y recompilación: cd /usr/src/samba-2.0.x/source patch -p0 < /tmp/nbfw-0.28/nbfw.diff ./configure make make install Una vez compilado Samba con soporte para NETBIOS forwarding necesitamos modificar /etc/smb.conf con especial atención a las líneas en negrita creándolas si no estuvieran presentes. [global] workgroup = DOMINIO server string = Samba Server share modes = yes interfaces = 10.0.0.1/24 192.168.1.1/24 nbfw backend hosts = 10.0.0.1 192.168.1.3 nbfw deny hosts = nbfw netbios names = "DOMINIO" MAQUINA1 MAQUINA2 encrypt passwords = yes name resolve order = lmhosts bcast Finalmente solo queda modificar un par de líneas en /etc/init.d/samba para que reconozca el soporte para NETBIOS forwarding: start-stop-daemon --start --quiet --exec /usr/sbin/nmbdnbfw -- -D -a start-stop-daemon --start --quiet --exec /usr/sbin/smbdnbfw -- -D 9 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 3. VPN de acceso remoto usando OpenVPN 2.x 3.1. Instalación Para la instalación de OpenVPN deberemos cumplir los siguientes requisitos: Una versión del kernel de Linux posterior a la 2.2.0 El controlador TUN/TAP instalado para permitir a los programas del espacio de usuario controlar un dispositivo IP punto-a-punto (TUN) o Ethernet virtual (TAP). La librería OpenSSL versión 0.9.5 o superior, necesaria para poder compilar con el soporte el soporte para encriptación activado. Disponible en: http://www.openssl.org/ La librería de compresión en tiempo real LZO, para el soporte de paquetes comprimidos, disponible en: http://www.oberhumer.com/opensource/lzo/ La librería Pthread para reducir el tiempo de latencia en las negociaciones SSL/TLS. Instalación del Controlador TUN/TAP En caso de tener una versión del kernel de Linux 2.2, deberíamos descargar la versión 1.1 del controlador TUN/TAP disponible en http://vtun.sourceforge.net/tun/ . En caso de tener una versión 2.4 o posterior, no será necesario. Para la instalación del controlador seguiremos los siguientes pasos: Crearemos un nodo para el dispositivo mknod /dev/net/tun c 10 200 Añadiremos la siguiente línea a /etc/modules.conf: alias char-major-10-200 tun Cargaremos el controlador modprobe tun Finalmente activaremos el enrutado: echo 1 > /proc/sys/net/ipv4/ip_forward Instalación de OpenVPN Una vez instalado el controlador TUN/TAP y las librerías auxiliares procederemos con la instalación de OpenVPN. En primer lugar nos descargaremos la aplicación desde la pagina la pagina oficial: http://openvpn.sourceforge.net/ Descomprimiremos el paquete tar -zxf openvpn-2.0_rc1.tar.gz Y procederemos a la instalación propiamente dicha: ./configure make make install 10 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Comprobaciones del correcto funcionamiento de OpenVPN Pruebas de criptográficas: ./openvpn --genkey --secret key ./openvpn --test-crypto --secret key Pruebas de negociación SSL/TLS (Ejecutar en dos terminales distintas durante 2 minutos): ./openvpn --config sample-config-files/loopback-client ./openvpn --config sample-config-files/loopback-server 3.2. Configuración de OpenVPN utilizando una clave estática Una vez instalado OpenVPN el metodo mas simple para montar la red privada virtual, es utilizando una clave estatica compartida entre el cliente y el servidor. Para ello en primer lugar generaremos la clave utilizando el siguiente comando: openvpn --genkey --secret static.key La clave estatica generada tendra un formato similar siguiente y debera ser distribuida al cliente mediante un metodo: -----BEGIN OpenVPN Static key V1----e5e4d6af39289d53 171ecc237a8f996a 97743d146661405e c724d5913c550a0c 30a48e52dfbeceb6 e2e7bd4a8357df78 4609fe35bbe99c32 bdf974952ade8fb9 71c204aaf4f256ba eeda7aed4822ff98 fd66da2efa9bf8c5 e70996353e0f96a9 c94c9f9afb17637b 283da25cc99b37bf 6f7e15b38aedc3e8 e6adb40fca5c5463 -----END OpenVPN Static key V1----Configuración del Servidor OpenVPN Ahora deberemos crear un archivo de configuración para el servidor OpenVPN. Para evitar problemas con las rutas en nuestro caso hemos preferido que el propio servidor se encargue de pasar la configuración de las rutas al cliente mediante el comando push del archivo de configuración. El comando push envia ordenes al cliente que se ejecutaran tras la orden pull del archivo de comunicación, otra posibilidad seria pasar un script con los comando de enrutado y añadir una linea up <script> en el archivo de configuración del cliente. A continuación podemos ver un ejemplo de nuestra elección: 11 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla # openvpn-server.conf # Modo Tunnel dev tun # Ejecutar en modo servidor mode server # Dirección IP del servidor y del punto de enlace (Gateway) ifconfig 10.1.0.1 10.1.0.2 # Rango de direcciones IP reservadas para los clientes ifconfig-pool 10.1.0.4 10.1.0.254 # Configuración de rutas para en el servidor route 10.1.0.0 255.255.255.0 # Comando route enviado al cliente push "route 10.1.0.1 255.255.255.255" # Archivo con la clave compartida secret static.key Una vez tenemos el archivo de configuración del servidor podremos poner en marcha el servidor usando el siguiente comando: openvpn --config openvpn-server.conf Configuración del Cliente El cliente OpenVPN necesitara tambien un archivo de configuración similar al siguiente, que el servidor le transferira por un medio seguro junto con la clave compartida. Aquí podemos ver un ejemplo de configuración: # openvpn-client.conf # Modo tunel dev tun # Dirección del servidor remote vpn.myservidor.com # Clave Privada del cliente secret static.key # Obtener el resto de parámetros desde el servidor pull Tras obtener ambos archivos y poner el marcha el servidor el cliente se puede poner en funcionamiento mediante el siguiente comando, aunque mas adelante podremos ver métodos mas sofisticados de inicialización: openvpn --config openvpn-client.conf 12 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 3.3. Implantación de una infraestructura de clave pública sobre la VPN En primer lugar deberemos configurar OpenSSL (La librería criptográfica sobre la que se apoya OpenVPN) para que actué como Autoridad Certificadora raíz creando un certificado autofirmado sobre toda jerarquía de autentificación. Entonces crearemos peticiones de certificado de los clientes y los certificados de edición actuales. El siguiente paso será utilizar entorno de pruebas de OpenSSL para comprobar que todo funciona correctamente y pasaremos a la configuración del cliente y servidor de OpenVPN. Finalmente generando una lista de revocación de certificados (CRL) revocando un certificado de un usuario, generando la lista que contendrá el certificado revocado y finalizando el acceso del usuario a la VPN. Configuración de OpenSSL Para la configuración de OpenSSL deberemos de editar el archivo /etc/openssl.cnf, a continuación podemos ver una posible configuración comentada que podría ser utilizada para nuestros fines: # openssl.cnf ############################################################ # Configuración Autoridad Certificadora (CA) ############################################################ [ ca ] default_ca = CA_default [ CA_default ] dir crl_dir database new_certs_dir certificate serial crl unique_subject = = = = = = = = /root/CA-DB $dir/crl $dir/index.txt $dir/newcerts $dir/cacert.pem $dir/serial $dir/crl.pem yes # # # # # # # Directorio Base Dir. CRL Indice de la BBDD Dir. Nuevos certificados Certificado Raiz Siguiente ID certificado CRL actual # Clave privada de la CA private_key = $dir/private/cakey.pem # Archivo de números aleatorios RANDFILE = $dir/private/.rand # Duracion de los certificados default_days = 365 default_crl_days= 30 # Función Hashing default_md = md5 x509_extensions = user_extensions 13 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla # Politicas de administración policy = policy_any [ policy_any ] organizationName organizationalUnitName commonName = match = optional = supplied ############################################################ # Configuración de las peticiones de certificados ############################################################ [ req ] # Longitud y archivo de la clave privada default_bits = 1024 default_keyfile = privkey.pem distinguished_name = req_distinguished_name # Información sobre nuestro certificado [ req_distinguished_name ] organizationName organizationName_default = Nombre de la Organización = Nombre de la Organización organizationalUnitName = Departamento commonName commonName_max = Nombre del administrador = 64 # Certificados autofirmados x509_extensions = CA_extensions [ user_extensions ] # No permitimos nuestros certificados firmen otros certificados basicConstraints = CA:FALSE [ CA_extensions ] # Permitimos que el certificado raiz firme otros certificados basicConstraints = CA:TRUE Creación de una autoridad certificadora raíz (CA) En primer lugar deberemos crear la estructura de directorios para el almacén de certificados, en concordancia al archivo de configuración openssl.conf: mkdir CA-DB cd CA-DB mkdir crl mkdir newcerts mkdir private 14 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Tras ello procederemos la inicialización de los identificadores de certificados y a la creación del archivo de índices: echo "01" > serial touch index.txt Una vez creada la estructura de directorios, crearemos nuestro certificado raíz autofirmado, que servirá como base para el resto de certificados, la opción –x509 creara un certificado autofirmado en vez de una petición de certificado: openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem Creación de Certificados de Usuario En primer lugar crearemos un certificado para el servidor OpenVPN que será utilizado para el inicio automático del servicio: openssl req -new -nodes –keyout vpnkey.pem -out vpncert-req.pem Tras ello firmaremos digitalmente el certificado creado inicialmente y el propio OpenSSL actualizará automaticamente la base de datos de certificados: openssl ca -out vpncert.pem -in vpncert-req.pem Una vez finalizada la creación del certificado del servidor podemos proceder a la creación de certificados para los clientes de la siguiente forma: openssl req –new –keyout client1key.pem -out client1cert-req.pem openssl ca -out client1cert.pem -in client1cert-req.pem Configuración del Servidor OpenVPN Tras la creación de la infraestructura de certificados y haberla probados con certificados de nuestro servidor y clientes, pasaremos a la configuración del servidor. OpenVPN utiliza un protocolo de seguridad llamado Diffie-Hellman (RFC 2631) para negociar la autentificación. Para facilitar su uso generaremos un archivo de configuración para este llamado dh1024.pem como sigue: openssl dhparam -out dh1024.pem 1024 Ahora deberemos crear un archivo de configuración para el servidor OpenVPN. A continuación podemos ver un ejemplo: # openvpn-server.conf # Modo Tunnel dev tun # Ejecutar en modo servidor mode server # Dirección IP del servidor y del punto de enlace (Gateway) ifconfig 10.1.0.1 10.1.0.2 # Rango de direcciones IP reservadas para los clientes ifconfig-pool 10.1.0.4 10.1.0.254 15 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla # Configuración de rutas para en el servidor route 10.1.0.0 255.255.255.0 # Comando route enviado al cliente push "route 10.1.0.1 255.255.255.255" # Servidor TLS para el intercambio de certificados tls-server # Parámetros para el algoritmo Diffie-Hellman dh dh1024.pem # Certificado Raiz ca CA-DB/cacert.pem # Certificado del Servidor cert vpncert.pem # Clave Privada del Servidor key vpnkey.pem # Comprobación de certificados de cliente revocados crl-verify CA-DB/crl/crl.pem Tras terminar con la configuración de OpenVPN, necesitaremos inicializar una lista de revocación de certificados. Simplemente llamaremos a la autoridad certificadora (CA) para que nos genere uno: openssl ca -gencrl -out > CA-DB/crl/crl.pem Finalmente una vez tenemos el archivo de configuración del servidor y creada la lista de revocación de certificados podremos proceder a su puesta en marcha mediante el siguiente comando: openvpn --config openvpn-server.conf Configuración del Cliente Los pasos de instalación de OpenVPN en el cliente son similares a los del servidor, tan solo deberemos crear un archivo de configuración para el cliente: # openvpn-client.conf # Modo tunel dev tun # Dirección del servidor remote vpn.myservidor.com # Cliente TLS para el intercambio de certificados tls-client # Archivo de la autoridad certificadora (CA) ca cacert.pem # Certificado/Clave Publica del cliente cert client1cert.pem 16 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla # Clave Privada del cliente key client1key.pem # Obtener el resto de parámetros desde el servidor pull Tras la instalación del cliente deberemos distribuir usando un medio seguro estos archivos al cliente, necesarios para la autentificación: La clave privada del usuario (client1key.pem). El certificado o clave publica del cliente (client1cert.pem) Una copia de la autoridad certificadora raíz (cacert.pem) El archivo de configuración del cliente. Una vez este conjunto se halle en posesión del cliente procederemos a la ejecución del cliente: openvpn --config openvpn-client.conf Comprobando el acceso de clientes a la CRL El último paso a realizar es evitar el acceso de usuarios no autorizados a nuestra VPN. Para ello revocaremos los certificados y actualizaremos la lista de certificados revocados (CRL). Para saber que certificado pertenece a cada cliente usaremos el archivo index.txt presente en el directorio de certificados y buscaremos la entrada en la que el atributo commonName coincida con el certificado a revocar (Identificador que asigna la autoridad certificadora al certificado). Tras obtener el identificador, podemos localizar el certificado en newcerts en el directorio de certificados observando el nombre de archivo. A continuación tenemos un ejemplo de revocación de un certificado para usuario2. Hemos buscado en index.txt y observamos que tiene el identificador 03 en commonName. Entonces sabemos que su certificado esta en newcerts/04.pem. Asi que procederemos a su revocación: openssl ca -revoke > CA-DB/newcerts/04.pem Este comando revocará el certificado y actualizara index.txt. Ahora necesitaremos generar una nueva lista (CRL) que contenga este nuevo certificado para que OpenVPN reconozca la revocación: openssl ca -gencrl -out CA-DB/crl/crl.pem 3.4. Ejecución de OpenVPN como un servicio de INETD Para la ejecución del servidor OpenVPN como un servicio debemos crear el archivo /etc/xinetd.d/openvpn siguiente contenido: service openvpn { type port socket_type protocol wait user server server_args disable } = = = = = = = = = UNLISTED 1194 dgram udp yes root /root/openvpn/openvpn --inetd –-config /root/openvpn/openvpn-server.conf yes 17 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 3.5. Ejecución de OpenVPN como un Demonio Para la ejecución de OpenVPN utilizaremos uno de los scripts de ejemplo proporcionado con OpenVPN. El script lo podemos encontrar en sample-scripts/openvpn.init y para su instalación seguiremos los siguientes pasos: Desde el directorio de openvpn ejecutaremos para copiar el script al directorio de ejecución: cp sample-scripts/openvpn.init /etc/rc.d/init.d/openvpn Una vez copiado prepararemos el sistema para que arranque automáticamente el demonio: chkconfig –-add openvpn Y finalmente crearemos el directorio /etc/openvpn y añadiremos a este un archivo <conexion>.conf y otro <conexion>.sh para cada una de las conexiones. El .conf se encargará de guardar la configuración de la conexión mientras que el .sh si esta presente incluira aquellos comandos que pretendamos ejectuar antes de la ejecución de openvpn. 18 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 4. VPN de acceso remoto usando StrongSWAN 2.x 4.1. Instalación Para la instalación de OpenVPN deberemos cumplir los siguientes requisitos: Una versión del kernel de Linux posterior a la 2.4 La librería GNU Multiprecision Arithmetic (GMP) disponible en la siguiente dirección: http://www.swox.com/gmp/. En caso de que quisiéramos obtener dinámicamente listas de revocación de certificados (CRLs) desde un servidor HTTP o usar el protocolo Online Certificate Status Protocol (OCSP), necesitaremos la librería libcurl disponible en la siguiente dirección: http://curl.haxx.se . También deberemos quitar el comentario en esta línea de ‘programs/pluto/Makefile’: # Uncomment this line to enable CRL fetching using HTTP LIBCURL=1 Si además queremos obtener dinámicamente listas de revocación de certificados (CRLs) desde un servidor LDAP, necesitamos la librería libldap que podemos conseguir en http://www.openldap.org/ y quitar el comentario en una de estas líneas del Makefile dependiendo de la versión de LDAP que pretendamos usar: # Uncomment to enable dynamic CRL fetching using LDAP V3 LDAP_VERSION=3 # Uncomment to enable dynamic CRL fetching using LDAP V2 #LDAP_VERSION=2 Si queremos también almacenar los certificados X.509 y claves privadas RSA en una SmartCard o en una llave USB necesitamos la librería OpenSC 0.8.0 o superior disponible en: http://www.opensc.org/ y quitar el comentario en la siguiente línea del Makefile: #Uncomment this line to enable smartcard support SMARTCARD=1 Instalación de StrongSwan en Linux Kernel 2.4 Para la compilación de StrongSwan con un el kernel 2.4 de Linux 2.4, necesitamos la presencia de un enlace simbólico referenciado via /usr/src/linux. Antes compilar StrongSwan debemos haber compilado el núcleo al menos una vez con los siguientes comandos: make make make make menuconfig; dep; bzImage; modules Ir al directorio del código de strongswan-2.x.x . En primer lugar debemos quitar el comentario a las opciones de compilación deseadas en ./programs/pluto/Makefile" Ahora procederemos a la configuración desde el menú: 19 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla make menumod Este comando aplica un parche de encapsulación ESP_IN_UDP a las fuentes del núcleo requerido para NAT-Traversal. En el menú "Networking options" debemos activar la siguiente línea para compilar KLIPS como un modulo "ipsec.o". <M> IP Security Protocol (strongSwan IPsec) Una vez modificada la configuración debemos guardar los cambias antes de abandonar "menumod". Las utilidades de StrongSwan serán automáticamente compiladas e instaladas, junto al modulo ipsec.o y los módulos de criptografía con el comando: make minstall En caso de querer usar NAT-Traversal debemos compilar otra vez el núcleo parcheado ejecutando: make bzImage y entonces instalar y arrancar el kernel modificado. Añadir las conexiones a "/etc/ipsec.conf" y iniciar strongSwan con ipsec setup start Actualización de StrongSwan en Linux Kernel 2.4 En caso de que quisiéramos actualizar una versión de StrongSwan ya instalada deberíamos proceder de la siguiente manera: Ir al directorio del código de strongswan-2.x.x . En primer lugar debemos quitar el comentario a las opciones de compilación deseadas en ./programs/pluto/Makefile" Ahora procederemos a la compilación e instalación: make programs; make install make module; make minstall Finalmente solo queda añadir las conexiones a "/etc/ipsec.conf" y iniciar strongSwan con: ipsec setup start 20 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Instalación de StrongSwan en Linux Kernel 2.6 La versión 2.6 del kernel de Linux, ya lleva incorporado soporte nativo para la pila de protocolos IPsec, tan solo hay que asegurarse que los siguientes módulos están disponibles mediante el comando lsmod y en caso de que no estuvieran instalados instalarlos con modprobe y el nombre del modulo: af_key ah4 esp4 ipcomp xfrm_user También deberían estar disponibles los módulos de CryptoAPI con la encriptación y los algoritmos hash. Ir al directorio del código de strongswan-2.x.x . En primer lugar debemos quitar el comentario a las opciones de compilación deseadas en ./programs/pluto/Makefile" Ahora procederemos a la compilación e instalación: make programs make install Finalmente solo queda añadir las conexiones a "/etc/ipsec.conf" y iniciar strongSwan con: ipsec setup start 4.2. Configuración de StrongSwan utilizando una clave estática Una vez tenemos completamente instalado StrongSwan y hayamos decidido usar un sistema de clave estatica compartida, en primer lugar deberemos generar una clave publica para el host local. Para ello utilizaremos el siguiente comando, pudiendo especificicar el numero de bits de la clave que por defecto sera 2192: ipsec newhostkey --output archivo [--bits n ] Esta clave la añadiremos posteriormente al archivo de configuración en la opción leftrsasigkey, en caso de ya tener una clave pública generada podemos verla con el comando: ipsec showhostkey --left Obteniendo una salida similar a la siguiente: # RSA 2048 bits localhost leftrsasigkey=0sAQPkI9p... Mon Jan 3 17:05:41 2005 21 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Tras obtener la clave publica local, procederemos a obtener la clave del host remoto, esta puede ser enviada por un método seguro por el administrador del host o la podemos obtener si tenemos permisos mediante una consola remota SSH, procediendo de forma similar: ssh2 servremoto.com ipsec showhostkey --right Obteniendo la linea que deberemos añadir a nuestro archivo de configuración: # RSA 2048 bits localhost rightrsasigkey=0sAQOpKcW... Mon Jan 3 17:25:41 2005 Tras tener ambas contraseñas tan solo debemos editar el archivo de configuración para añadir la conexión: /etc/ipsec.conf: conn net2net left=%defaultroute leftcert=norteCert.pem leftsubnet=10.0.1.0/24 leftrsasigkey=0sAQPkI9p... right=55.66.77.88 rightsubnet=10.0.2.0/24 rightrsasigkey=0sAQOpKcW... auto=start # # # # # Red local A Clave publica local Servidor B Red local B Clave publica remota Finalmente activaremos la conexión mediante el comando que tenemos a continuación y si todo ha funcionado correctamente obtendremos entre los mensajes IPsec SA established: ipsec auto --up net2net Si la conexión se ha establecido tambien podriamos realizar alguna que otra prueba haciendo ping a equipos de la red remota o con el comando tcpdump para comprobar el tráfico de paquetes. 4.3. Implantación de una infraestructura de clave pública sobre la VPN Para implantar la infraestructura de certificados sobre StrongSwan, necesitaremos también de OpenSSL, procediendo de una manera similar a OpenVPN (Ver Apartado 2.3): Configuración de OpenSSL Creación de una autoridad certificadora raíz (CA) Creación de Certificados de Usuario Las únicas diferencias en la configuración de OpenSSL, vendrán marcadas por los directorios que deberán ajustarse a IPSec: dir crl_dir database new_certs_dir serial certificate crl = = = = = = = /etc/ipsec.d /etc/ipsec.d/crls $dir/certs/index.txt $dir/certs/newcerts # $dir/certs/serial # $dir/cacerts/cacert.pem $crl_dir/crl.pem 22 # Directorio Base # Dir. CRL # Indice de la BBDD Dir. Nuevos certificados Siguiente ID certificado # Certificado Raiz # CRL actual Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 4.4. Adaptación a distintas arquitecturas VPN Sitio a Sitio En este modelo conectaremos dos subredes conectadas a través de una puerta de accesos mediante un túnel: Configuración para el host en la red A (Norte): /etc/ipsec.d/cacerts/caCert.pem /etc/ipsec.d/certs/norteCert.pem /etc/ipsec.secrets: : RSA norteKey.pem “<password opcional>“ /etc/ipsec.conf: conn net2net left=%defaultroute leftcert=norteCert.pem leftsubnet=10.0.1.0/24 # Red local A right=55.66.77.88 # Servidor B rightsubnet=10.0.2.0/24 # Red local B rightid="C=ES, O=VPN, CN=sur.myservidor.com" rightrsasigkey=%cert auto=start Configuración para el host en la red B (Sur): /etc/ipsec.d/cacerts/caCert.pem /etc/ipsec.d/certs/surCert.pem /etc/ipsec.secrets: : RSA surKey.pem “<password opcional>“ /etc/ipsec.conf: conn net2net left=%defaultroute leftcert=surCert.pem leftsubnet=10.0.2.0/24 # Red local B right=11.22.33.44 # Servidor A rightsubnet=10.0.1.0/24 # Red local A rightid="C=ES, O=VPN, CN=norte.myservidor.com" rightrsasigkey=%cert auto=start En caso de conectar dos ordenadores independientes utilizando esta configuración tan solo deberemos comentar las líneas rightsubnet y leftsubnet de ipsec.conf. Acceso Remoto En este modelo tenemos un servidor que da acceso a un número indeterminado de clientes VPN con IP dinámicas. Una de las mayores diferencias con el modelo anterior es que ambas maquinas iniciaban la conexión, mientras que en este el servidor autoriza las conexiones, pero las tiene que iniciar el cliente: 23 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla Configuración en el servidor: /etc/ipsec.d/cacerts/caCert.pem /etc/ipsec.d/certs/serverCert.pem /etc/ipsec.secrets: : RSA serverKey.pem “<password opcional>“ /etc/ipsec.conf: conn rw left=%defaultroute leftsubnet=10.0.1.0/24 leftcert=serverCert.pem right=%any rightrsasigkey=%cert auto=add # Red local A # Autoriza una conexión Configuración los clientes: /etc/ipsec.d/cacerts/caCert.pem /etc/ipsec.d/certs/clientCert.pem /etc/ipsec.secrets: : RSA clientKey.pem “<password opcional>“ /etc/ipsec.conf: conn client left=%defaultroute leftcert=clientCert.pem right=11.22.33.44 # Servidor A rightsubnet=10.0.1.0/24 # Red local A rightid="C=ES, O=VPN, CN=vpn.myservidor.com" rightrsasigkey=%cert auto=start También podríamos asignar una dirección IP virtual al cliente dentro de la VPN, para ello deberíamos añadir la siguiente línea a ipsec.conf del servidor en la conexión correspondiente: rightsubnetwithin=10.0.3.0/24 Y esta otra en el archivo ipsec.conf del cliente: leftsourceip=10.0.3.1 24 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 4.5. Acceso desde un cliente Windows 2000/XP Instalación y configuración (Windows 2000/XP) Windows 2000 y XP tienen el cliente L2TP/IPsec instalado por defecto, aunque seria interesante que tuvierán instaladas todas las actualizaciones disponibles hasta el momento. Para evitar que el cliente VPN de Windows, no intente configurar una conexión L2TP en vez de la conexión IPSec, deberemos modificar el registro de Windows, creando un archivo como el siguiente con el nombre IPsec.reg y añadiendolo al registro: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters] “ProhibitIpSec”=dword:00000000 En Windows XP podemos tener problemas con el cortafuegos incluido en Windows (ICF), para evitarlo deberiamos abrir loa puertos UDP 500 y 4500. Este problema no se presenta si tenemos instalado el Service Pack 2, debido a que incluye un cortafuegos diferente. Configuración de una conexión con clave estatica bajo Windows XP Para la configuración de un a conexión L2TP/IPSec con clave estatica, bajo Window XP seguiremos los siguientes pasos: Iniciaremos el Asistente para una nueva conexión. ( Inicio -> Programas -> Accesorios -> Comunicaciones) Pulsaremos Siguiente. Seleccionaremos Conectarse a la red de mi lugar de trabajo. Seleccionaremos Conexión de red privada virtual. Introduciremos un nombre para la conexión. Seleccionaremos la conexión a Internet que queremos usar y si nos queremos conectar automáticamente. Introduciremos la dirección IP del servidor al que nos conectaremos y finalizaremos el asistente. Iremos a la nueva conexión que hemos creado y pulsaremos el boton derecho del ratón y seleccionaremos Propiedades Podemos comprobar si hemos cometido algun error introduciendo los datos en la pestaña General. Seleccionaremos la pestaña Seguridad y desactivaremos la encriptación L2TP/PPP desmarcando la casilla Requerir cifrado de datos o si deseamos mayor seguridad marcando Avanzada (configuración personalizada) y pulsando el botón Configuración… entraremos en un nuevo cuadro de dialogo donde marcaremos la casilla de Protocolo de desafio mutuo (CHAP) y en Cifrado de Datos selecciónaremos Cifrado opcional y pulsaremos Aceptar. Una vez hecho esto pulsaremos el boton Configuración IPSec… de la pestaña Seguridad y marcaremos la casilla Usar clave previamente compartida al autentificar e introduciremos la clave asociada al cliente en el archivo /etc/ipsec.secrets del servidor y pulsaremos Aceptar. Tras esto iremos a la pestaña Funciones de red y cambiaremos el tipo de red privada virtual a Red Privada Virtual con L2TP/IPSec. Finalmente procederemos a la conexión haciendo doble clic en el icono de la conexión. Añadiremos el nombre de usuario y el password y pulsaremos Conectar. Tras seguir estos pasos deberiamos tener en marcha la conexión You should successively get an IPsec connection, L2TP connection and then a PPP connection. Para comprobar el correcto funcionamiento podemos ver en el servidor Linux /var/log/secure y /var/log/messages si se ha producido algun error. Si todo funciona correctamente, podriamos mejorar la seguridad de la conexión añadiendo soporte para certificados. 25 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 4.6. Consideraciones sobre StrongSWAN StrongSWAN 2.2 esta basado en FreeSWAN 2.0.4 con algunas mejoras en la configuración y el soporte para certificados X.509. He decidido incluir esta implementación debido a que el desarrollo del proyecto FreeSWAN ha sido descontinuado y a alguna restricción en cuanto a la exportación de métodos de cifrado de este. La configuración de FreeSWAN es prácticamente similar, las unicas variaciones pueden venir en el procedimiento de instalación. Algunas distribuciones de Linux (por ejemplo: Suse 8.2) incluyen FreeSWAN y lo instalan por defecto, en estas distribuciones la instalación de StrongSWAN puede llevar problemas si no se elimina previamente FreeSWAN, por lo que recomendaria utilizar la versión de FreeSWAN de la distribución o una actualización de la misma. 26 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 5. Seguridad 5.1. Cortafuegos Las soluciones que hemos tratado en los puntos anteriores también se pueden se pueden utilizar en combinación de un cortafuegos para restringir los accesos a los distintos servicios. A continuación hay varios scripts con ejemplos de configuraciones del cortafuegos incluido en las versiones 2.4 y 2.6 del núcleo de Linux. Este script ha sido diseñado para permitir tan solo los servicios de Correo, Web, SSH y Telnet en una red virtual basada en OpenVPN/VPND. El propósito es servir de guía para la construcción de cortafuegos dependiendo de las necesidades, actualmente las distribuciones de Linux incluyen distintas utilidades graficas que facilitan esta tarea. También podría ser un buen punto de partida para utilizar con StrongSWAN u otra solución IPSec pues aunque la propia pila de protocolos IPSec proporciona mecanismos de seguridad para el bloque de conexiones, las últimas líneas serian necesarias para el uso del enmascaramiento IP y NAT (Traducción de Direcciones de Red). /etc/rc.d/init.d/firewall.vpn: #!/bin/bash LOCAL_IFACE="eth1" INET_IFACE="eth0" # Conexión a la red local # Conexión a Internet PRIVATE=10.0.0.0/24 # Mascara de la red local del servidor # Dirección Loopback LOOP=127.0.0.1 # Borrar iptables iptables iptables iptables reglas antiguas y bloquear todo el tráfico -F -P OUTPUT DROP -P INPUT DROP -P FORWARD DROP # Registramos los paquetes antes de bloquearlos iptables iptables iptables iptables -X -N -A -A # Politicas iptables -P iptables -P iptables -P # Evitar iptables iptables iptables iptables LOG_DROP LOG_DROP LOG_DROP -j LOG --log-prefix "drop " LOG_DROP -j DROP predeterminadas OUTPUT ACCEPT INPUT LOG_DROP FORWARD LOG_DROP que los paquetes externos utilicen la interface loopback -A INPUT -i $INET_IFACE -s $LOOP -j LOG_DROP -A FORWARD -i $INET_IFACE -s $LOOP -j LOG_DROP -A INPUT -i $INET_IFACE -d $LOOP -j LOG_DROP -A FORWARD -i $INET_IFACE -d $LOOP -j LOG_DROP # Eliminamos los paquetes de clases de direcciones reservadas iptables iptables iptables iptables iptables iptables -A -A -A -A -A -A FORWARD -i $INET_IFACE -s 192.168.0.0/16 -j LOG_DROP FORWARD -i $INET_IFACE -s 172.16.0.0/12 -j LOG_DROP FORWARD -i $INET_IFACE -s 10.0.0.0/8 -j LOG_DROP INPUT -i $INET_IFACE -s 192.168.0.0/16 -j LOG_DROP INPUT -i $INET_IFACE -s 172.16.0.0/12 -j LOG_DROP INPUT -i $INET_IFACE -s 10.0.0.0/8 -j LOG_DROP 27 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla # Bloquear el trafico NetBios saliente hacia Internet iptables iptables iptables iptables -A -A -A -A FORWARD -p tcp --sport 137:139 -o $INET_IFACE -j LOG_DROP FORWARD -p udp --sport 137:139 -o $INET_IFACE -j LOG_DROP OUTPUT -p tcp --sport 137:139 -o $INET_IFACE -j LOG_DROP OUTPUT -p udp --sport 137:139 -o $INET_IFACE -j LOG_DROP # Validación de la dirección origen de los paquetes salientes iptables -A FORWARD -s ! $PRIVATE -i $LOCAL_IFACE -j LOG_DROP # Permitir accesos locales a la interface loopback iptables -A INPUT -s $LOOP -j ACCEPT iptables -A INPUT -d $LOOP -j ACCEPT # ICMP aceptados (pueden ser desactivados según necesidades de seguridad) iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # Permitir servicios de Correo, Web, DNS y SSH iptables iptables iptables iptables iptables iptables -A -A -A -A -A -A INPUT INPUT INPUT INPUT INPUT INPUT -p -p -p -p -p -p tcp tcp tcp tcp udp tcp --dport --dport --dport --dport --dport --dport http -j ACCEPT https -j ACCEPT ssh -j ACCEPT smtp -j ACCEPT domain -j ACCEPT domain -j ACCEPT ####################################################### # PARAMETROS EXCLUSIVOS OPENVPN ####################################################### # Permitir paquetes entrantes desde el túnel OpenVPN iptables -A INPUT -p udp --dport 1194 -j ACCEPT # Permitir paquetes desde los dispositivos TUN/TAP iptables -A INPUT -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -j ACCEPT iptables -A INPUT -i tap+ -j ACCEPT iptables -A FORWARD -i tap+ -j ACCEPT ####################################################### # PARAMETROS EXCLUSIVOS VPND ####################################################### # iptables -A INPUT -i sl+ -j ACCEPT # iptables -A FORWARD -i sl+ -j ACCEPT ####################################################### # Permitir paquetes desde la red privada iptables -A INPUT -i $LOCAL_IFACE -j ACCEPT iptables -A FORWARD -i $LOCAL_IFACE -j ACCEPT # Mantener estado de las conexiones desde la red local iptables iptables iptables iptables -A -A -A -A OUTPUT -m state --state NEW -o $INET_IFACE -j ACCEPT INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT FORWARD -m state --state NEW -o $INET_IFACE -j ACCEPT FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Enmascarar la red local iptables -t nat -A POSTROUTING -s $PRIVATE -o $INET_IFACE -j MASQUERADE 28 Implementación de una Red Privada Virtual en Linux 5.2. Francisco R. Santonja Rodilla Distribución de configuraciones y claves Las redes privadas virtuales tanto basadas en clave estatica compartida, como en certificados necesitan un método seguro para la distribución de los archivos de claves y los archivos de configuración. La distribución mediante entrega fisica muchas veces no es posible debido a la distancia, asi que deberemos de recurrir a algu método que nos permita un canal de distribución seguro atraves de Internet. Una opción podria ser el uso de SSH: En un sistema basado en certificados deberemos transferir los siguientes archivos: La clave privada del usuario (client1key.pem). El certificado o clave publica del cliente (client1cert.pem) Una copia de la autoridad certificadora raíz (cacert.pem) El archivo de configuración del cliente. Mientras que en un sistema basado en clave compartida tan solo deberemos transferir: El archivo que contenga la clave compartida El archivo de configuración del cliente. A continuación podemos ver como transferir el archivo de configuración de StrongSwan atraves del comando de copia de SSH, pudiendo proceder con el resto de igual forma: scp2 /etc/ipsec.conf [email protected]:/etc/ipsec.conf 29 Implementación de una Red Privada Virtual en Linux Francisco R. Santonja Rodilla 6. Bibliografía Scott Brumbaugh: "Deploying a VPN with PKI", O'Relly Network, Octubre 2004 James Yonan: "Installation instructions for OpenVPN, a Secure Tunneling Daemon", 2004 Matthew D. Wilson: "VPN HOWTO", Diciembre 1999 Andreas Steinmetz: “VPND Frequently Asked Questions”, Noviembre 1999 Mark Grennan: “Firewall and Proxy Server HOWTO”, Febrero 2000 Andreas Steffen: ”StrongSwan Configuration Guide”, Octubre 2004 30