Organización del trabajo remoto para una organización SMB en OpenVPN.

Planteamiento del problema

Este artículo describe la organización del acceso remoto de empleados con productos de código abierto y puede ser utilizado tanto para construir un sistema completamente autónomo, como para ser útil para la expansión cuando el sistema comercial existente tiene una falta de licencias o su rendimiento es insuficiente.

El objetivo del artículo es implementar un sistema completo de provisión de acceso remoto para la organización, lo que es un poco más que "instalar OpenVPN en 10 minutos".

Como resultado, obtendremos un sistema en el que se utilizarán certificados para la autenticación de usuarios y (opcionalmente) un directorio corporativo Active Directory. Así, tendremos un sistema con dos factores de verificación: lo que tengo (el certificado) y lo que sé (la contraseña).

La señal de que se permite la conexión al usuario es su pertenencia al grupo myVPNUsr. Se utilizará una autoridad de certificación autónoma.

El costo de implementación de la solución es solo un pequeño recurso de hardware y 1 hora de trabajo de un administrador de sistemas.

Utilizaremos una máquina virtual con OpenVPN y Easy-RSA versión 3 en CentOS 7, que, para 100 conexiones, contará con 4 vCPU y 4 GiB de RAM.

En este ejemplo, la red de nuestra organización es 172.16.0.0/16, donde el servidor VPN con la dirección 172.16.19.123 está ubicado en el segmento 172.16.19.0/24, los servidores DNS son 172.16.16.16 y 172.16.17.17, y para los clientes VPN se ha asignado la subred 172.16.20.0/23.

Para las conexiones externas se usa el puerto 1194/udp, y en DNS se ha creado un registro A para nuestro servidor llamado gw.abc.ru.

¡Se recomienda encarecidamente no desactivar SELinux! OpenVPN funciona sin desactivar las políticas de seguridad.

Contenido

  1. Instalación del sistema operativo y del software
  2. Configuración de la criptografía
  3. Configuración de OpenVPN
  4. Autenticación en AD
  5. Ejecución y diagnóstico
  6. Emisión y revocación de certificados
  7. Configuración de red
  8. ¿Qué sigue?

Instalación del sistema operativo y del software

Usamos la distribución CentOS 7.8.2003. Necesitamos instalar el sistema operativo en una configuración mínima. Es conveniente hacerlo utilizando kickstart, clonando una imagen del sistema operativo previamente instalado y otros métodos.

Después de la instalación, asignamos una dirección a la interfaz de red (según los requisitos, 172.16.19.123), y actualizamos el sistema operativo:

$ sudo yum update -y && reboot

También es necesario asegurarse de que nuestra máquina esté sincronizando la hora.
Para instalar el software necesario, se requieren los paquetes openvpn, openvpn-auth-ldap, easy-rsa y vim como editor principal (se necesitará el repositorio EPEL).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Para la máquina virtual, es útil instalar el agente del huésped:

$ sudo yum install open-vm-tools

para hosts de VMware ESXi, o para oVirt

$ sudo yum install ovirt-guest-agent

Configuración de la criptografía

Cambiamos al directorio easy-rsa:

$ cd /usr/share/easy-rsa/3/

Creando el archivo de variables:

$ sudo vim vars

users.module.ts

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.ru"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.ru"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Aquí se describen los parámetros para la organización hipotética LLC "ABC"; se pueden corregir a valores reales o dejarlos como en el ejemplo. Lo más importante en los parámetros es la última línea, que define la duración del certificado en días. En el ejemplo se utilizó un valor de 10 años (365*10+2 años bisiestos). Este valor deberá ajustarse antes de emitir los certificados de los usuarios.

A continuación, configuramos una autoridad certificadora autónoma.

La configuración incluye la exportación de variables, la inicialización de la CA, la emisión de la clave raíz y el certificado de la CA, la clave de Diffie-Hellman, la clave TLS, así como la clave y el certificado del servidor. ¡La clave de la autoridad certificadora debe protegerse cuidadosamente y guardarse en secreto! Todos los parámetros en las solicitudes se pueden dejar en los valores predeterminados.

cd /usr/share/easy-rsa/3/
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req myvpngw nopass
./easyrsa sign-req server myvpngw
./easyrsa gen-crl
openvpn --genkey --secret pki/ta.key

Con esto, se ha completado la parte principal de la configuración del mecanismo criptográfico.

