Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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.

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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 este artículo.

Por qué este esquema cumple con los tres requisitos de una buena red VPN

  1. La fiabilidad de este esquema ha sido comprobada por el tiempo. Se ha utilizado para desplegar redes VPN desde el año 2000.
  2. La autenticación segura del usuario se garantiza mediante el protocolo PPP. La implementación estándar del protocolo PPP fue desarrollada por Paul Mackerras. 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 Jan Just Keijser en en su implementación 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.
  3. 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 un viejo proyecto de cliente L2TP para Linux 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 del nivel de seguridad 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 repositorio.

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:

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

Luego procederemos a la instalación

sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswan

Despué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-modp1024

Tambié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 strongswan

Instalación de xl2tp

sudo dnf install xl2tpd

Lo 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.ad

Reiniciemos el servicio:

sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd

Configuració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 install

Escriba 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 5000

Anote 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 -CAcreateserial

Así 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 -CAcreateserial

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

  1. generar un par de claves;
  2. tener un certificado raíz de la CA;
  3. 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  45

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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 = FALSE

A 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.req

Enví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.pem

Es 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-3

Instalación de software para trabajar con tokens

Instale la última versión de la biblioteca librtpkcs11ecp.so con del sitio web, así como bibliotecas para trabajar con tarjetas inteligentes:

sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-openssl

Conecte el Rutoken y verifique que sea reconocido por el sistema:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -l

Instalació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 install

Instalació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 install

Configuración del cliente L2tpIpsecVpn

Inicie el cliente instalado:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI.

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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

Después abrimos la pestaña Propiedades y especificamos la ruta de la clave, el certificado del cliente y la CA:
Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI
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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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 de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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 el sitio oficial.

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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:

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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.

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

En la ventana abierta, indicaremos la clave compartida de IPsec:
Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

Conexión

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP con Rutoken ECP 2.0 y Rutoken PKI

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

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