
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.

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 .
Por que esse esquema atende a todos os três requisitos de uma boa rede VPN
- A confiabilidade deste esquema foi comprovada ao longo do tempo. Ele é utilizado para a implementação de redes VPN desde 2000.
- A autenticação segura do usuário é garantida pelo protocolo PPP. 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 em 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. - 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 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 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 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:
- Corrigido
- Corrigido . Este erro impedia o carregamento de informações do arquivo local /etc/ppp/openssl.cnf com a configuração, exceto por dados sobre os motores openssl para trabalhar com smart cards, o que causava sérios inconvenientes, caso, por exemplo, além das informações dos motores, quiséssemos definir algo mais. Por exemplo, fixar o nível de segurança ao estabelecer a conexão.
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 --reloadEm seguida, vamos proceder com a instalação
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanApó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-modp1024Vamos 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 strongswanInstalação do xl2tp
sudo dnf install xl2tpdVamos 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.adReiniciaremos o serviço:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdConfiguraçã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 installInsira 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 5000Emitindo 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 -CAcreateserialAssim, 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 -CAcreateserialVamos 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:
- gerar um par de chaves;
- ter um certificado raiz da CA;
- 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 45para 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":

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

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

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 = FALSEEm 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.reqEnvie 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.pemVale 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-3Instalação de software para operar com tokens
Instale a versão mais recente da biblioteca librtpkcs11ecp.so com , bem como as bibliotecas para trabalhar com cartões inteligentes:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslConecte o Rutoken e verifique se ele é reconhecido pelo sistema:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstalaçã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 installInstalaçã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 installConfiguração do cliente L2tpIpsecVpn
Iniciamos o cliente instalado:

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

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

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:

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

Depois, abriremos a aba Propriedades e especificaremos o caminho para a chave, o certificado do cliente e a CA:

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

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:

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:

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

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:

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

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:

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

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.

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

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

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

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

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

Na janela que se abre, insira a chave compartilhada IPsec:

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

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

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
