Organização do trabalho remoto de uma organização SMB no OpenVPN
Formulação do problema
O artigo descreve a organização do acesso remoto para funcionários em produtos de código aberto e pode ser utilizado tanto para construir um sistema totalmente autônomo, quanto será útil para expansão quando houver falta de licenças no sistema comercial existente ou seu desempenho for insuficiente.
O objetivo do artigo é implementar um sistema completo para fornecer acesso remoto a uma organização, que é pouco mais do que “instalar o OpenVPN em 10 minutos”.
Como resultado, obteremos um sistema no qual certificados e (opcionalmente) o Active Directory corporativo serão usados para autenticar usuários. Que. obteremos um sistema com dois fatores de verificação - o que tenho (certificado) e o que sei (senha).
Um sinal de que um usuário tem permissão para se conectar é sua participação no grupo myVPNUsr. A autoridade de certificação será usada offline.
O custo de implementação da solução é de apenas pequenos recursos de hardware e 1 hora de trabalho do administrador do sistema.
Usaremos uma máquina virtual com OpenVPN e Easy-RSA versão 3 no CetntOS 7, que recebe 100 vCPUs e 4 GiB de RAM por 4 conexões.
No exemplo, a rede da nossa organização é 172.16.0.0/16, na qual o servidor VPN com o endereço 172.16.19.123 está localizado no segmento 172.16.19.0/24, os servidores DNS 172.16.16.16 e 172.16.17.17 e a sub-rede 172.16.20.0 .23/XNUMX é alocado para clientes VPN.
Para conectar de fora, é usada uma conexão via porta 1194/udp, e um registro A gw.abc.ru foi criado no DNS para nosso servidor.
Não é estritamente recomendado desabilitar o SELinux! OpenVPN funciona sem desabilitar políticas de segurança.
Instalação de sistema operacional e software aplicativo
Usamos a distribuição CentOS 7.8.2003. Precisamos instalar o sistema operacional em uma configuração mínima. É conveniente fazer isso usando kickstart, clonando uma imagem de sistema operacional previamente instalada e outros meios.
Após a instalação, atribuindo um endereço à interface de rede (conforme termos da tarefa 172.16.19.123), atualizamos o SO:
$ sudo yum update -y && reboot
Também precisamos ter certeza de que a sincronização de horário é realizada em nossa máquina.
Para instalar o software aplicativo, você precisa dos pacotes openvpn, openvpn-auth-ldap, easy-rsa e vim como editor principal (você precisará do repositório EPEL).
Os parâmetros da organização condicional ABC LLC são descritos aqui, você pode corrigi-los para os reais ou deixá-los no exemplo. O mais importante nos parâmetros é a última linha, que determina o prazo de validade do certificado em dias. O exemplo usa o valor 10 anos (365*10+2 anos bissextos). Este valor precisará ser ajustado antes da emissão dos certificados de usuário.
A seguir, configuramos uma autoridade de certificação autônoma.
A configuração inclui exportar variáveis, inicializar a CA, emitir a chave raiz e o certificado da CA, a chave Diffie-Hellman, a chave TLS e a chave e o certificado do servidor. A chave CA deve ser cuidadosamente protegida e mantida em segredo! Todos os parâmetros de consulta podem ser deixados como padrão.
Isso completa a parte principal da configuração do mecanismo criptográfico.
Configurando o OpenVPN
Vá para o diretório OpenVPN, crie diretórios de serviço e adicione um link para easy-rsa:
cd /etc/openvpn/
mkdir /var/log/openvpn/ /etc/openvpn/ccd /usr/share/easy-rsa/3/client
ln -s /usr/share/easy-rsa/3/pki/ /etc/openvpn/
Crie o arquivo de configuração principal do OpenVPN:
$ sudo vim server.conf
o seguinte conteúdo
port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/myvpngw.crt
key /etc/openvpn/pki/private/myvpngw.key
crl-verify /etc/openvpn/pki/crl.pem
dh /etc/openvpn/pki/dh.pem
server 172.16.20.0 255.255.254.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
push "route 172.17.0.0 255.255.255.0"
client-config-dir ccd
push "dhcp-option DNS 172.16.16.16"
push "dhcp-option DNS 172.16.17.17"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
username-as-common-name
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/ldap.conf
Algumas notas sobre os parâmetros:
se foi especificado um nome diferente na emissão do certificado, indique-o;
especifique o conjunto de endereços adequado às suas tarefas*;
pode haver uma ou mais rotas e servidores DNS;
As últimas 2 linhas são necessárias para implementar a autenticação no AD**.
*A faixa de endereços selecionada no exemplo permitirá que até 127 clientes se conectem simultaneamente, pois a rede /23 é selecionada e o OpenVPN cria uma sub-rede para cada cliente usando a máscara /30.
Se for particularmente necessário, a porta e o protocolo podem ser alterados, no entanto, deve-se ter em mente que a alteração do número da porta implicará a configuração do SELinux, e o uso do protocolo tcp aumentará a sobrecarga, porque O controle de entrega de pacotes TCP já é realizado no nível dos pacotes encapsulados no túnel.
**Se a autenticação no AD não for necessária, comente-os, pule a próxima seção e no modelo remova a linha auth-user-pass.
Autenticação AD
Para apoiar o segundo fator, usaremos a verificação de conta no AD.
Precisamos de uma conta no domínio com os direitos de um usuário comum e de um grupo, cuja adesão determinará a capacidade de conexão.
systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Emissão e revogação de certificado
Porque Além dos próprios certificados, você precisa de chaves e outras configurações, é muito conveniente agrupar tudo isso em um arquivo de perfil. Este arquivo é então transferido para o usuário e o perfil é importado no cliente OpenVPN. Para isso, criaremos um modelo de configurações e um script que gera o perfil.
Você precisa adicionar o conteúdo dos arquivos do certificado raiz (ca.crt) e da chave TLS (ta.key) ao perfil.
Antes de emitir certificados de usuário não se esqueça de definir o período de validade exigido para os certificados no arquivo de parâmetros. Você não deve demorar muito; recomendo limitar-se a um máximo de 180 dias.
vim /usr/share/easy-rsa/3/vars
...
export EASYRSA_CERT_EXPIRE=180
vim /usr/share/easy-rsa/3/client/template.ovpn
client
dev tun
proto udp
remote gw.abc.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth-user-pass
<ca>
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
</ca>
key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>
Observações:
linhas COLOQUE O SEU... mudar para conteúdo seu certificados;
na diretiva remota, especifique o nome/endereço do seu gateway;
a diretiva auth-user-pass é usada para autenticação externa adicional.
No diretório inicial (ou outro local conveniente), criamos um script para solicitar um certificado e criar um perfil:
vim ~/make.profile.sh
#!/bin/bash
if [ -z "$1" ] ; then
echo Missing mandatory client name. Usage: $0 vpn-username
exit 1
fi
#Set variables
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn
#Get current year and lowercase client name
year=`date +%F`
client=${1,,}
echo Processing $year year cert for user/device $client
cd $basepath
if [ -f client/$client* ]; then
echo "*** ERROR! ***"
echo "Certificate $client already issued!"
echo "*** ERROR! ***"
exit 1
fi
. ./vars
./easyrsa --batch --req-cn=$client gen-req $client nopass
./easyrsa --batch sign-req client $client
#Make profile
cp $clntpath/template.ovpn $profile
echo "<key>" >> $profile
cat $privpath/$1.key >> $profile
echo "</key>" >> $profile
echo -e "n" >> $profile
openssl x509 -in $certpath/$1.crt -out $basepath/$1.crt
echo "<cert>" >> $profile
cat $basepath/$1.crt >> $profile
echo "</cert>" >> $profile
echo -e "n" >> $profile
#remove tmp file
rm -f $basepath/$1.crt
echo Complete. See $profile file.
cd ~
Tornando o arquivo executável:
chmod a+x ~/make.profile.sh
E podemos emitir nosso primeiro certificado.
~/make.profile.sh my-first-user
recordação
Em caso de comprometimento de um certificado (perda, roubo), é necessário revogar este certificado:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Ver certificados emitidos e revogados
Para visualizar certificados emitidos e revogados, basta visualizar o arquivo de índice:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Explicação:
a primeira linha é o certificado do servidor;
primeiro caractere
V (Válido) - válido;
R (Revogado) - recordado.
Configuração de rede
Os últimos passos são a configuração da rede de transmissão – roteamento e firewalls.
Em um ambiente corporativo, é provável que haja sub-redes e precisamos informar ao(s) roteador(es) como enviar pacotes destinados aos nossos clientes VPN. Na linha de comando executamos o comando da seguinte forma (dependendo do equipamento utilizado):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123
e salve a configuração.
Além disso, na interface do roteador de fronteira onde é servido o endereço externo gw.abc.ru, é necessário permitir a passagem de pacotes udp/1194.
Caso a organização possua regras de segurança rígidas, um firewall também deverá ser configurado em nosso servidor VPN. Na minha opinião, a maior flexibilidade é fornecida pela configuração de cadeias FORWARD do iptables, embora configurá-las seja menos conveniente. Um pouco mais sobre como configurá-los. Para fazer isso, é mais conveniente usar “regras diretas” - regras diretas armazenadas em um arquivo /etc/firewalld/direct.xml. A configuração atual das regras pode ser encontrada da seguinte forma:
$ sudo firewall-cmd --direct --get-all-rule
Antes de alterar um arquivo, faça uma cópia de backup dele:
Estas são essencialmente regras regulares do iptables, empacotadas após o advento do firewalld.
A interface de destino com configurações padrão é tun0, e a interface externa do túnel pode ser diferente, por exemplo, ens192, dependendo da plataforma utilizada.
A última linha é para registrar pacotes descartados. Para que o log funcione, você precisa alterar o nível de depuração na configuração do firewalld:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Aplicar configurações é o comando usual do firewalld para reler as configurações:
$ sudo firewall-cmd --reload
Você pode visualizar pacotes descartados assim:
grep forward_fw /var/log/messages
Qual é o próximo
Isso conclui a configuração!
Resta instalar o software cliente no lado do cliente, importar o perfil e conectar-se. Para sistemas operacionais Windows, o kit de distribuição está localizado em site do desenvolvedor.
Por fim, conectamos nosso novo servidor aos sistemas de monitoramento e arquivamento, e não esquecemos de instalar atualizações regularmente.