Organización del trabajo remoto de una organización SMB en OpenVPN

Formulación del problema

El artículo describe la organización del acceso remoto para empleados a productos de código abierto y puede usarse tanto para construir un sistema completamente autónomo como para expandirlo cuando haya escasez de licencias en el sistema comercial existente o su rendimiento sea insuficiente.

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

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

Una señal de que un usuario puede conectarse es su membresía en el grupo myVPNUsr. La autoridad de certificación se utilizará sin conexión.

El costo de implementar la solución es de solo pequeños recursos de hardware y 1 hora de trabajo del administrador del sistema.

Usaremos una máquina virtual con OpenVPN y Easy-RSA versión 3 en CetntOS 7, a la que se le asignan 100 vCPU y 4 GiB de RAM por cada 4 conexiones.

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

Para conectarse desde el exterior, se utiliza una conexión a través del puerto 1194/udp y se ha creado un registro A gw.abc.ru en el DNS de nuestro servidor.

¡No se recomienda estrictamente desactivar SELinux! OpenVPN funciona sin deshabilitar las políticas de seguridad.

contenido

  1. Instalación del sistema operativo y software de aplicación.
  2. Configurar criptografía
  3. Configuración de OpenVPN
  4. Autenticación de anuncios
  5. Puesta en marcha y diagnóstico
  6. Expedición y revocación de certificados
  7. Configuración de red
  8. ¿Qué sigue

Instalación del sistema operativo y software de aplicación.

Usamos la distribución CentOS 7.8.2003. Necesitamos instalar el sistema operativo en una configuración mínima. Es conveniente hacer esto usando puntapié inicial, clonación de una imagen del sistema operativo previamente instalada y otros medios.

Después de la instalación, asignando una dirección a la interfaz de red (según los términos de la tarea 172.16.19.123), actualizamos el sistema operativo:

$ sudo yum update -y && reboot

También debemos asegurarnos de que se realice la sincronización horaria en nuestra máquina.
Para instalar el software de la aplicación, necesita los paquetes openvpn, openvpn-auth-ldap, easy-rsa y vim como editor principal (necesitará el repositorio EPEL).

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

Es útil instalar un agente invitado para una máquina virtual:

$ sudo yum install open-vm-tools

para hosts VMware ESXi o para oVirt

$ sudo yum install ovirt-guest-agent

Configurar criptografía

Vaya al directorio easy-rsa:

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

Crea un archivo de variables:

$ sudo vim vars

el siguiente contenido:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
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

Los parámetros para la organización condicional ABC LLC se describen aquí, puede corregirlos a los reales o dejarlos del ejemplo. Lo más importante en los parámetros es la última línea, que determina el período de validez del certificado en días. El ejemplo utiliza el valor 10 años (365*10+2 años bisiestos). Este valor deberá ajustarse antes de emitir los certificados de usuario.

A continuación, configuramos una autoridad de certificación autónoma.

La configuración incluye exportar variables, inicializar la CA, emitir la clave raíz y el certificado de la CA, la clave Diffie-Hellman, la clave TLS y la clave y el certificado del servidor. ¡La clave CA debe protegerse cuidadosamente y mantenerse en secreto! Todos los parámetros de consulta se pueden dejar como 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

Esto completa la parte principal de la configuración del mecanismo criptográfico.

Configuración de OpenVPN

Vaya al directorio OpenVPN, cree directorios de servicios y agregue 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/

Cree el archivo de configuración principal de OpenVPN:

$ sudo vim server.conf

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 notas sobre los parámetros:

  • si al emitir el certificado se especificó un nombre diferente, indíquelo;
  • especifique el conjunto de direcciones que se adaptan a sus tareas*;
  • puede haber una o más rutas y servidores DNS;
  • Las últimas 2 líneas son necesarias para implementar la autenticación en AD**.

*El rango de direcciones seleccionado en el ejemplo permitirá que hasta 127 clientes se conecten simultáneamente, porque Se selecciona la red /23 y OpenVPN crea una subred para cada cliente usando la máscara /30.
Si es especialmente necesario, se pueden cambiar el puerto y el protocolo; sin embargo, debe tenerse en cuenta que cambiar el número de puerto implicará configurar SELinux y el uso del protocolo tcp aumentará la sobrecarga, porque El control de entrega de paquetes TCP ya se realiza a nivel de paquetes encapsulados en el túnel.