Configuración de OpenVPN

Pasamos al directorio OpenVPN, creamos los directorios de servicio y añadimos un enlace a easy-rsa:

cd /etc/openvpn/
mkdir /var/log/openvpn/ /etc/openvpn/ccd /usr/share/easy-rsa/3/client
ln -s /usr/share/easy-rsa/3/pki/ /etc/openvpn/

Creamos el archivo principal de configuración de OpenVPN:

$ sudo vim server.conf

con el siguiente contenido

port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/myvpngw.crt
key /etc/openvpn/pki/private/myvpngw.key
crl-verify /etc/openvpn/pki/crl.pem
dh /etc/openvpn/pki/dh.pem
server 172.16.20.0 255.255.254.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
push "route 172.17.0.0 255.255.255.0"
client-config-dir ccd
push "dhcp-option DNS 172.16.16.16"
push "dhcp-option DNS 172.16.17.17"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
username-as-common-name
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/ldap.conf

Algunas observaciones sobre los parámetros:

  • si al emitir el certificado se indicó un nombre diferente, especifíquelo;
  • el grupo de direcciones debe ajustarse a sus necesidades*;
  • puede haber una o varias rutas y servidores DNS;
  • las 2 últimas líneas son necesarias para implementar la autenticación en AD**.

*El rango de direcciones seleccionado en el ejemplo permitirá conectar hasta 127 clientes simultáneamente, ya que se eligió una red /23, y OpenVPN crea una subred de máscara /30 para cada cliente.
En caso de necesidad especial, el puerto y el protocolo pueden ser modificados, sin embargo, debe considerarse que cambiar el número de puerto implicará configurar SELinux, y el uso del protocolo TCP aumentará la sobrecarga, ya que el control de entrega de paquetes TCP ya se realiza a nivel de los paquetes encapsulados en el túnel.

**Si no se necesita autenticación en AD, comente estas líneas y omita la siguiente sección en el template. elimine la línea auth-user-pass.

Autenticación en AD

Para soportar el segundo factor utilizaremos la verificación de la cuenta en AD.

Necesitamos una cuenta de dominio con derechos de usuario común y un grupo, cuya membresía determinará la posibilidad de conexión.

Creamos el archivo de configuración:

/etc/openvpn/ldap.conf

con el siguiente contenido

URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes


        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"

Parámetros principales:

  • URL "ldap://ldap.abc.ru" — dirección del controlador de dominio;
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" — nombre canónico para la vinculación a LDAP (usuario — bindUsr en el contenedor abc.ru/Users);
  • Password b1ndP@SS — contraseña del usuario para la vinculación;
  • BaseDN "OU=allUsr,DC=abc,DC=ru" — ruta desde la cual comenzar la búsqueda de usuarios;
  • BaseDN "OU=myGrp,DC=abc,DC=ru" — contenedor del grupo autorizado (grupo myVPNUsr en el contenedor abc.ru/myGrp);
  • SearchFilter "(cn=myVPNUsr)" — nombre del grupo autorizado.

Ejecución y diagnóstico

Ahora podemos intentar habilitar y arrancar nuestro servidor:

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

Verificación de inicio:

systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Emisión y revocación de certificados

Como además de los certificados se necesitan claves y otras configuraciones, es muy conveniente envolver todo esto en un solo archivo de perfil. Este archivo luego se entrega al usuario y el perfil se importa en el cliente OpenVPN. Para ello, crearemos una plantilla de configuración y un script que genere el perfil.

En el perfil hay que añadir el contenido de los archivos del certificado raíz (ca.crt) y la clave TLS (ta.key).

Antes de emitir los certificados de usuario no olvide establecer la duración del certificado requerida en el archivo de parámetros. No debe ser demasiado largo; recomiendo limitarlo a un máximo de 180 días.

vim /usr/share/easy-rsa/3/vars

...
export EASYRSA_CERT_EXPIRE=180

vim /usr/share/easy-rsa/3/client/template.ovpn

client
dev tun
proto udp
remote gw.abc.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth-user-pass


-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----


key-direction 1

-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----

Notas:

  • líneas PUT YOUR… cambiamos por el contenido de sus certificados;
  • en la directiva remote indique el nombre/dirección de su puerta de enlace;
  • la directiva auth-user-pass se utiliza para autenticación externa adicional.

En el directorio de inicio (o en otro lugar conveniente), creamos un script para solicitar el certificado y crear el perfil:

vim ~/make.profile.sh

#!/bin/bash

if [ -z "$1" ] ; then
 echo Missing mandatory client name. Usage: $0 vpn-username
 exit 1
fi

#Set variables
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn

#Get current year and lowercase client name
year=`date +%F`
client=${1,,}
echo Processing $year year cert for user/device $client

cd $basepath

if [  -f client/$client* ]; then
    echo "*** ERROR! ***"
    echo "Certificate $client already issued!"
    echo "*** ERROR! ***"
    exit 1
fi

. ./vars
./easyrsa --batch --req-cn=$client gen-req $client nopass
./easyrsa --batch sign-req client $client

#Make profile
cp $clntpath/template.ovpn $profile

echo "<key>" >> $profile
cat $privpath/$1.key >> $profile
echo "</key>" >> $profile

echo -e "n" >> $profile
openssl x509 -in $certpath/$1.crt -out $basepath/$1.crt

echo "<cert>" >> $profile
cat $basepath/$1.crt >> $profile
echo "</cert>" >> $profile
echo -e "n" >> $profile

#remove tmp file
rm -f $basepath/$1.crt

echo Complete. See $profile file.

cd ~

Hacemos el archivo ejecutable:

chmod a+x ~/make.profile.sh

Y ya podemos emitir nuestro primer certificado.

~/make.profile.sh my-first-user

Reseña

En caso de compromiso del certificado (pérdida, robo), es necesario revocar dicho certificado:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Visualizar certificados emitidos y revocados

Para ver los certificados emitidos y revocados, simplemente hay que revisar el archivo índice:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Explicaciones:

  • la primera línea contiene el certificado del servidor;
  • el primer carácter
    • V (Válido) — válido;
    • R (Revocado) — revocado.

Configuración de red

Los últimos pasos son la configuración de la transmisión de redes — enrutamiento y firewalls.

Permitir conexiones en el firewall local:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Luego, habilitamos la transmisión de tráfico IP:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

En un entorno corporativo, seguramente existe una división en subredes y necesitamos informar al enrutador(es) cómo enviar paquetes dirigidos a nuestros clientes VPN. En la línea de comando ejecutamos un comando del estilo (depende del hardware utilizado):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

y guardamos la configuración.

Además de esto, en la interfaz del enrutador perimetral, donde se gestiona la dirección externa gw.abc.ru, es necesario permitir el paso de paquetes udp/1194.

En caso de que existan estrictas políticas de seguridad en la organización, también es necesario configurar un cortafuegos en nuestro servidor VPN. En mi opinión, la configuración de las cadenas FORWARD de iptables proporciona la mayor flexibilidad, aunque es menos conveniente de configurar. Un poco más sobre cómo configurarlas. Para esto, es más fácil usar "reglas directas" — direct rules, almacenadas en un archivo. /etc/firewalld/direct.xml. La configuración activa de las reglas se puede conocer así:

$ sudo firewall-cmd --direct --get-all-rule

Antes de modificar el archivo, haga una copia de seguridad del mismo:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

El contenido aproximado del archivo es el siguiente:


  
    -i tun0 -o ens192 -p udp --dport 53 -j ACCEPT
  
    -i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    -i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '

Explicaciones

En esencia, estas son reglas comunes de iptables, empaquetadas de otra manera desde la aparición de firewalld.

La interfaz de destino en la configuración predeterminada es tun0, mientras que la externa para el túnel puede ser diferente, por ejemplo, ens192, dependiendo de la plataforma utilizada.

La última línea está destinada a registrar los paquetes desechados. Para que el registro funcione, es necesario cambiar el nivel de depuración en la configuración de firewalld:

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

La aplicación de la configuración es un comando estándar de firewalld para volver a leer la configuración:

$ sudo firewall-cmd --reload

Los paquetes desechados se pueden consultar así:

grep forward_fw /var/log/messages

¿Qué sigue?

¡Con esto, la configuración ha terminado!

Ahora solo falta instalar el software cliente en el lado del cliente, importar el perfil y conectarse. Para sistemas operativos tipo Windows, el paquete está disponible en el sitio del desarrollador.

Finalmente, conectamos nuestro nuevo servidor a los sistemas de monitoreo y archivo, y no olvidamos instalar actualizaciones regularmente.

¡Estable conexión!

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster