Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Problemas

Recentemente, muitos não sabiam o que era trabalhar em casa. A pandemia alterou drasticamente a situação no mundo; todos começaram a adaptar-se às circunstâncias actuais, nomeadamente ao facto de se ter tornado simplesmente inseguro sair de casa. E muitos tiveram que organizar rapidamente o trabalho de casa para seus funcionários.

Porém, a falta de uma abordagem competente na escolha de soluções para trabalho remoto pode levar a perdas irreversíveis. As senhas dos usuários podem ser roubadas e isso permitirá que um invasor se conecte de forma incontrolável à rede e aos recursos de TI da empresa.

É por isso que a necessidade de criar redes VPN corporativas confiáveis ​​aumentou agora. Eu vou te contar sobre confiável, seguro и simples ao usar uma rede VPN.

Funciona de acordo com o esquema IPsec/L2TP, que utiliza chaves não recuperáveis ​​e certificados armazenados em tokens para autenticar clientes, e também transmite dados pela rede de forma criptografada.

Um servidor com CentOS 7 (endereço: centos.vpn.server.ad) e um cliente com Ubuntu 20.04, além de um cliente com Windows 10, foram utilizados como stands de demonstração para configuração.

Descrição do sistema

A VPN funcionará de acordo com o esquema IPSec + L2TP + PPP. Protocolo Protocolo ponto a ponto (PPP) opera na camada de enlace de dados do modelo OSI e fornece autenticação de usuário e criptografia de dados transmitidos. Seus dados são encapsulados nos dados do protocolo L2TP, que na verdade garante a criação de uma conexão na rede VPN, mas não fornece autenticação e criptografia.

Os dados L2TP são encapsulados em IPSec, que também fornece autenticação e criptografia, mas diferentemente do PPP, a autenticação e a criptografia ocorrem no nível do dispositivo, não no nível do usuário.

Este recurso permite autenticar usuários apenas de determinados dispositivos. Usaremos o protocolo IPSec tal como está e permitiremos a autenticação do usuário a partir de qualquer dispositivo.

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

A autenticação do usuário usando cartões inteligentes será realizada no nível do protocolo PPP usando o protocolo EAP-TLS.

Informações mais detalhadas sobre o funcionamento deste circuito podem ser encontradas em Este artigo.

Por que este esquema atende a todos os três requisitos de uma boa rede VPN?

  1. A confiabilidade deste esquema foi testada pelo tempo. Ele tem sido usado para implantar redes VPN desde 2000.
  2. A autenticação segura do usuário é fornecida pelo protocolo PPP. Implementação padrão do protocolo PPP desenvolvido por Paul Mackerras não oferece um nível de segurança suficiente, porque Para autenticação, na melhor das hipóteses, é usada autenticação usando login e senha. Todos sabemos que uma senha de login pode ser espionada, adivinhada ou roubada. No entanto, há muito tempo o desenvolvedor Jan Just Keijser в sua implementação Este protocolo corrigiu esse problema e adicionou a capacidade de usar protocolos baseados em criptografia assimétrica, como EAP-TLS, para autenticação. Além disso, ele adicionou a capacidade de usar cartões inteligentes para autenticação, o que tornou o sistema mais seguro.
    Atualmente, estão em andamento negociações ativas para fundir esses dois projetos e você pode ter certeza de que mais cedo ou mais tarde isso acontecerá de qualquer maneira. Por exemplo, uma versão corrigida do PPP está nos repositórios do Fedora há muito tempo, usando protocolos seguros para autenticação.
  3. Até recentemente, esta rede só podia ser usada por usuários do Windows, mas nossos colegas da Universidade Estadual de Moscou, Vasily Shokov e Alexander Smirnov, descobriram antigo projeto cliente L2TP para Linux e modificou-o. Juntos, corrigimos muitos bugs e deficiências no trabalho do cliente, simplificamos a instalação e configuração do sistema, mesmo na construção a partir do código-fonte. Os mais significativos deles são:
    • Corrigidos problemas de compatibilidade do cliente antigo com a interface das novas versões do openssl e qt.
    • Removido o pppd de passar o PIN do token através de um arquivo temporário.
    • Corrigido lançamento incorreto do programa de solicitação de senha através da interface gráfica. Isso foi feito instalando o ambiente correto para o serviço xl2tpd.
    • A construção do daemon L2tpIpsecVpn agora é realizada em conjunto com a construção do próprio cliente, o que simplifica o processo de construção e configuração.
    • Para facilitar o desenvolvimento, o sistema Azure Pipelines está conectado para testar a exatidão do build.
    • Adicionada a capacidade de forçar o downgrade nível de segurança no contexto do openssl. Isto é útil para suportar corretamente novos sistemas operacionais onde o nível de segurança padrão está definido como 2, com redes VPN que utilizam certificados que não atendem aos requisitos de segurança deste nível. Esta opção será útil para trabalhar com redes VPN antigas existentes.