**Si no es necesaria la autenticación en AD, coméntelos, omita la siguiente sección y en la plantilla eliminar la línea de contraseña de usuario de autenticación.

Autenticación de anuncios

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

Necesitamos una cuenta en el dominio con los derechos de un usuario común y un grupo, cuya membresía determinará la capacidad de conectarse.

Cree un archivo de configuración:

/etc/openvpn/ldap.conf

el siguiente contenido

<LDAP>
        URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
</LDAP>
<Authorization>
        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        <Group>
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"
        </Group>
</Authorization>

Los 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 vincular a LDAP (UZ - bindUsr en el contenedor abc.ru/Users);
  • Contraseña b1ndP@SS — contraseña de usuario para vinculación;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — la ruta desde la cual comenzar a buscar al usuario;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – contenedor del grupo permitido (grupo myVPNUsr en el contenedor abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" es el nombre del grupo permitido.

Puesta en marcha y diagnóstico

Ahora podemos intentar habilitar e iniciar nuestro servidor:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Comprobación de inicio:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Expedición y revocación de certificados

Porque Además de los certificados en sí, necesita claves y otras configuraciones, es muy conveniente envolver todo esto en un archivo de perfil. Luego, este archivo se transfiere al usuario y el perfil se importa en el cliente OpenVPN. Para ello, crearemos una plantilla de configuración y un script que genera el perfil.

Debe agregar el contenido de los archivos del certificado raíz (ca.crt) y de la clave TLS (ta.key) al perfil.

Antes de emitir certificados de usuario no olvide establecer el período de validez requerido para los certificados en el archivo de parámetros. No debes alargarlo demasiado, te recomiendo limitarte 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

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

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>

Notas:

  • escaso PONGA SU... cambiar al contenido su certificados;
  • en la directiva remota, especifique 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 (u otro lugar conveniente) creamos un script para solicitar un certificado y crear un 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 ~

Haciendo el archivo ejecutable:

chmod a+x ~/make.profile.sh

Y podremos emitir nuestro primer certificado.

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

retirada

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

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

Ver certificados emitidos y revocados

Para ver los certificados emitidos y revocados, simplemente vea el archivo de índice:

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

Explicación:

  • la primera línea es el certificado del servidor;
  • primer personaje
    • V (válido) - válido;
    • R (Revocado) - retirado.

Configuración de red

Los últimos pasos son configurar la red de transmisión: enrutamiento y firewalls.

Permitir conexiones en el firewall local:

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

A continuación, habilite el enrutamiento del 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, es probable que haya subredes y debemos decirle a los enrutadores cómo enviar paquetes destinados a nuestros clientes VPN. En la línea de comando ejecutamos el comando de la manera (dependiendo del equipo utilizado):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

y guarde la configuración.

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

En caso de que la organización tenga reglas de seguridad estrictas, también se debe configurar un firewall en nuestro servidor VPN. En mi opinión, la mayor flexibilidad se obtiene configurando cadenas FORWARD de iptables, aunque configurarlas es menos conveniente. Un poco más sobre cómo configurarlos. Para hacer esto, lo más conveniente es utilizar "reglas directas": reglas directas almacenadas en un archivo. /etc/firewalld/direct.xml. La configuración actual de las reglas se puede encontrar de la siguiente manera:

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

Antes de cambiar un 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:

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--Some Other Systems-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

Explicación

Estas son esencialmente reglas regulares de iptables, empaquetadas después de la llegada de firewalld.

La interfaz de destino con la configuración predeterminada es tun0 y la interfaz externa para el túnel puede ser diferente, por ejemplo, ens192, según la plataforma utilizada.

La última línea es para registrar paquetes descartados. Para que el inicio de sesión funcione, debe cambiar el nivel de depuración en la configuración del firewalld:

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

Aplicar la configuración es el comando habitual de firewalld para volver a leer la configuración:

$ sudo firewall-cmd --reload

Puede ver paquetes descartados como este:

grep forward_fw /var/log/messages

¿Qué sigue

¡Esto completa la configuración!

Todo lo que queda es instalar el software del cliente en el lado del cliente, importar el perfil y conectarse. Para los sistemas operativos Windows, el kit de distribución se encuentra en sitio del desarrollador.

Finalmente, conectamos nuestro nuevo servidor a los sistemas de monitoreo y archivo, y no nos olvidamos de instalar actualizaciones periódicamente.

¡Conexión estable!

Fuente: habr.com

Añadir un comentario