Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Problemas

Recentemente, muitos não sabiam como era trabalhar de casa. A pandemia mudou drasticamente a situação no mundo, e todos começaram a se adaptar às circunstâncias, especificamente ao fato de que sair de casa se tornou simplesmente inseguro. E muitos tiveram que rapidamente organizar o trabalho em casa para seus funcionários.

No entanto, a falta de uma abordagem adequada na escolha de soluções para o trabalho remoto pode levar a perdas irreparáveis. As senhas dos usuários podem ser roubadas, permitindo que um invasor se conecte de forma descontrolada à rede e aos recursos de TI da empresa.

É por isso que agora cresceu a necessidade de criar redes VPN corporativas confiáveis. Vou falar sobre confiável, segura e simples de usar uma rede VPN.

Ela opera segundo o esquema IPsec/L2TP, utilizando para autenticação dos clientes chaves e certificados não extraíveis armazenados em tokens, e também transmite dados pela rede de forma criptografada.

Como bancos de demonstração para configuração, foram utilizados 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.

Descrição do sistema

A VPN funcionará de acordo com o esquema IPSec + L2TP + PPP. O protocolo Point-to-Point Protocol (PPP) opera na camada de enlace do modelo OSI e fornece autenticação do usuário e criptografia dos dados transmitidos. Seus dados são encapsulados nos dados do protocolo L2TP, que na verdade estabelece a conexão na rede VPN, mas não fornece autenticação e criptografia.

Os dados do L2TP são encapsulados no protocolo IPSec, que também fornece autenticação e criptografia, mas ao contrário do protocolo PPP, a autenticação e a criptografia ocorrem no nível dos dispositivos, e não no nível dos usuários.

Essa característica permite garantir a autenticação de usuários apenas a partir de determinados dispositivos. Nós, no entanto, utilizaremos o protocolo IPSec como dado e permitiremos a autenticação de usuários a partir de qualquer dispositivo.

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

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

Informações mais detalhadas sobre o funcionamento desse esquema podem ser encontradas em este artigo.

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

  1. A confiabilidade deste esquema foi comprovada ao longo do tempo. Ele é utilizado para a implementação de redes VPN desde 2000.
  2. A autenticação segura do usuário é garantida pelo protocolo PPP. A implementação padrão do protocolo PPP foi desenvolvida por Paul Mackerras e não oferece um nível de segurança adequado, uma vez que, na melhor das hipóteses, utiliza autenticação por nome de usuário e senha. Todos nós sabemos que um nome de usuário e senha podem ser observados, adivinhados ou roubados. No entanto, já faz tempo que o desenvolvedor Jan Just Keijser em em sua implementação desse protocolo corrigiu esse problema e adicionou a possibilidade de usar protocolos de autenticação baseados em criptografia assimétrica, como o EAP-TLS. Além disso, ele introduziu a possibilidade de usar smart cards para autenticação, tornando o sistema mais seguro.
    Atualmente, há negociações ativas para a fusão desses dois projetos e pode-se ter certeza de que cedo ou tarde isso acontecerá. Por exemplo, nos repositórios do Fedora já existe uma versão patchada do PPP que usa protocolos seguros para autenticação.
  3. Apenas recentemente, essa rede poderia ser utilizada apenas por usuários do Windows, mas nossos colegas da Universidade Estatal de Moscovo, Vasily Shokov e Alexander Smirnov, encontraram um projeto antigo de cliente L2TP para Linux e o aprimoraram. Com esforços conjuntos, corrigimos muitos bugs e falhas na operação do cliente, simplificamos a instalação e configuração do sistema, mesmo ao compilar a partir do código-fonte. Os problemas mais significativos incluem:
    • Problemas de compatibilidade do antigo cliente com a interface de novas versões do openssl e qt foram corrigidos.
    • A transmissão do PIN do token pppd por meio de um arquivo temporário foi removida.
    • O lançamento inadequado do programa de solicitação de senha através da interface gráfica foi corrigido. Isso foi feito configurando o ambiente adequado para o serviço xl2tpd.
    • A compilação do daemon L2tpIpsecVpn agora é realizada junto com a compilação do próprio cliente, facilitando o processo de compilação e configuração.
    • Para facilitar o desenvolvimento, o sistema Azure Pipelines foi integrado para testar a correção da compilação.
    • Foi adicionada a capacidade de reduzir forçosamente o nível de segurança No contexto do openssl. Isso é útil para o suporte adequado a novos sistemas operacionais, onde o nível de segurança padrão está definido em 2, com redes VPN que usam certificados que não atendem aos requisitos de segurança desse nível. Esta opção será útil para trabalhar com redes VPN antigas já existentes.

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

Este cliente suporta o uso de smart cards para autenticação e oculta ao máximo todas as dificuldades da configuração desse esquema no Linux, tornando a configuração do cliente extremamente simples e rápida.

Claro, para uma comunicação conveniente entre PPP e a interface gráfica do cliente, não houve como evitar ajustes adicionais em cada um dos projetos, mas, no entanto, conseguiram minimizar e reduzir ao mínimo:

Agora podemos prosseguir com a configuração.

Configuração do servidor

Vamos instalar todos os pacotes necessários.

Instalação do strongswan (IPsec)

Primeiro, vamos configurar o firewall para trabalhar com ipsec

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

Em seguida, vamos proceder com a instalação

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

Após a instalação, é necessário definir a configuração para o strongswan (uma das implementações do IPSec). Para isso, editaremos 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

Vamos também definir uma senha comum para o acesso. A senha comum deve ser conhecida por todos os participantes da rede para autenticação. Este método é inerentemente inseguro, pois a senha pode facilmente se tornar conhecida por pessoas às quais não queremos conceder acesso à rede.
No entanto, mesmo esse fato não afetará a segurança da rede, pois a principal criptografia de dados e a autenticação de usuários são realizadas pelo protocolo PPP. Mas para ser justo, vale mencionar que o strongswan suporta tecnologias de autenticação mais seguras, como o uso de chaves privadas. Também há a possibilidade de autenticar através de smart cards, mas atualmente é suportada uma gama limitada de dispositivos, portanto, a autenticação com tokens e smart cards Rutoken é atualmente complicada. Vamos definir uma senha comum através do arquivo /etc/strongswan/ipsec.secrets:

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

Reiniciaremos o strongswan:

sudo systemctl enable strongswan
sudo systemctl restart strongswan

Instalação do xl2tp

sudo dnf install xl2tpd

Vamos configurá-lo através do arquivo /etc/xl2tpd/xl2tpd.conf:

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

[lns default]
exclusive = no
; define o endereço estático do servidor na rede virtual
local ip = 100.10.10.1
; define o intervalo de endereços virtuais
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; esta opção pode ser desativada após a configuração bem-sucedida da rede
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; indica o endereço do servidor na rede
name = centos.vpn.server.ad

Reiniciaremos o serviço:

sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd

Configuração do PPP

É recomendável instalar a versão mais recente do pppd. Para 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

Insira no arquivo /etc/ppp/options.xl2tpd o seguinte (se houver alguns valores presentes, eles podem ser removidos):

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

Emitindo 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, terminamos a configuração principal 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, é necessário registrar seu certificado na lista de confiáveis para esse cliente.

Se o usuário deseja se tornar um membro da rede VPN, ele cria um par de chaves e um pedido de certificado para este cliente. Se o usuário for confiável, o pedido pode ser assinado e o certificado resultante salvo 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 no arquivo /etc/ppp/eaptls-server para corresponder o nome do cliente ao 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ões, é melhor que: Common Name, o nome do arquivo do certificado e o nome de usuário sejam únicos.

Também é importante verificar se em outros arquivos de autenticação não aparece o nome do usuário que estamos adicionando, caso contrário, haverá problemas com o método de autenticação do usuário.

Este certificado também deve ser enviado de volta ao usuário.

Geração de 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 da CA;
  3. ter um certificado para seu par de chaves, assinado pela CA raiz.

para clientes no Linux

Para começar, vamos gerar um par de chaves no token e criar um pedido 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"

Envie o pedido gerado client.req para a CA. Depois que você receber o certificado para seu par de chaves, salve-o no token com o mesmo ID do que a 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, pois permite gerar uma chave e um certificado que serão reconhecidos corretamente por usuários do Windows e Linux, mas requer uma máquina com Windows para realizar o procedimento de geração das chaves.

Antes de gerar pedidos e importar certificados, é necessário adicionar o certificado raiz da rede VPN à lista de certificados confiáveis. Para isso, abra-o e na janela que se abre, escolha a opção "Instalar certificado":

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Na janela que se abre, escolha a instalação do certificado para o usuário local:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Instale o certificado no repositório de certificados raiz confiáveis da CA:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Após todas essas etapas, aceitamos todos os pontos a seguir. Agora o sistema está configurado.

Criaremos o 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

Em seguida, geraremos um par de chaves e criaremos um pedido de certificado. Para isso, abriremos o PowerShell e digitaremos o seguinte comando:

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

Envie o pedido criado client.req para a sua CA e aguarde a recepção do certificado client.pem. Ele pode ser gravado no token e adicionado ao repositório de certificados do Windows usando o seguinte comando:

certreq.exe -accept .client.pem

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

Configuração do cliente Ubuntu

NOTA
Neste momento, a configuração do cliente em Linux é bastante demorada, pois requer a compilação de programas individuais a partir do código-fonte. Faremos o possível para que todas as alterações sejam incluídas nos repositórios oficiais em breve.

Para garantir a conexão ao servidor em nível IPSec — utiliza-se o pacote strongswan e o daemon xl2tp. Para simplificar a conexão à rede usando cartões inteligentes – utilizaremos o pacote l2tp-ipsec-vpn, que fornece uma interface gráfica para facilitar a configuração da conexão.

Vamos montar os elementos em etapas, mas antes disso, instalaremos todos os pacotes necessários para o funcionamento do VPN:

sudo apt-get install xl2tpd strongswan libp11-3

Instalação de software para operar com tokens

Instale a versão mais recente da biblioteca librtpkcs11ecp.so com do site, bem como as 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

Instalação do ppp patchado

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

Instalação do cliente L2tpIpsecVpn

Neste momento, o cliente também precisa ser compilado a partir do código-fonte. Isso é feito com 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

Configuração do cliente L2tpIpsecVpn

Iniciamos o cliente instalado:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Após a inicialização, você deve ver o applet L2tpIpsecVPN. Clique com o botão direito sobre ele e configure a conexão:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

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

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI.

Fecharemos a janela de configurações do OpenSSL e passaremos à configuração da rede. Adicionaremos uma nova rede, clicando no botão Adicionar… na barra de configurações e digite o nome da rede:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Após isso, essa rede se tornará disponível na barra de configurações. Clicaremos com o botão direito do mouse na nova rede para configurá-la. Na primeira aba, será necessário realizar as configurações do IPsec. Vamos definir o endereço do servidor e a chave compartilhada:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Em seguida, vamos para a aba de configuração PPP e indicaremos o nome de usuário com o qual queremos acessar a rede:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Depois, abriremos a aba Propriedades e especificaremos o caminho para a chave, o certificado do cliente e a CA:
Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Fecharemos esta aba e realizaremos a configuração final, para isso, abriremos a aba "Configurações de IP" e marcaremos a opção "Obter endereço do servidor DNS automaticamente":

Configuração de autenticação na rede L2TP usando Rutoken ECP 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, fecharemos todas as abas e reiniciaremos o cliente:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Conexão à rede

Após as configurações, podemos realizar a conexão à rede. Para isso, abriremos a aba do applet e escolheremos a rede à qual queremos nos conectar:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Durante o processo de instalação da conexão, o cliente pedirá que inseramos o código PIN do Рутокен:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Se aparecer uma notificação na barra de status informando que a conexão foi estabelecida com sucesso, isso significa que as configurações foram feitas corretamente:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Caso contrário, vale a pena investigar por que a conexão não foi estabelecida. Para isso, é recomendado verificar o log do programa, selecionando no applet o comando "Informações da conexão":

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Configuração do cliente Windows

Configurar o cliente no Windows é muito mais simples do que no Linux, pois todo o software necessário já está integrado ao sistema.

Configurando o sistema

Vamos instalar todos os drivers necessários para trabalhar com os Рутокены baixando-os de do site oficial.

Importação do certificado raiz para autenticação

Vamos baixar o certificado raiz do servidor e instalá-lo no sistema. Para isso, o abriremos e, na janela que se abre, escolheremos a opção "Instalar certificado":

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Na janela que se abre, escolheremos a instalação do certificado para o usuário local. Se quiser que o certificado esteja disponível para todos os usuários no computador, então devemos escolher a instalação do certificado no computador local:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Instale o certificado no repositório de certificados raiz confiáveis da CA:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Após todas essas etapas, aceitamos todos os pontos a seguir. Agora o sistema está configurado.

Configuração da conexão VPN

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

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

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

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Na próxima janela, escolha a conexão via VPN:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

e insira os dados da conexão VPN, além de indicar a opção para utilizar o cartão inteligente:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Aqui a configuração não está concluída. É necessário indicar a chave compartilhada para o protocolo IPsec, para isso, vamos para a aba "Configurações de Conexões de Rede" e depois para a aba "Propriedades desta Conexão":

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Na janela aberta, vá para a aba "Segurança", selecione como tipo de rede "Rede L2TP/IPsec" e escolha "Opções Avançadas":

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Na janela que se abre, insira a chave compartilhada IPsec:
Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Conexão

Após concluir a configuração, você pode tentar se conectar à rede:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Durante o processo de conexão, será solicitado que você insira o PIN do token:

Configuração de autenticação na rede L2TP usando Rutoken ECP 2.0 e Rutoken PKI

Nós configuramos uma rede VPN segura e confirmamos que isso não é complicado.

Agradecimentos

Gostaria de agradecer novamente aos nossos colegas Vasily Shokov e Alexander Smirnov pelo trabalho conjunto para simplificar a criação de conexões VPN para clientes Linux.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster