diff --git a/vpn/openvpn/servidor.md b/vpn/openvpn/servidor.md index a07cdad..b5c23e0 100644 --- a/vpn/openvpn/servidor.md +++ b/vpn/openvpn/servidor.md @@ -2,7 +2,7 @@ title: OpenVPN - Servidor description: Tutorial de instalación del Servidor OpenVPN published: true -date: 2022-05-18T16:50:19.139Z +date: 2022-05-24T10:58:44.161Z tags: vpn, servidor, debian editor: markdown dateCreated: 2022-05-18T16:48:57.246Z @@ -14,7 +14,196 @@ dateCreated: 2022-05-18T16:48:57.246Z * **[Debian 11 “bullseye”](https://www.debian.org/releases/bullseye/)** * **Usuario con privilegios `sudo`** -## Instalación de dependencias +## EasyRSA + +### Instalación de EasyRSA (en CA, Signer y oVPN) + +* Primero descargamos la última versión disponible de EasyRSA en nuestra CA y nuestro Signer + +```bash +wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.0/EasyRSA-3.1.0.tgz +``` + +* Luego descomprimimos y dejamos un nombre sencillo + +```bash +cd ~ +tar xvf EasyRSA-3.1.0.tgz +mv EasyRSA-3.1.0 EasyRSA +cd EasyRSA +``` + +### Configuración de EasyRSA (en CA, Signer y oVPN) + +* Inicialmente tendremos un fichero `vars.example` que utilizaremos como base + +```bash +cp vars.example vars +``` + +* Editaremos este fichero para dejar nuestras propiedades personalizadas + +```bash +nano vars # o vim vars +``` + +* Establecemos unos valores apropiados para nuestra CA y Signer + +```bash +set_var EASYRSA_REQ_COUNTRY "ES" +set_var EASYRSA_REQ_PROVINCE "Valladolid" +set_var EASYRSA_REQ_CITY "Valladolid" +set_var EASYRSA_REQ_ORG "Bastionado" +set_var EASYRSA_REQ_EMAIL "admin@bastionado.es" +set_var EASYRSA_REQ_OU "Community" + +set_var EASYRSA_KEY_SIZE 4096 + +set_var EASYRSA_CA_EXPIRE 7090 # La CA durará 20 años + +set_var EASYRSA_CERT_EXPIRE 180 # Los certificados cliente caducan cada 6 meses + +set_var EASYRSA_CERT_RENEW 20 # Los certificados se pueden renovar con 20 días de antelación +``` + + +### Creación de CA + +* Inicializamos nuestra Infraestructura de Clave Pública en la CA + +```bash +./easyrsa init-pki +``` + +* Como se nos informa de que el fichero `vars` se ha movido a la PKI procedemos a eliminar el inicial + +```bash +rm vars +``` + +* Generamos nuestra CA + +```bash +./easyrsa build-ca # Podríamos añadir 'nopass' para no establecer una Passphrase +``` + +### Creación de SubCA en Signer + +* Inicializamos nuestra Infraestructura de Clave Pública en la SubCA + +```bash +./easyrsa init-pki +``` + +* Como se nos informa de que el fichero `vars` se ha movido a la PKI procedemos a eliminar el inicial + +```bash +rm vars +``` + +* Generamos la solicitud de nuestra SubCA + +```bash +./easyrsa build-ca subca +``` + + +* Enviamos la solicitud de nuestra SubCA a la CA para validarla + +```bash +scp ~/EasyRSA/pki/reqs/ca.req ca@ca.bastionado.es:/tmp +``` + +* Conectamos a la CA + +```bash +ssh ca@ca.bastionado.es + +cd ~/EasyRSA +``` + +* Importamos y firmamos la solicitud + +```bash +./easyrsa import-req /tmp/ca.req signer + +./easyrsa sign-req ca signer +``` + +* Devolvemos el certificado válido a nuestra SubCA + +```bash +scp pki/issued/signer.crt signer@signer.bastionado.es:/tmp +``` + +* Volvemos a la SubCA + +```bash +exit + +cd ~/EasyRSA + +mv /tmp/signer.crt pki/ca.crt +``` + +### Creación de Certificado en oVPN + +* Inicializamos nuestra Infraestructura de Clave Pública en oVPN + +```bash +./easyrsa init-pki +``` + +* Como se nos informa de que el fichero `vars` se ha movido a la PKI procedemos a eliminar el inicial + +```bash +rm vars +``` + +* Generamos la solicitud de nuestra VPN + +```bash +./easyrsa gen-req ovpn nopass # Aquí no establecemos Passphrase +``` + +* Enviamos la solicitud de nuestra VPN a la SubCA para validarla + +```bash +scp ~/EasyRSA/pki/reqs/ovpn.req signer@signer.bastionado.es:/tmp +``` + +* Conectamos a la SubCA + +```bash +ssh signer@signer.bastionado.es + +cd ~/EasyRSA +``` + +* Importamos y firmamos la solicitud + +```bash +./easyrsa import-req /tmp/ovpn.req ovpn + +./easyrsa sign-req server ovpn +``` + +* Devolvemos el certificado válido a nuestra oVPN junto con el certificado de la SubCA + +```bash +scp pki/ca.crt ovpn@ovpn.bastionado.es:/tmp +scp pki/issued/ovpn.crt ovpn@ovpn.bastionado.es:/tmp +``` + +* Volvemos a la VPN + +```bash +exit +``` + +## OpenVPN + +### Instalación de dependencias OpenVPN * Comenzaremos actualizando nuestro repositorio `apt` @@ -47,8 +236,314 @@ sudo apt update sudo apt -y install openvpn ``` -## Configuración de certificados +### Configuración de certificados y seguridad TLS -## Arranque automático +* Copiamos los certificados que dejamos en /tmp y la clave privada -## Recursos adicionales \ No newline at end of file +```bash +sudo cp ~/EasyRSA/pki/private/ovpn.key /etc/openvpn/ +sudo cp /tmp/{ovpn.crt,ca.crt} /etc/openvpn/ +``` + +* Volvemos a la ruta de EasyRSA para generar la clave Diffie-Hellman + +```bash +cd ~/EasyRSA/ + +./easyrsa gen-dh +``` + +* Generamos la firma HMAC para reforzar las capacidades de verificación de integridad TLS + +```bash +sudo openvpn --genkey secret ta.key +``` + +* Movemos los ficheros generados a nuestro directorio de OpenVPN + +```bash +sudo mv ~/EasyRSA/ta.key /etc/openvpn/ +sudo mv ~/EasyRSA/pki/dh.pem /etc/openvpn/ +``` + +### Certificados Cliente + +Cona la estructura propuesta las solicitudes de certificados cliente serán generadas desde el servidor de OpenVPN `oVPN` y firmadas desde la SubCA `Signer`, de tal modo que, posteriormente, el cliente simplemente recibirá un fichero de configuración para conectar a la VPN junto con sus certificados sin tener que estar intercambiando certificados inicialmente si fuera el propio cliente el que realizara la solicitud de creación de certificado. + +* Crearemos un directorio en nuestra VPN para almacenar las configuraciones de cliente y restringiremos los permisos + +```bash +mkdir -p ~/client-configs/keys + +chmod -R 700 ~/client-configs +``` + +* Volvemos a la ruta de EasyRSA para generar la solicitud de certificado cliente + +```bash +cd ~/EasyRSA/ + +./easyrsa gen-req client1 nopass +``` + +* Copiamos la clave privada generada a nuestro directorio de configuraciones Cliente + +```bash +cp pki/private/client1.key ~/client-configs/keys/ +``` + +* Enviamos la solicitud de nuestra VPN a la SubCA para validarla + +```bash +scp ~/EasyRSA/pki/reqs/client1.req signer@signer.bastionado.es:/tmp +``` + +* Conectamos a la SubCA + +```bash +ssh signer@signer.bastionado.es + +cd ~/EasyRSA +``` + +* Importamos y firmamos la solicitud + +```bash +./easyrsa import-req /tmp/client1.req client1 + +./easyrsa sign-req client client1 +``` + +* Devolvemos el certificado válido a nuestra oVPN + +```bash +scp pki/issued/client1.crt ovpn@ovpn.bastionado.es:/tmp +``` + +* Volvemos a la VPN y copiamos el certificado a nuestro directorio de configuraciones Cliente + +```bash +exit + +cp /tmp/client1.crt ~/client-configs/keys/ +``` + +* Ahora copiamos el certificado de la SubCA y la Firma HMAC a nuestro directorio de configuraciones Cliente + +```bash +exit + +sudo cp /etc/openvpn/ta.key ~/client-configs/keys/ +sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/ +``` + +### Configuración de OpenVPN + +Ahora que ya hemos terminado completamente con la Infraestructura de Clave Pública es el momento de configurar el servicio OpenVPN. + +* Comenzamos copiando la configuración de ejemplo y lo editamos + +```bash +sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/ + +sudo nano /etc/openvpn/server.conf # sudo vim /etc/openvpn/server.conf +``` + +> La directiva `tls-auth` añade una capa adicional de autenticación HMAC sobre el canal de control TLS para mitigar los ataques DoS y los ataques a la pila TLS. En pocas palabras, --tls-auth habilita una especie de "cortafuegos HMAC" en el puerto TCP/UDP de OpenVPN, donde los paquetes del canal de control TLS que lleven una firma HMAC incorrecta pueden ser descartados inmediatamente sin respuesta. + +* Nos aseguramos de que `tls-auth` está habilitado (debemos eliminar el `;` inicial si existe) + +```bash +tls-auth ta.key 0 # This file is secret +``` + +> La directiva `cipher` cifra los paquetes del canal de datos con el algoritmo de cifrado `alg`.El valor por defecto es `BF-CBC`, una abreviatura de [Blowfish en modo Cipher Block Chaining](https://cryptopp.com/wiki/Blowfish). Ya no se recomienda el uso de BF-CBC, debido a su tamaño de bloque de 64 bits. Este pequeño tamaño de bloque permite realizar ataques basados en colisiones, como ha demostrado [SWEET32](https://sweet32.info/#CBC). Nos pasaremos al cifrado [AES en modo Cipher Block Chaining](https://cryptopp.com/wiki/Advanced_Encryption_Standard) con bloques de 256 bits. + +* Escogemos el cifrado `AES-256-CBC` que ofrece un buen nivel de seguridad + +```bash +cipher AES-256-CBC +``` + +> La directiva `auth` Autentica los paquetes del canal de datos y (si está habilitado) los paquetes del canal de control `tls-auth` con HMAC utilizando el algoritmo de resumen de mensajes alg. (El valor predeterminado es `SHA1` ). HMAC es un algoritmo de autenticación de mensajes (MAC) de uso común que utiliza una cadena de datos, un algoritmo hash seguro y una clave, para producir una firma digital.El protocolo de canal de datos de OpenVPN utiliza encrypt-then-mac (es decir, primero encripta un paquete y luego HMAC el texto cifrado resultante), lo que evita los ataques de oráculo de relleno. + +* Justo debajo añadimos la directiva `auth` + +```bash +auth SHA512 +``` + +* Buscamos la directiva `dh` para modificar su nombre a `dh.pem` ya que es como se denomina nuestro fichero generado anteriormente + +```bash +dh dh.pem +``` + +* Haremos que el servicio OpenVPN se ejecute con el usuario `nobody` y grupo `nogroup` descomentando estos valores + +```bash +user nobody +group nogroup +``` + +* Apuntaremos a nuestro certificado generado anteriormente + +```bash +cert ovpn.crt +key ovpn.key +``` + + +* Y para finalizar forzaremos que todo el tráfico de los clientes sea redirigido por la VPN. Buscaremos y descomentaremos las siguientes líneas + +```bash +push "redirect-gateway def1 bypass-dhcp" + +push "dhcp-option DNS 208.67.222.222" +push "dhcp-option DNS 208.67.220.220" +``` + +### Directivas adicionales + +* Habilitar la redirección de tráfico + +```bash +sudo nano /etc/sysctl.conf # sudo vim /etc/sysctl.conf + +net.ipv4.ip_forward=1 # Descomentar esta línea +``` + +### Puesta en funcionamiento del servicio + +* Arrancar y comprobar el estado del servicio OpenVPN + +```bash +sudo systemctl start openvpn@server && sudo systemctl status openvpn@server +``` + +* Comprobar la existencia de la intefaz virtual de OpenVPN + +```bash +ip addr show tun0 +``` + +* Habilitar el arranque automático de OpenVPN + +```bash +sudo systemctl enable openvpn@server +``` + +## Configuración para el cliente + +### Plantilla de cliente + +Ahora que ya tenemos nuestra VPN funcionando es el momento de generar la configuración que los clientes importarán para poder conectar a nuestra VPN. + +* Comenzamos creando en nuestro directorio de configuración de clientes un directorio donde almacenar la configuración individual + +```bash +mkdir -p ~/client-configs/files +``` + +* Copiamos la plantilla de configuración de cliente por defecto y procedemos a editarla + +```bash +cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf + +nano ~/client-configs/base.conf # vim ~/client-configs/base.conf +``` + +* Localizamos la directiva `remote` y establecemos la IP y puerto de nuestro servidor VPN + +```bash +remote ovpn.bastionado.es 1194 +``` + +* Nos aseguramos de establecer el protocolo en `UDP` + +```bash +proto udp +``` + +* Realizamos un descenso de privilegios después de inicializar en sistemas que no son Windows descomentando las siguientes líneas + +```bash +user nobody +group nogroup +``` + +* Comentamos los ficheros de certificados y `tls-auth` ya que esta es la plantilla y se establecerán individualmente + +```bash +#ca ca.crt +#cert client.crt +#key client.key + +#tls-auth ta.key 1 +``` + +* Establecemos las mismas directivas `cipher` y `auth` que establecimos en el servidor + +```bash +cipher AES-256-CBC +auth SHA512 +``` + +> La directiva `key-direction` establece una forma alternativa de especificar el parámetro opcional de dirección para las opciones `tls-auth` y `secret`, Es útil cuando se utilizan ficheros incrustados. + + +* Establecemos la directiva `key-direction` + +```bash +key-direction 1 +``` + +### Script de configuración de clientes + +Generaremos un script que se encargará de crear un fichero incrustado con la configuración de conexión plantilla y los certificados apropiados para cada cliente. + +* Creamos el script + +```bash +nano ~/client-configs/make_config.sh # vim ~/client-configs/make_config.sh +``` + +* Añadimos el siguiente código al script + +```bash +#!/bin/bash + +# First argument: Client identifier + +KEY_DIR=/home/ovpn/client-configs/keys +OUTPUT_DIR=/home/ovpn/client-configs/files +BASE_CONFIG=/home/ovpn/client-configs/base.conf + +cat ${BASE_CONFIG} \ + <(echo -e '') \ + ${KEY_DIR}/ca.crt \ + <(echo -e '\n') \ + ${KEY_DIR}/${1}.crt \ + <(echo -e '\n') \ + ${KEY_DIR}/${1}.key \ + <(echo -e '\n') \ + ${KEY_DIR}/ta.key \ + <(echo -e '') \ + > ${OUTPUT_DIR}/bastionado-${1}.ovpn +``` + +* Establecemos los permisos de ejecución + +```bash +chmod 700 ~/client-configs/make_config.sh +``` + +* Y ahora ya podemos generar el fichero de configuración para `client1` + +```bash +cd ~/client-configs + +sudo ./make_config.sh client1 +``` + +* El fichero resultante, `bastionado-client1.ovpn` deberá entregarse al cliente para que éste pueda conectar a la VPN.