ProHoster > Blog > administração > 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.
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?
A confiabilidade deste esquema foi testada pelo tempo. Ele tem sido usado para implantar redes VPN desde 2000.
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.
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.
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:
Fixo erro na ordem de carregamento da configuração e inicialização do contexto openssl. Este erro não nos permitiu carregar nada do arquivo de configuração local /etc/ppp/openssl.cnf exceto informações sobre motores openssl para trabalhar com cartões inteligentes, o que era um sério inconveniente se, por exemplo, além de informações sobre motores, queríamos definir algo diferente. Por exemplo, corrija o nível de segurança ao estabelecer uma conexão.
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
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:
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
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:
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:
gerar um par de chaves;
ter um certificado raiz CA;
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:
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:
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”:
Na janela que é aberta, selecione instalar um certificado para o usuário local:
Vamos instalar o certificado no armazenamento de certificados raiz confiável da CA:
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:
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 -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:
Após o lançamento, o miniaplicativo L2tpIpsecVPN deve abrir. Clique com o botão direito nele e configure a conexão:
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:
.
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:
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:
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:
Depois disso, abra a guia Propriedades e especifique o caminho para a chave, certificado do cliente e CA:
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”:
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:
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:
Durante o processo de estabelecimento da conexão, o cliente solicitará a inserção do código PIN Rutoken:
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:
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 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”:
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:
Vamos instalar o certificado no armazenamento de certificados raiz confiável da CA:
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.
Na janela pop-up, selecione a opção de criar uma conexão para se conectar ao seu local de trabalho:
Na próxima janela, selecione uma conexão VPN:
e insira os detalhes da conexão VPN e também especifique a opção de usar um cartão inteligente:
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”:
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”:
Na janela que é aberta, especifique a chave IPsec compartilhada:
Подключение
Depois de concluir a configuração, você pode tentar conectar-se à rede:
Durante o processo de conexão, seremos solicitados a inserir o código PIN do token:
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.