Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Problemas

Recientemente, muchos no sabían lo que era trabajar desde casa. La pandemia ha cambiado drásticamente la situación en el mundo, todos han comenzado a adaptarse a las circunstancias actuales, es decir, al hecho de que salir de casa se ha vuelto simplemente inseguro. Y muchos tuvieron que organizar rápidamente el trabajo desde casa para sus empleados.

Sin embargo, la falta de un enfoque competente a la hora de elegir soluciones para el trabajo a distancia puede provocar pérdidas irreversibles. Las contraseñas de los usuarios pueden ser robadas, lo que permitirá que un atacante se conecte sin control a la red y a los recursos de TI de la empresa.

Es por eso que ahora ha aumentado la necesidad de crear redes VPN corporativas confiables. te contaré sobre confiable, seguro и simple en el uso de una red VPN.

Funciona según el esquema IPsec/L2TP, que utiliza claves no recuperables y certificados almacenados en tokens para autenticar a los clientes y también transmite datos a través de la red en forma cifrada.

Como soporte de demostración para la configuración 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.

Descripción del sistema

La VPN funcionará según el esquema IPSec + L2TP + PPP. Protocolo Protocolo punto a punto (PPP) opera en la capa de enlace de datos del modelo OSI y proporciona autenticación de usuario y cifrado de los datos transmitidos. Sus datos están encapsulados en los datos del protocolo L2TP, que en realidad garantiza la creación de una conexión en la red VPN, pero no proporciona autenticación ni cifrado.

Los datos L2TP están encapsulados en IPSec, que también proporciona autenticación y cifrado, pero a diferencia de PPP, la autenticación y el cifrado se producen a nivel de dispositivo, no a nivel de usuario.

Esta función le permite autenticar usuarios solo desde ciertos dispositivos. Usaremos el protocolo IPSec tal como está y permitiremos la autenticación de usuarios desde cualquier dispositivo.

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

La autenticación de usuarios mediante tarjetas inteligentes se realizará a nivel de protocolo PPP utilizando el protocolo EAP-TLS.

Puede encontrar información más detallada sobre el funcionamiento de este circuito 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 probada por el tiempo. Se ha utilizado para implementar redes VPN desde el año 2000.
  2. La autenticación segura del usuario la proporciona el protocolo PPP. Implementación estándar del protocolo PPP desarrollado por Paul Mackerras no proporciona un nivel suficiente de seguridad, porque Para la autenticación, en el mejor de los casos, se utiliza la autenticación mediante un nombre de usuario y una contraseña. Todos sabemos que una contraseña de inicio de sesión puede ser espiada, adivinada o robada. Sin embargo, desde hace mucho tiempo el desarrollador Jan Just Keijser в su implementación Este protocolo corrigió este problema y agregó la capacidad de utilizar protocolos basados ​​en cifrado asimétrico, como EAP-TLS, para la autenticación. Además, añadió la posibilidad de utilizar tarjetas inteligentes para la autenticación, lo que hizo que el sistema fuera más seguro.
    Actualmente, se están llevando a cabo negociaciones activas para fusionar estos dos proyectos y puede estar seguro de que tarde o temprano esto sucederá de todos modos. Por ejemplo, una versión parcheada de PPP ha estado en los repositorios de Fedora durante mucho tiempo y utiliza protocolos seguros para la autenticación.
  3. Hasta hace poco, esta red sólo podía ser utilizada por usuarios de Windows, pero nuestros colegas de la Universidad Estatal de Moscú Vasily Shokov y Alexander Smirnov descubrieron antiguo proyecto de cliente L2TP para Linux y lo modificó. Juntos, solucionamos muchos errores y deficiencias en el trabajo del cliente, simplificamos la instalación y configuración del sistema, incluso cuando lo construimos desde el código fuente. Los más significativos de ellos son:
    • Se corrigieron problemas de compatibilidad del cliente antiguo con la interfaz de las nuevas versiones de openssl y qt.
    • Se eliminó pppd para que no pasara el PIN del token 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 hizo instalando el entorno correcto para el servicio xl2tpd.
    • La compilación del demonio L2tpIpsecVpn ahora se lleva a cabo junto con la compilación del propio cliente, lo que simplifica el proceso de compilación y configuración.
    • Para facilitar el desarrollo, el sistema Azure Pipelines está conectado para probar la corrección de la compilación.
    • Se agregó la capacidad de forzar la degradación. nivel de seguridad en el contexto de openssl. Esto es útil para soportar correctamente 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 existentes.

La versión corregida se puede encontrar en este repositorio.

Este cliente admite el uso de tarjetas inteligentes para la autenticación y también oculta en la medida de lo posible todas las dificultades y dificultades de configurar este esquema en Linux, lo que hace 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 GUI del cliente, no fue posible sin ediciones adicionales en cada uno de los proyectos, pero aún así se minimizaron y redujeron al mínimo:

Ahora puedes empezar a configurar.

