
Problemática
No hace mucho tiempo, muchas personas no sabían cómo era trabajar desde casa. La pandemia cambió drásticamente la situación en el mundo, todos empezaron a adaptarse a las circunstancias, a lo que se refiere a que salir de casa se volvió simplemente peligroso. Y muchos tuvieron que organizar rápidamente el trabajo desde casa para sus empleados.
Sin embargo, la falta de un enfoque adecuado en la elección de soluciones para el trabajo remoto puede llevar a pérdidas irreversibles. Las contraseñas de los usuarios pueden ser robadas, lo que dará a un delincuente la posibilidad de conectarse sin control a la red y a los recursos de TI de la empresa.
Por eso, ahora ha aumentado la necesidad de crear redes VPN corporativas confiables. Les hablaré sobre confiable, seguro y sencilla de usar red VPN.
Funciona con el esquema IPsec/L2TP, utilizando claves y certificados inextricables para la autenticación de clientes, almacenados en tokens, y también transmite datos a través de la red de manera cifrada.
Se utilizó un servidor con CentOS 7 (dirección: centos.vpn.server.ad) y un cliente con Ubuntu 20.04, así como un cliente con Windows 10, como bancadas de demostración para la configuración.
Descripción del sistema
VPN funcionará con el esquema IPSec + L2TP + PPP. El protocolo Point-to-Point Protocol (PPP) opera en el nivel de enlace de la modelo OSI y proporciona autenticación de usuarios y cifrado de datos transmitidos. Sus datos se encapsulan en los datos del protocolo L2TP, que realmente establece la conexión en la red VPN, pero no garantiza la autenticación y el cifrado.
Los datos de L2TP se encapsulan en el protocolo IPSec, que también proporciona autenticación y cifrado, pero a diferencia del protocolo PPP, la autenticación y el cifrado ocurren a nivel de dispositivos, y no a nivel de usuarios.
Esta característica permite proporcionar autenticación de usuarios solo desde ciertos dispositivos. Nosotros usaremos el protocolo IPSec como base y permitiremos la autenticación de usuarios desde cualquier dispositivo.

