Olá!
A cada empresa, mais cedo ou mais tarde, torna-se necessário ter acesso remoto.
Praticamente todo profissional de TI se depara com a necessidade de organizar o acesso remoto às suas redes.
Assim como muitos, eu fui pego por essa necessidade com a etiqueta de 'ontem'. Após analisar todos os 'prós' e 'contras', além de vasculhar toneladas de informações e arranhar um pouco a teoria, decidi começar a instalação.
Para segurança, escolhi o OpenVPN na seguinte configuração: em um servidor com o sistema operacional Windows Server 2012, criei uma máquina virtual com Windows Server 2012, e nela, por sua vez, instalei o servidor OpenVPN, que gerava e assinava certificados.
Para facilitar, chamaremos isso de 'servidor de certificação'. Em seguida, peguei o certificado do servidor, coloquei no Mikrotik, e no próprio roteador Mikrotik configurei o OpenVPN com contas e perfis. Para emitir o certificado do cliente, também usei o servidor de certificação.
A implementação, claro, era precária, e embora na época minha experiência com esse tipo de coisa fosse, vamos dizer, inadequada em termos de segurança, não era a pior solução.
Essa configuração funcionou por um tempo e recebi uma nova orientação: transferir o servidor de certificação para o Linux, mantendo a conexão com o Mikrotik — os clientes não deveriam ser afetados.
Meu conhecimento em Linux na época se restringia ao Ubuntu 16.04 LTS com interface gráfica, que era utilizado como terminal para conectar via RDP ao servidor Windows. Ou seja, sudo apt-get -f install -y, e nada mais.
Após investigar qual sistema operacional da família Linux seria mais robusto e promissor para a minha organização, decidi-me pelo CentOS 7 Minimal.
Primeiro, decidi estudar um pouco a teoria, entender como tudo isso funciona. Assistia vídeos tutoriais no canal (Não é publicidade, simplesmente foi o primeiro que encontrei). Uma moça com uma voz agradável me apresentou os fundamentos do funcionamento no sistema operacional escolhido.
Para começar, eu executei o Hyper-V no meu computador, instalei o CentOS 7 Minimal, durante a instalação criei um usuário Admin e fechei completamente o ssh para o root. Após me despedir da bela tela colorida, mergulhei no mundo preto e branco do terminal.
Acredito que não faz sentido descrever o processo de instalação do software, melhor focar nas dificuldades que surgiram durante o processo e para a solução das quais precisei escrever um pequeno script (ele está abaixo. A descrição de cada uma das utilidades pode ser encontrada na internet, mas na época em que fiz tudo isso, esse script ainda não existia, tudo estava sendo feito pela primeira vez, às cegas e no improviso).
No script, procurei automatizar a instalação das utilidades mínimas necessárias para o servidor, desativar o Selinux, conectar o repositório Epel, instalar o OpenVPN, etc. Abaixo está o próprio script, ele é simples, mas pode ser utilizado. Não vou explicar ele, mas se alguém precisar, escreva que vou responder.
Após o uso do script, haverá um servidor OpenVPN já configurado, piscando com uma luz verde.
#!/bin/bash
cd /etc/sysconfig/
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' selinux
sudo setenforce 0
cd /home/Admin
sudo yum update -y
sudo yum install epel-release -y
sudo yum install mc -y
sudo yum install nano -y
sudo cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax
sudo yum install chrony -y
sudo systemctl start chronyd
sudo systemctl enable chronyd
sudo yum install net-tools -y
sudo yum install iftop -y
sudo yum install htop -y
sudo yum install lsof -y
sudo yum install dos2unix -y
sudo yum install wget -y
sudo yum install tcpdump -y
sudo yum install openvpn -y
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz
sudo tar -xvzf EasyRSA-3.0.3.tgz
sudo chown -R Admin:Admin /var/log
sudo chmod 755 /var/log
mkdir /var/log/openvpn
mkdir /etc/openvpn/ccd
sudo chown -R Admin:Admin /etc/openvpn/ccd
sudo chown -R Admin:Admin /var/log/openvpn
chmod 755 /etc/openvpn/ccd
chmod 755 /var/log/openvpn
echo >/var/log/openvpn/openvpn-status.log
echo >/var/log/openvpn/openvpn.log
sudo chown -R Admin:Admin /etc/resolv.conf
chmod 755 /etc/resolv.conf
echo nameserver 8.8.8.8 >>/etc/resolv.conf
cd /etc/openvpn/
sudo /home/Admin/EasyRSA-3.0.3/easyrsa init-pki
sudo chown -R Admin:Admin /etc/openvpn
chmod 755 /etc/openvpn
echo set_var EASYRSA_DN "org" >/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_COUNTRY "RU" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_KEY_SIZE 4096 >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_PROVINCE "LIP" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_CITY "Lipetsk" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_ORG "Cool-Admin" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_EMAIL "xxx.ru" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_OU "Our_ORG" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_CN "changeme" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_CERT_EXPIRE 3650 >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_DH_KEY_SIZE=2048 >>/home/Admin/EasyRSA-3.0.3/test
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-ca nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-server-full Serv nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-client-full Client1 nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-dh
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-crl
mkdir keys
sudo chown -R Admin:Admin /etc/openvpn/keys
chmod 755 /etc/openvpn/keys
sudo cp /etc/openvpn/pki/ca.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/dh.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/crl.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/issued/Serv.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/private/Serv.key /etc/openvpn/keys
echo port 443 >/etc/openvpn/server.conf
echo proto udp >>/etc/openvpn/server.conf
echo dev tun >>/etc/openvpn/server.conf
echo ca /etc/openvpn/keys/ca.crt >>/etc/openvpn/server.conf
echo cert /etc/openvpn/keys/Serv.crt >>/etc/openvpn/server.conf
echo key /etc/openvpn/keys/Serv.key >>/etc/openvpn/server.conf
echo dh /etc/openvpn/keys/dh.pem >>/etc/openvpn/server.conf
echo crl-verify /etc/openvpn/keys/crl.pem >>/etc/openvpn/server.conf
echo client-config-dir /etc/openvpn/ccd >>/etc/openvpn/server.conf
echo topology subnet >>/etc/openvpn/server.conf
echo server 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf
echo route 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.8.8" >>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.4.4" >>/etc/openvpn/server.conf
echo keepalive 10 120 >>/etc/openvpn/server.conf
echo persist-key >>/etc/openvpn/server.conf
echo persist-tun >>/etc/openvpn/server.conf
echo status /var/log/openvpn/openvpn-status.log >>/etc/openvpn/server.conf
echo log-append /var/log/openvpn/openvpn.log >>/etc/openvpn/server.conf
echo verb 2 >>/etc/openvpn/server.conf
echo mute 20 >>/etc/openvpn/server.conf
echo daemon >>/etc/openvpn/server.conf
echo mode server >>/etc/openvpn/server.conf
echo user nobody >>/etc/openvpn/server.conf
echo group nobody >>/etc/openvpn/server.conf
sudo chown -R Admin:Admin /etc/sysctl.conf
chmod 755 /etc/sysctl.conf
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo systemctl enable openvpn@server
sudo systemctl start openvpn@server
sudo systemctl status openvpn@serverA instalação do OpenVPN não foi totalmente bem-sucedida.
Sem saber sobre as peculiaridades da política de permissões em sistemas Linux, gastei muito tempo estudando os logs e atribuindo as permissões necessárias a todos os arquivos.
Quando o botão do OpenVPN ficou verde, fiquei muito animado, mas, como se mostrou, isso foi apenas o começo. Por simplicidade, eu esperava substituir os certificados raiz e o arquivo crl.pem, na esperança de que tudo funcionasse. No final, precisei transferir os seguintes arquivos do servidor para o Windows:
Serv.crt — Certificado do servidor
Serv.key — Chave do servidor
Ca.crt — Certificado raiz
Ca.key — Chave raiz
Crl.pem — Arquivo de certificados revogados
Dh.pem — chave de Diffie-Hellman
Index.txt — Arquivo com informações sobre os certificados válidos
Serial — ele também é responsável pela validade dos certificados
Além disso, foi necessário o diretório certs_by_serial, o arquivo vars e todas as chaves e certificados dos clientes.
No Mikrotik, os certificados permaneceram no lugar, então tudo funcionou.
Os problemas surgiram quando tentei revogar o certificado; isso não funcionou de forma alguma — o arquivo index.txt precisava ser convertido para o formato unix, e eu não fiz isso imediatamente. Usei a ferramenta dos2unix.
Agora os certificados eram revogados, mas continuavam funcionando sem qualquer problema, porque o Mikrotik não sabia que eles haviam sido revogados e precisava ser informado sobre isso.
Após ler as instruções e consultar Alexander ERI (muito obrigado!), configurei um servidor http Apache no servidor de certificação e publiquei um arquivo de certificados revogados nele. O acesso a ele foi completamente fechado, exceto para o arquivo publicado a partir de um ip específico.
No terminal Mikrotik, na aba /System/Certificates/CRL, indiquei o caminho para o crl.pem publicado. É importante observar que o Mikrotik aceita apenas http e endereços absolutos na aba CRL, ou seja, deve parecer aproximadamente assim:
Tudo funcionou, pelo menos para versões 6.4.2.x do RouterOS, mas as configurações dos clientes precisavam ser criadas manualmente, o que foi bastante frustrante e causou muitos incômodos. Quando, após uma semana, precisei criar configurações para cerca de 50 clientes, decidi acelerar esse processo e para isso utilizei um trecho de um script de terceiros que encontrei na internet.
O script funciona da seguinte maneira: após a execução, pedimos o 'nome do cliente', respondemos se desejamos configurar uma senha ou não, e depois obtemos o arquivo de configuração 'cliente.ovpn', com os certificados e configurações integrados. Para usá-lo, é necessário estar em /etc/openvpn. Vou comentar as linhas onde o caminho precisa ser alterado para o seu. Também é necessário criar um arquivo com as configurações do cliente, para que o script possa inseri-las durante o processo de criação da configuração.
#!/bin/bash
function newClient () {
echo ""
echo "Tell me a name for the client."
echo "Use one word only, no special characters."
until [[ "$CLIENT" =~ ^[a-zA-Z0-9_]+$ ]]; do
read -rp "Client name: " -e CLIENT
done
echo ""
echo "Do you want to protect the configuration file with a password?"
echo "(e.g. encrypt the private key with a password)"
echo " 1) Add a passwordless client"
echo " 2) Use a password for the client"
until [[ "$PASS" =~ ^[1-2]$ ]]; do
read -rp "Select an option [1-2]: " -e -i 1 PASS
done
#cd /etc/openvpn/easy-rsa/ || return
case $PASS in
1)
sudo /home/admin/EasyRSA-3.0.3/easyrsa build-client-full "$CLIENT" nopass
;;
2)
echo "You will be asked for the client password below"
./easyrsa build-client-full "$CLIENT"
;;
esac
# Generates the custom client.ovpn
cp /etc/openvpn/client-template.txt "$home/home/admin/IT/Temp/$CLIENT.ovpn"
#Директория в которой хранится файл с настройками клиента.
#Директория, в которой сформируется файл конфигурации
{
echo "<ca>"
cat "/etc/openvpn/pki/ca.crt" #Директория хранения корневого сертификата
echo "</ca>"
echo "<cert>"
awk '/BEGIN/,/END/' "/etc/openvpn/pki/issued/$CLIENT.crt" #Директория с созданным #сертификатом клиента
echo "</cert>"
echo "<key>"
cat "/etc/openvpn/pki/private/$CLIENT.key" #Директория с созданным ключом клиента
echo "</key>"
} >> "$home/home/admin/IT/Temp/$CLIENT.ovpn" #Директория, в которой сформируется файл #конфигурации
echo ""
echo "Client $CLIENT added, the configuration file is available at $home/admin/IT/OVPN/Temp/$CLIENT.ovpn."
echo "Download the .ovpn file and import it in your OpenVPN client."
exit 0;
}
newClient
Depois de algum tempo, uma nova diretriz que proibia o acesso remoto forçou a desativação deste servidor e da conexão em funcionamento com o Mikrotik. Um novo servidor OpenVPN foi criado para os funcionários do departamento de TI, que agora funciona totalmente em CentOS. Mas essa já é outra história.
Agradeço imensamente a Ivan e Pavel pela ajuda na edição do artigo.
Fonte: habr.com