Ajuste del servidor

Instalemos todos los paquetes necesarios.

Instalación de strongswan (IPsec)

Primero que nada, configuremos el firewall para que funcione con ipsec.

sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reload

Entonces comencemos la instalación.

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

Después de la instalación, debe configurar strongswan (una de las implementaciones de IPSec). Para hacer esto, edite 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 de inicio de sesión común. La contraseña compartida debe ser conocida por todos los participantes de la red para la autenticación. Evidentemente este método no es fiable porque esta contraseña puede llegar a ser fácilmente conocida por personas a las que no queremos proporcionar acceso a la red.
Sin embargo, incluso este hecho no afectará la seguridad de la red, porque El cifrado de datos básico y la autenticación del usuario se realiza mediante el protocolo PPP. Pero para ser justos, vale la pena señalar que strongswan admite tecnologías de autenticación más seguras, por ejemplo, el uso de claves privadas. Strongswan también tiene la capacidad de proporcionar autenticación mediante tarjetas inteligentes, pero hasta ahora solo se admite una gama limitada de dispositivos y, por lo tanto, la autenticación mediante tokens Rutoken y tarjetas inteligentes sigue siendo difícil. Establezcamos una contraseña general a través de un 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

Configurémoslo vía archivo. /etc/xl2tpd/xl2tpd.conf:

[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes

[lns default]
exclusive = no
; определяет статический адрес сервера в виртуальной сети
local ip = 100.10.10.1
; задает диапазон виртуальных адресов
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; данную опцию можно отключить после успешной настройки сети
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; указывает адрес сервера в сети
name = centos.vpn.server.ad

Reiniciemos el servicio:

sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd

configuración de APP

Es recomendable instalar la última versión de pppd. Para hacer esto, ejecute 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

escribir al archivo /etc/ppp/options.xl2tpd lo siguiente (si hay algún valor allí, puede eliminarlo):

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

Emitimos 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

Por lo tanto, hemos terminado con la configuración básica del servidor. El resto de la configuración del servidor implica agregar nuevos clientes.

Agregar un nuevo cliente

Para agregar un nuevo cliente a la red, debe agregar su certificado a la lista de confiables para este cliente.

Si un usuario quiere convertirse en miembro de una red VPN, crea un par de claves y una solicitud de certificado para este cliente. Si el usuario es de confianza, entonces se puede firmar esta aplicación y el certificado resultante se puede escribir 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 al archivo /etc/ppp/eaptls-server para que coincida con el nombre del cliente y 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 evitar confusiones, es mejor que: el nombre común, el nombre del archivo del certificado y el nombre de usuario sean únicos.

También vale la pena comprobar que el nombre del usuario que estamos agregando no aparece en ningún otro archivo de autenticación, de lo contrario habrá problemas con la forma en que se autentica el usuario.

El mismo certificado debe devolverse al usuario.

Generando 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 CA;
  3. tener un certificado para su par de claves firmado por la CA raíz.

para cliente en Linux

Primero, generemos un par de claves en el token y creemos una aplicación para el 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íe la aplicación client.req que aparece a la CA. Una vez que reciba un certificado para su par de claves, escríbalo en un token con la misma identificación que la clave:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id  45

para clientes Windows y Linux (método más universal)

Este método es más universal porque le permite generar una clave y un certificado que los usuarios de Windows y Linux reconocerán con éxito, pero requiere una máquina con Windows para llevar a cabo el procedimiento de generación de claves.

Antes de generar solicitudes e importar certificados, debe agregar el certificado raíz de la red VPN a la lista de los confiables. Para ello ábrelo y en la ventana que se abre selecciona la opción “Instalar certificado”:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

En la ventana que se abre, seleccione instalar un certificado para el usuario local:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Instalemos el certificado en el almacén de certificados raíz confiable de la CA:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Después de todas estas acciones, estamos de acuerdo con todos los demás puntos. El sistema ahora está configurado.

Creemos un 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

Después de esto, generaremos un par de claves y crearemos una solicitud para el certificado. Para hacer esto, abra powershell e ingrese el siguiente comando:

certreq.exe -new -pin $PIN .cert.tmp .client.req

Envíe la aplicación client.req creada a su CA y espere a que se reciba el certificado client.pem. Puede escribirse en un token y agregarse al almacén de certificados de Windows mediante el siguiente comando:

certreq.exe -accept .client.pem

Vale la pena señalar que se pueden reproducir acciones similares utilizando la interfaz gráfica del programa mmc, pero este método requiere más tiempo y es menos programable.

Configurando el cliente Ubuntu

NOTA
Actualmente, configurar un cliente en Linux lleva bastante tiempo, porque... Requiere construir programas separados desde la fuente. Intentaremos asegurarnos de que todos los cambios se incluyan en los repositorios oficiales en un futuro próximo.

Para garantizar la conexión a nivel IPSec con el servidor, se utilizan el paquete strongswan y el demonio xl2tp. Para simplificar la conexión a la red mediante tarjetas inteligentes, utilizaremos el paquete l2tp-ipsec-vpn, que proporciona un shell gráfico para una configuración de conexión simplificada.

Empecemos a montar los elementos paso a paso, pero antes instalaremos todos los paquetes necesarios para que la VPN funcione directamente:

sudo apt-get install xl2tpd strongswan libp11-3

Instalación de software para trabajar con tokens

Instale la última biblioteca librtpkcs11ecp.so desde сайта, también bibliotecas para trabajar con tarjetas inteligentes:

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

Conecte 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

Por el momento, el cliente también debe compilarse a partir del código fuente. Esto se hace usando 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

Configurando el cliente L2tpIpsecVpn

Inicie el cliente instalado:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Después del lanzamiento, debería abrirse el subprograma L2tpIpsecVPN. Haga clic derecho sobre él y configure la conexión:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Para trabajar con tokens, en primer lugar indicamos la ruta al motor opensc del motor OpenSSL y a la biblioteca PKCS#11. Para hacer esto, abra la pestaña "Preferencias" para configurar los parámetros de openssl:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI.

Cerremos la ventana de configuración de OpenSSL y pasemos a configurar la red. Agreguemos una nueva red haciendo clic en el botón Agregar... en el panel de configuración e ingresemos el nombre de la red:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Después de esto, esta red estará disponible en el panel de configuración. Haga doble clic derecho en la nueva red para configurarla. En la primera pestaña debe realizar la configuración de IPsec. Configuremos la dirección del servidor y la clave pública:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Después de esto, vamos a la pestaña de configuración de PPP e indicamos allí el nombre de usuario con el que queremos acceder a la red:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Después de esto, abra la pestaña Propiedades y especifique la ruta a la clave, el certificado del cliente y la CA:
Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Cerremos esta pestaña y realicemos la configuración final; para hacer esto, abra la pestaña "Configuración de IP" y marque la casilla junto a la opción "Obtener la dirección del servidor DNS automáticamente":

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI
Esta opción permitirá al cliente recibir una dirección IP personal dentro de la red desde el servidor.

Después de todas las configuraciones, cierre todas las pestañas y reinicie el cliente:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Conectándose a la red

Después de la configuración, puede conectarse a la red. Para ello abrimos la pestaña del subprograma y seleccionamos la red a la que queremos conectarnos:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Durante el proceso de establecimiento de conexión, el cliente nos solicitará que introduzcamos el código PIN de Rutoken:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

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

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

De lo contrario, vale la pena averiguar por qué no se estableció la conexión. Para hacer esto, debe mirar el registro del programa seleccionando el comando "Información de conexión" en el subprograma:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Configurar el cliente de Windows

Configurar un cliente en Windows es mucho más fácil que en Linux, porque... 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 desde de. sitio.

Importación de un certificado raíz para autenticación

Descargue el certificado raíz del servidor e instálelo en el sistema. Para ello ábrelo y en la ventana que se abre selecciona la opción “Instalar certificado”:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

En la ventana que se abre, seleccione instalar un certificado para el usuario local. Si desea que el certificado esté disponible para todos los usuarios de la computadora, debe optar por instalar el certificado en la computadora local:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Instalemos el certificado en el almacén de certificados raíz confiable de la CA:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Después de todas estas acciones, estamos de acuerdo con todos los demás puntos. El sistema ahora está configurado.

Configurar una conexión VPN

Para configurar una conexión VPN, vaya al panel de control y seleccione la opción para crear una nueva conexión.

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

En la ventana emergente, seleccione la opción para crear una conexión para conectarse a su lugar de trabajo:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

En la siguiente ventana, seleccione una conexión VPN:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

e ingrese los detalles de la conexión VPN, y también especifique la opción de usar una tarjeta inteligente:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

La configuración aún no está completa. Sólo queda especificar la clave compartida para el protocolo IPsec, para ello vaya a la pestaña “Configuración de conexión de red” y luego vaya a la pestaña “Propiedades para esta conexión”:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

En la ventana que se abre, vaya a la pestaña "Seguridad", especifique "Red L2TP/IPsec" como tipo de red y seleccione "Configuración avanzada":

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

En la ventana que se abre, especifique la clave IPsec compartida:
Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Подключение

Después de completar la configuración, puede intentar conectarse a la red:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Durante el proceso de conexión, se nos pedirá que introduzcamos el código PIN del token:

Configuración de autenticación en la red L2TP usando Rutoken EDS 2.0 y Rutoken PKI

Hemos configurado una red VPN segura y nos hemos asegurado de que no sea difícil.

Agradecimientos

Me gustaría agradecer una vez más a nuestros colegas Vasily Shokov y Alexander Smirnov por el trabajo que han realizado juntos para simplificar la creación de conexiones VPN para clientes Linux.

Fuente: habr.com

Añadir un comentario