La autenticación del usuario mediante tarjetas inteligentes se llevará a cabo en el nivel del protocolo PPP mediante el protocolo EAP-TLS.
Puede encontrar más información detallada sobre el funcionamiento de este esquema en .
Por qué este esquema cumple con los tres requisitos de una buena red VPN
- La fiabilidad de este esquema ha sido comprobada por el tiempo. Se ha utilizado para desplegar redes VPN desde el año 2000.
- La autenticación segura del usuario se garantiza mediante el protocolo PPP. no proporciona un nivel de seguridad adecuado, ya que para la autenticación, en el mejor de los casos, se utiliza la autenticación mediante nombre de usuario y contraseña. Todos sabemos que el nombre de usuario y la contraseña pueden ser observados, adivinados o robados. Sin embargo, desde hace tiempo, el desarrollador en de este protocolo corrigió este aspecto y añadió la posibilidad de usar protocolos basados en cifrado asimétrico, como EAP-TLS, para la autenticación. Además, se añadió la posibilidad de utilizar tarjetas inteligentes para la autenticación, lo que hizo que este sistema fuera más seguro.
En este momento, se están llevando a cabo negociaciones activas para la fusión de estos dos proyectos y se puede estar seguro de que tarde o temprano eso ocurrirá. Por ejemplo, en los repositorios de Fedora ya hay una versión parcheada de PPP que utiliza protocolos seguros para la autenticación. - No hace mucho, solo los usuarios de Windows podían utilizar esta red, pero nuestros colegas de la MGU, Vasily Shokov y Alexander Smirnov, encontraron y lo mejoraron. Conjuntamente, corregimos muchos errores y fallos en el funcionamiento del cliente, simplificamos la instalación y configuración del sistema, incluso al compilar desde el código fuente. Las más significativas son:
- Se corrigieron problemas de compatibilidad del antiguo cliente con la interfaz de nuevas versiones de openssl y qt.
- Se eliminó la transmisión del PIN del token pppd a través de un archivo temporal.
- Se corrigió el inicio incorrecto del programa de solicitud de contraseña a través de la interfaz gráfica. Esto se logró configurando correctamente el entorno para el servicio xl2tpd.
- La construcción del demonio L2tpIpsecVpn ahora se realiza junto con la construcción del propio cliente, lo que facilita el proceso de construcción y configuración.
- Para facilitar el desarrollo, se ha conectado el sistema Azure Pipelines para probar la corrección de la construcción.
- Se añadió la posibilidad de forzar una reducción en el contexto de openssl. Esto es útil para el soporte correcto de nuevos sistemas operativos, donde el nivel de seguridad estándar está establecido en 2, con redes VPN que utilizan certificados que no cumplen con los requisitos de seguridad de este nivel. Esta opción será útil para trabajar con redes VPN antiguas ya existentes.
La versión corregida se puede encontrar en .
Este cliente admite el uso de tarjetas inteligentes para autenticación, y además oculta al máximo todas las complejidades y dificultades de la configuración de este esquema en Linux, haciendo que la configuración del cliente sea lo más simple y rápida posible.
Por supuesto, para una conexión conveniente entre PPP y la interfaz gráfica del cliente, fue necesario realizar ajustes adicionales en cada uno de los proyectos, pero, a pesar de ello, se lograron minimizar al máximo:
- Se ha corregido
- Se ha corregido . Este error impedía cargar desde el archivo local /etc/ppp/openssl.cnf la configuración de cualquier cosa, excepto la información sobre los motores de openssl para trabajar con tarjetas inteligentes, lo que representaba una gran inconveniencia si, por ejemplo, además de la información sobre los motores, queríamos establecer algo más. Por ejemplo, fijar el nivel de seguridad al establecer la conexión.
Ahora se puede proceder con la configuración.
Configuración del servidor
Instalaremos todos los paquetes necesarios.
Instalación de strongswan (IPsec)
Primero, configuraremos el firewall para trabajar con ipsec
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadLuego procederemos a la instalación
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanDespués de la instalación, es necesario definir la configuración para strongswan (una de las implementaciones de IPSec). Para ello, editaremos el archivo /etc/strongswan/ipsec.conf :
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%any
leftprotoport=udp/1701
right=%any
rightprotoport=udp/%any
ike=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
esp=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024También estableceremos una contraseña general para el acceso. La contraseña general debe ser conocida por todos los participantes de la red para la autenticación. Este método es intrínsecamente poco fiable, ya que esta contraseña puede volverse conocida fácilmente por personas a quienes no queremos dar acceso a la red.
Sin embargo, este hecho no afectará la seguridad de la red, ya que la encriptación principal de los datos y la autenticación de los usuarios se realizan mediante el protocolo PPP. No obstante, es justo mencionar que strongswan admite tecnologías más seguras para la autenticación, por ejemplo, mediante claves privadas. Además, strongswan ofrece la posibilidad de asegurar la autenticación mediante tarjetas inteligentes, pero actualmente solo se admite un número limitado de dispositivos y, por lo tanto, la autenticación mediante tokens y tarjetas inteligentes Rутокен es problemática por el momento. Establezcamos la contraseña general a través del archivo. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Reiniciemos strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstalación de xl2tp
sudo dnf install xl2tpdLo configuraremos a través del archivo /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; define la dirección estática del servidor en la red virtual
local ip = 100.10.10.1
; establece el rango de direcciones virtuales
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; esta opción se puede desactivar después de la configuración exitosa de la red
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; indica la dirección del servidor en la red
name = centos.vpn.server.adReiniciemos el servicio:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdConfiguración de PPP
Es recomendable instalar la última versión de pppd. Para ello, ejecutaremos la siguiente secuencia de comandos:
sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installEscriba en el archivo /etc/ppp/options.xl2tpd lo siguiente (si hay valores presentes, se pueden eliminar):
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 1.1.1.1
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000Anote el certificado raíz y el certificado del servidor:
#директория с сертификатами пользователей, УЦ и сервера
sudo mkdir /etc/ppp/certs
#директория с закрытыми ключами сервера и УЦ
sudo mkdir /etc/ppp/keys
#запрещаем любой доступ к этой дирректории кроме администатора
sudo chmod 0600 /etc/ppp/keys/
#генерируем ключ и выписываем сертификат УЦ
sudo openssl genrsa -out /etc/ppp/keys/ca.pem 2048
sudo openssl req -key /etc/ppp/keys/ca.pem -new -x509 -out /etc/ppp/certs/ca.pem -subj "/C=RU/CN=L2TP CA"
#генерируем ключ и выписываем сертификат сервера
sudo openssl genrsa -out /etc/ppp/keys/server.pem 2048
sudo openssl req -new -out server.req -key /etc/ppp/keys/server.pem -subj "/C=RU/CN=centos.vpn.server.ad"
sudo openssl x509 -req -in server.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/server.pem -CAcreateserialAsí concluimos con la configuración básica del servidor. El resto de la configuración del servidor está relacionada con la adición de nuevos clientes.
Agregar un nuevo cliente
Para agregar un nuevo cliente a la red, es necesario registrar su certificado en la lista de confianza para ese cliente.
Si el usuario desea convertirse en miembro de la red VPN, debe crear un par de claves y solicitar un certificado para este cliente. Si el usuario es de confianza, esta solicitud puede ser firmada y el certificado resultante guardado en el directorio de certificados:
sudo openssl x509 -req -in client.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/client.pem -CAcreateserialAgreguemos una línea en el archivo /etc/ppp/eaptls-server para asociar el nombre del cliente con su certificado:
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *NOTA
Para no confundirse, es mejor que: el Common Name, el nombre del archivo del certificado y el nombre de usuario sean únicos.
También es importante verificar que en otros archivos de autenticación no aparezca el nombre de usuario que estamos agregando, de lo contrario surgirán problemas con el método de autenticación del usuario.
Este mismo certificado debe enviarse de vuelta al usuario.
Generación de un par de claves y un certificado
Para una autenticación exitosa, el cliente debe:
- generar un par de claves;
- tener un certificado raíz de la CA;
- tener un certificado para su par de claves, firmado por la CA raíz.
para cliente en Linux
Primero generaremos un par de claves en el token y crearemos una solicitud de certificado:
#идентификатор ключа (параметр --id) можно заменить на любой другой.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so
...
OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/CN=client"Envía la solicitud generada client.req a la CA. Después de recibir el certificado para tu par de claves, guárdalo en el token con el mismo id que el de la clave:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45para clientes de Windows y Linux (método más universal)
Este método es más universal, ya que permite generar una clave y un certificado que serán reconocidos exitosamente por usuarios de Windows y Linux, pero requiere tener una máquina con Windows para llevar a cabo el proceso de generación de claves.
Antes de generar solicitudes e importar certificados, es necesario agregar el certificado raíz de la red VPN a la lista de confiables. Para ello, ábrelo y en la ventana que aparece, selecciona la opción 'Instalar certificado':