A versão corrigida pode ser encontrada em este repositório.

Este cliente suporta o uso de cartões inteligentes para autenticação e também oculta ao máximo todas as dificuldades e dificuldades de configuração deste esquema no Linux, tornando a configuração do cliente o mais simples e rápida possível.

É claro que para uma conexão conveniente entre o PPP e a GUI do cliente não foi possível sem edições adicionais em cada um dos projetos, mas mesmo assim elas foram minimizadas e reduzidas ao mínimo:

Agora você pode começar a configurar.

Ajuste do servidor

Vamos instalar todos os pacotes necessários.

Instalando o Strongswan (IPsec)

Primeiramente vamos configurar o firewall para operação ipsec

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

Então vamos começar a instalação

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

Após a instalação, você precisa configurar o Strongswan (uma das implementações IPSec). Para fazer isso, edite o arquivo /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

Também definiremos uma senha de login comum. A senha compartilhada deve ser conhecida por todos os participantes da rede para autenticação. Este método obviamente não é confiável, porque esta senha pode facilmente se tornar conhecida por indivíduos a quem não queremos fornecer acesso à rede.
Porém, mesmo este fato não afetará a segurança da rede, pois A criptografia básica de dados e a autenticação do usuário são realizadas pelo protocolo PPP. Mas, para ser justo, vale a pena notar que o Strongswan suporta tecnologias de autenticação mais seguras, por exemplo, usando chaves privadas. Strongswan também tem a capacidade de fornecer autenticação usando cartões inteligentes, mas até agora apenas uma gama limitada de dispositivos é suportada e, portanto, a autenticação usando tokens Rutoken e cartões inteligentes ainda é difícil. Vamos definir uma senha geral via arquivo /etc/strongswan/ipsec.secrets:

# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"

Vamos reiniciar o Strongswan:

sudo systemctl enable strongswan
sudo systemctl restart strongswan

Instalando xl2tp

sudo dnf install xl2tpd

Vamos configurá-lo via arquivo /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

Vamos reiniciar o serviço:

sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd

Configuração PPP

É aconselhável instalar a versão mais recente do pppd. Para fazer isso, execute a seguinte sequência 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

Escreva no arquivo /etc/ppp/options.xl2tpd o seguinte (se houver algum valor lá, você pode excluí-lo):

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 o certificado raiz e o certificado do 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

Assim, concluímos a configuração básica do servidor. O restante da configuração do servidor envolve a adição de novos clientes.

Adicionando um novo cliente

Para adicionar um novo cliente à rede, você deve adicionar seu certificado à lista de certificados confiáveis ​​deste cliente.

Se um usuário quiser se tornar membro de uma rede VPN, ele cria um par de chaves e um aplicativo de certificado para esse cliente. Se o usuário for confiável, esse aplicativo poderá ser assinado e o certificado resultante poderá ser gravado no diretório 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

