Organización de trabajo remoto Organización SMB en OpenVPN

Formulación del problema


El artículo describe la organización del acceso remoto para los empleados en productos de código abierto y se puede utilizar tanto para construir un sistema totalmente autónomo y será útil para la expansión cuando faltan licencias en un sistema comercial existente o su rendimiento es insuficiente.

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

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

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

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

Utilizaremos una máquina virtual con OpenVPN y Easy-RSA 3rd versión en CetntOS 7, que en base a 100 conexiones emitió 4 vCPU, 4 GiB RAM.

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

Para conectarse desde el exterior, se utiliza una conexión en el puerto 1194 / udp, y se crea un registro A gw.abc.ru en el DNS de nuestro servidor.

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

Contenido


  1. Instalación de SO y software de aplicación
  2. Configuración de criptografía
  3. Configurar OpenVPN
  4. Autenticación en AD
  5. Lanzamiento y Diagnóstico
  6. Emisión y revocación del certificado.
  7. Configuración de la red
  8. Que sigue


Instalación de SO y software de aplicación


Utilizamos el kit de distribución CentOS 7.8.2003. Necesitamos instalar el sistema operativo en una configuración mínima. Es conveniente hacer esto usando kickstart , clonando una imagen de SO instalada previamente y otros medios.

Después de la instalación, asignando una dirección a la interfaz de red (de acuerdo con las condiciones de la tarea 172.16.19.123), actualizamos el sistema operativo:

$ sudo yum update -y && reboot

También es necesario asegurarse de que la sincronización horaria se realice 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

Para una máquina virtual, es útil instalar un agente invitado:

$ sudo yum install open-vm-tools

para hosts VMware ESXi o para oVirt

$ sudo yum install ovirt-guest-agent


Configuración de criptografía


Vaya al directorio easy-rsa:

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

Crea un archivo variable:

$ 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="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 condicional de ABC LLC. Puede corregirlos como reales o dejarlos como 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. En el ejemplo, se utiliza el valor de 10 años (365 * 10 + 2 años bisiestos). Este valor deberá ajustarse antes de emitir certificados de usuario.

A continuación, configure una autoridad de certificación independiente.

La configuración incluye exportar variables, inicializar la CA, emitir la clave raíz y el certificado de CA, la clave Diffie-Hellman, la clave TLS, así como la clave y el certificado del servidor. ¡La clave de la autoridad de certificación debe guardarse cuidadosamente y mantenerse en secreto! Todos los parámetros en las solicitudes se pueden dejar por defecto.

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

En esto, se completa la parte principal de la configuración del mecanismo criptográfico.

Configurar OpenVPN


Vaya al directorio OpenVPN, cree directorios de servicio 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 se indicó un nombre diferente al emitir el certificado, indíquelo;
  • especifique el grupo de direcciones para sus tareas *;
  • las rutas y los servidores DNS pueden ser uno o más;
  • Las últimas 2 líneas son necesarias para implementar la autenticación en AD **.

* 127 , .. /23, OpenVPN /30.
, , SELinux, tcp , .. tcp- .

** AD , , — , auth-user-pass.


AD


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

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

Crea 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>

Parámetros principales:

  • URL "ldap: //ldap.abc.ru": la dirección del controlador de dominio;
  • BindDN “CN = bindUsr, CN = Users, DC = abc, DC = ru”: el nombre canónico para el enlace a LDAP (UZ - bindUsr en el contenedor abc.ru/Users);
  • Contraseña b1ndP @ SS: contraseña de usuario para enlace;
  • BaseDN "OU = allUsr, DC = abc, DC = ru" - la ruta desde la cual comenzar la búsqueda del usuario;
  • BaseDN "OU = myGrp, DC = abc, DC = ru": el contenedor del grupo que permite (el grupo myVPNUsr en el contenedor abc.ru \ myGrp);
  • SearchFilter "(cn = myVPNUsr)" es el nombre del grupo de resolución.


Lanzamiento y Diagnóstico


Ahora podemos intentar encender e iniciar nuestro servidor:

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

Verificación de lanzamiento:

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

Emisión y revocación del certificado.


Porque Además de los certificados mismos, necesita claves y otras configuraciones, es muy conveniente incluir todo esto en un archivo de perfil. Este archivo se transfiere al usuario y el perfil ya se importa en el cliente OpenVPN. Para hacer esto, cree una plantilla de configuración y un script que forme el perfil.

En el perfil, debe agregar el contenido de los archivos de certificado raíz (ca.crt) y la clave TLS (ta.key).

Antes de emitir certificados de usuario, asegúrese de establecer el período de validez del certificado requerido en el archivo de parámetros. No debe hacerlo demasiado grande, le 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

<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:

  • PONGA SUS ... las cadenas se cambian al contenido de sus certificados;
  • en la directiva remota, especifique el nombre / dirección de su puerta de enlace;
  • La directiva auth-user-pass se usa 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 ~

Hacemos que el archivo sea ejecutable:

chmod a+x ~/make.profile.sh

Y puede emitir nuestro primer certificado.

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


Retroalimentación


Si el certificado se ve comprometido (pérdida, robo), este certificado debe ser revocado:

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, solo vea el archivo de índice:

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

Explicaciones:

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


Configuración de la red


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

Permiso para conexiones en el firewall local:

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

A continuación, habilite el enrutamiento 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, es probable que haya una división en subredes y necesitamos decirle al enrutador (es) cómo enviar paquetes dirigidos a nuestros clientes VPN. En la línea de comando, ejecute el comando de la manera (depende del equipo utilizado):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

y guardar la configuración.

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

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

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

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

<?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>

Explicaciones


Esencialmente, estas son las reglas usuales de iptables, de lo contrario empaquetadas después de la aparición de firewalld.

La interfaz de destino en la configuración predeterminada es tun0, y la externa para el túnel puede ser diferente, por ejemplo, ens192, dependiendo de 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 firewalld:

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

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

$ sudo firewall-cmd --reload

Los paquetes descartados se pueden ver de la siguiente manera:

grep forward_fw /var/log/messages


Que sigue


¡La configuración está hecha!

Permanece en el lado del cliente instalar el software del cliente, importar el perfil y conectarse. Para un sistema operativo como Windows, la distribución está disponible en el sitio del desarrollador .

En conclusión, conectamos nuestro nuevo servidor a los sistemas de monitoreo y archivo, y no olvidemos instalar actualizaciones regularmente.

Conexión estable!

All Articles