En la ventana que aparece, seleccionamos la instalación del certificado para el usuario local:

Instalaremos el certificado en el almacén de certificados raíz de confianza de la CA:

Después de todas estas acciones, aceptamos todos los puntos posteriores. Ahora el sistema está configurado.
Crearemos el archivo cert.tmp con el siguiente contenido:
[NewRequest]
Subject = "CN=client"
KeyLength = 2048
KeySpec = "AT_KEYEXCHANGE"
ProviderName = "Microsoft Base Smart Card Crypto Provider"
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE"
KeyUsageProperty = "NCRYPT_ALLOW_DECRYPT_FLAG"
RequestType = PKCS10
SMIME = FALSEA continuación, generaremos un par de claves y crearemos una solicitud de certificado. Para ello, abriremos PowerShell e introduciremos el siguiente comando:
certreq.exe -new -pin $PIN .cert.tmp .client.reqEnvíe la solicitud creada client.req a su CA y espere a recibir el certificado client.pem. Este se puede guardar en el token y añadir al almacén de certificados de Windows mediante el siguiente comando:
certreq.exe -accept .client.pemEs importante señalar que acciones similares se pueden realizar mediante la interfaz gráfica del programa mmc, aunque este método resulta más laborioso y menos programable.
Configuración del cliente Ubuntu
NOTA
La configuración del cliente en Linux en este momento es bastante prolongada, ya que requiere compilar programas individuales desde el código fuente. Trataremos de lograr que todos los cambios se incorporen a los repositorios oficiales lo antes posible.
Para garantizar la conexión a nivel IPSec al servidor, se utiliza el paquete strongswan y el demonio xl2tp. Para simplificar la conexión a la red con la ayuda de tarjetas inteligentes, utilizaremos el paquete l2tp-ipsec-vpn, que proporciona una interfaz gráfica para facilitar la configuración de la conexión.
Comencemos a compilar los elementos paso a paso, pero antes instalaremos todos los paquetes necesarios para el funcionamiento directo de la VPN:
sudo apt-get install xl2tpd strongswan libp11-3Instalación de software para trabajar con tokens
Instale la última versión de la biblioteca librtpkcs11ecp.so con , así como bibliotecas para trabajar con tarjetas inteligentes:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslConecte el Rutoken y verifique que sea reconocido por el sistema:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstalación de ppp parcheado
sudo apt-get -y install git make gcc libssl-dev
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installInstalación del cliente L2tpIpsecVpn
En este momento, el cliente también necesita ser compilado desde el código fuente. Esto se hace mediante la siguiente secuencia de comandos:
sudo apt-get -y install git qt5-qmake qt5-default build-essential libctemplate-dev libltdl-dev
git clone "https://github.com/Sander80/l2tp-ipsec-vpn"
cd l2tp-ipsec-vpn
make -j4
sudo make installConfiguración del cliente L2tpIpsecVpn
Inicie el cliente instalado:

Después de iniciar, debería abrirse el applet L2tpIpsecVPN. Haga clic derecho sobre él y proceda a configurar la conexión:

Para trabajar con tokens, primero indicaremos la ruta del motor opensc de OpenSSL y la biblioteca PKCS#11. Para ello, abre la pestaña "Preferencias" para ajustar los parámetros de openssl:
.
Cerraremos la ventana de configuración de OpenSSL y procederemos a la configuración de la red. Añadiremos una nueva red haciendo clic en el botón Añadir… en el panel de configuración e introduce el nombre de la red:

Después de esto, la red estará disponible en el panel de configuración. Haremos clic derecho en la nueva red para configurarla. En la primera pestaña, configuraremos IPsec. Estableceremos la dirección del servidor y la clave compartida:

A continuación, pasamos a la pestaña de configuración PPP y allí indicaremos el nombre de usuario con el que deseamos ingresar a la red:

Después abrimos la pestaña Propiedades y especificamos la ruta de la clave, el certificado del cliente y la CA:

Cerraremos esta pestaña y haremos la configuración final, para ello abriremos la pestaña "Configuraciones de IP" y marcaremos la opción "Obtener automáticamente la dirección del servidor DNS":

Esta opción permitirá al cliente recibir una dirección IP privada del servidor dentro de la red.
Una vez realizadas todas las configuraciones, cerraremos todas las pestañas y reiniciaremos el cliente:

Conexión a la red
Después de la configuración, se puede conectar a la red. Para ello, abrimos la pestaña del applet y seleccionamos la red a la que deseamos conectarnos:

Durante el proceso de establecimiento de la conexión, el cliente nos pedirá ingresar el código PIN de RUToken:

Si aparece una notificación en la barra de estado indicando que la conexión se ha establecido correctamente, significa que la configuración fue exitosa:

De lo contrario, es necesario investigar por qué no se estableció la conexión. Para ello, se debe revisar el registro del programa, eligiendo en el applet la opción "Información de conexión":

Configuración del cliente de Windows
La configuración del cliente en Windows es mucho más sencilla que en Linux, ya que todo el software necesario ya está integrado en el sistema.
Configuración del sistema
Instalaremos todos los controladores necesarios para trabajar con RUTokens descargándolos de .
Importación del certificado raíz para la autenticación
Descargaremos el certificado raíz del servidor y lo instalaremos en el sistema. Para ello, lo abrimos y en la ventana que aparece seleccionamos la opción "Instalar certificado":

En la ventana que se abre, seleccionamos la instalación del certificado para el usuario local. Si queremos que el certificado esté disponible para todos los usuarios en la computadora, entonces deberíamos elegir la instalación del certificado en el equipo local:

Instalaremos el certificado en el almacén de certificados raíz de confianza de la CA:

Después de todas estas acciones, aceptamos todos los puntos posteriores. Ahora el sistema está configurado.
Configuración de la conexión VPN
Para configurar la conexión VPN, ve al panel de control y selecciona la opción para crear una nueva conexión.

En la ventana emergente, selecciona la opción para crear una conexión para conectar al lugar de trabajo:

En la siguiente ventana, selecciona la conexión por VPN:

e introduce los datos de la conexión VPN, así como la opción para usar una tarjeta inteligente:

La configuración no ha terminado aquí. Queda por indicar la clave compartida para el protocolo IPsec, para ello, iremos a la pestaña 'Configuración de conexiones de red' y luego a la pestaña 'Propiedades de esta conexión':

En la ventana abierta, pasaremos a la pestaña "Seguridad", estableceremos el tipo de red a "Red L2TP/IPsec" y seleccionaremos "Opciones avanzadas":

En la ventana abierta, indicaremos la clave compartida de IPsec:

Conexión
Una vez que hayas terminado la configuración, puedes intentar conectarte a la red:

Durante el proceso de conexión, se nos pedirá ingresar el PIN del token:

Hemos configurado una red VPN segura y nos hemos dado cuenta de que no es complicado.
Agradecimientos
Me gustaría agradecer una vez más a nuestros colegas Vasiliy Shokov y Alexander Smirnov por el trabajo conjunto realizado para simplificar la creación de conexiones VPN para clientes de Linux.
Fuente: habr.com