Vamos adicionar uma linha ao arquivo /etc/ppp/eaptls-server para corresponder ao nome do cliente e seu 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 confusão, é melhor que: Nome comum, nome do arquivo de certificado e nome de usuário sejam exclusivos.

Também vale a pena verificar se o nome do usuário que estamos adicionando não aparece em nenhum outro arquivo de autenticação, caso contrário haverá problemas na forma como o usuário é autenticado.

O mesmo certificado deve ser enviado de volta ao usuário.

Gerando um par de chaves e certificado

Para uma autenticação bem-sucedida, o cliente deve:

  1. gerar um par de chaves;
  2. ter um certificado raiz CA;
  3. tenha um certificado para seu par de chaves assinado pela CA raiz.

para cliente no Linux

Primeiro, vamos gerar um par de chaves no token e criar uma aplicação para o 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"

Envie o aplicativo client.req que aparece para a CA. Depois de receber um certificado para seu par de chaves, grave-o em um token com o mesmo ID da chave:

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

para clientes Windows e Linux (método mais universal)

Este método é mais universal porque permite gerar uma chave e um certificado que serão reconhecidos com sucesso pelos usuários de Windows e Linux, mas requer uma máquina Windows para realizar o procedimento de geração de chave.

Antes de gerar solicitações e importar certificados, você deve adicionar o certificado raiz da rede VPN à lista de certificados confiáveis. Para isso, abra-o e na janela que se abre selecione a opção “Instalar certificado”:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Na janela que é aberta, selecione instalar um certificado para o usuário local:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Vamos instalar o certificado no armazenamento de certificados raiz confiável da CA:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Depois de todas essas ações, concordamos com todos os outros pontos. O sistema agora está configurado.

Vamos criar um arquivo cert.tmp com o seguinte conteúdo:

[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

Depois disso, geraremos um par de chaves e criaremos um pedido para o certificado. Para fazer isso, abra o PowerShell e digite o seguinte comando:

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

Envie o aplicativo client.req criado para sua CA e aguarde o recebimento do certificado client.pem. Ele pode ser gravado em um token e adicionado ao armazenamento de certificados do Windows usando o seguinte comando:

certreq.exe -accept .client.pem

Vale ressaltar que ações semelhantes podem ser reproduzidas utilizando a interface gráfica do programa mmc, mas este método é mais demorado e menos programável.

Configurando o cliente Ubuntu

NOTA
Configurar um cliente no Linux atualmente consome muito tempo, porque... requer a construção de programas separados da fonte. Tentaremos garantir que todas as alterações sejam incluídas nos repositórios oficiais num futuro próximo.

Para garantir a conexão no nível IPSec ao servidor, são usados ​​o pacote strongswan e o daemon xl2tp. Para simplificar a conexão à rede usando cartões inteligentes, usaremos o pacote l2tp-ipsec-vpn, que fornece um shell gráfico para configuração simplificada da conexão.

Vamos começar a montar os elementos passo a passo, mas antes instalaremos todos os pacotes necessários para que a VPN funcione diretamente:

sudo apt-get install xl2tpd strongswan libp11-3

Instalando software para trabalhar com tokens

Instale a biblioteca librtpkcs11ecp.so mais recente em сайта, também bibliotecas para trabalhar com cartões inteligentes:

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

Conecte o Rutoken e verifique se ele é reconhecido pelo sistema:

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

Instalando ppp corrigido

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

Instalando o cliente L2tpIpsecVpn

No momento, o cliente também precisa ser compilado a partir do código-fonte. Isso é feito usando a seguinte sequência 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 o cliente L2tpIpsecVpn

Inicie o cliente instalado:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Após o lançamento, o miniaplicativo L2tpIpsecVPN deve abrir. Clique com o botão direito nele e configure a conexão:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Para trabalhar com tokens, primeiramente indicamos o caminho do motor opensc do OpenSSL e da biblioteca PKCS#11. Para fazer isso, abra a guia "Preferências" para configurar os parâmetros do openssl:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI.

Vamos fechar a janela de configurações do OpenSSL e prosseguir com a configuração da rede. Vamos adicionar uma nova rede clicando no botão Adicionar... no painel de configurações e digitando o nome da rede:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Depois disso, esta rede ficará disponível no painel de configurações. Clique duas vezes com o botão direito na nova rede para configurá-la. Na primeira aba você precisa fazer as configurações do IPsec. Vamos definir o endereço do servidor e a chave pública:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Depois disso, vá até a aba de configurações do PPP e indique ali o nome de usuário com o qual queremos acessar a rede:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Depois disso, abra a guia Propriedades e especifique o caminho para a chave, certificado do cliente e CA:
Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Vamos fechar esta aba e realizar as configurações finais; para isso, abra a aba “Configurações de IP” e marque a caixa ao lado da opção “Obter endereço do servidor DNS automaticamente”:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI
Esta opção permitirá que o cliente receba do servidor um endereço IP pessoal dentro da rede.

Após todas as configurações, feche todas as abas e reinicie o cliente:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Conectando-se à rede

Após as configurações, você pode se conectar à rede. Para fazer isso, abra a aba do miniaplicativo e selecione a rede à qual queremos nos conectar:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Durante o processo de estabelecimento da conexão, o cliente solicitará a inserção do código PIN Rutoken:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Se aparecer uma notificação na barra de status informando que a conexão foi estabelecida com sucesso, significa que a configuração foi bem-sucedida:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Caso contrário, vale a pena descobrir por que a conexão não foi estabelecida. Para fazer isso, você deve consultar o log do programa selecionando o comando "Informações de conexão" no miniaplicativo:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Configurando o cliente Windows

Configurar um cliente no Windows é muito mais fácil do que no Linux, porque... Todo o software necessário já está integrado ao sistema.

Configuração do sistema

Instalaremos todos os drivers necessários para trabalhar com Rutokens baixando-os em de. site.

Importando um certificado raiz para autenticação

Baixe o certificado raiz do servidor e instale-o no sistema. Para isso, abra-o e na janela que se abre selecione a opção “Instalar certificado”:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Na janela que é aberta, selecione instalar um certificado para o usuário local. Se quiser que o certificado esteja disponível para todos os usuários no computador, você deverá optar por instalar o certificado no computador local:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Vamos instalar o certificado no armazenamento de certificados raiz confiável da CA:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Depois de todas essas ações, concordamos com todos os outros pontos. O sistema agora está configurado.

Configurando uma conexão VPN

Para configurar uma conexão VPN, acesse o painel de controle e selecione a opção de criar uma nova conexão.

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Na janela pop-up, selecione a opção de criar uma conexão para se conectar ao seu local de trabalho:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Na próxima janela, selecione uma conexão VPN:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

e insira os detalhes da conexão VPN e também especifique a opção de usar um cartão inteligente:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

A configuração ainda não está concluída. Resta especificar a chave compartilhada para o protocolo IPsec, para isso vá até a aba “Configurações de conexão de rede” e depois vá até a aba “Propriedades desta conexão”:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Na janela que se abre, vá até a aba “Segurança”, especifique “Rede L2TP/IPsec” como o tipo de rede e selecione “Configurações avançadas”:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Na janela que é aberta, especifique a chave IPsec compartilhada:
Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Подключение

Depois de concluir a configuração, você pode tentar conectar-se à rede:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Durante o processo de conexão, seremos solicitados a inserir o código PIN do token:

Configurando autenticação na rede L2TP usando Rutoken EDS 2.0 e Rutoken PKI

Configuramos uma rede VPN segura e garantimos que não seja difícil.

Agradecimentos

Gostaria de agradecer mais uma vez aos nossos colegas Vasily Shokov e Alexander Smirnov pelo trabalho que realizaram juntos para simplificar a criação de conexões VPN para clientes Linux.

Fonte: habr.com

Adicionar um comentário