Organização do trabalho remoto em uma organização SMB usando OpenVPN

Formulação do problema

O artigo descreve a organização do acesso remoto dos funcionários em produtos de código aberto e pode ser usado tanto para a construção de um sistema totalmente autônomo quanto para expansão, quando há falta de licenças no sistema comercial existente ou sua performance é insuficiente.

O objetivo do artigo é implantar um sistema completo de fornecimento de acesso remoto à organização, que é um pouco mais do que "instalar o OpenVPN em 10 minutos".

Como resultado, obteremos um sistema que usará certificados para autenticação de usuários e (opcionalmente) um diretório corporativo Active Directory. Assim, teremos um sistema com dois fatores de verificação — o que possuo (certificado) e o que sei (senha).

O sinal de que um usuário está autorizado a se conectar é sua filiação ao grupo myVPNUsr. Um centro de certificação será utilizado de forma autônoma.

O custo de implementação da solução é 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 CentOS 7, que terá 4 vCPU e 4 GiB de RAM para um total de 100 conexões.

No exemplo, a rede da nossa organização é 172.16.0.0/16, onde o servidor VPN com o endereço 172.16.19.123 está localizado na sub-rede 172.16.19.0/24, servidores DNS 172.16.16.16 e 172.16.17.17, e a sub-rede para clientes VPN é 172.16.20.0/23.

Para conexões externas, é utilizado o protocolo UDP na porta 1194, e no DNS foi criada uma entrada A para nosso servidor: gw.abc.ru.

É categoricamente desaconselhável desativar o SELinux! O OpenVPN funciona sem desativar as políticas de segurança.

Conteúdo

  1. Instalação do SO e do software aplicativo
  2. Configuração da criptografia
  3. Configuração do OpenVPN
  4. Autenticação no AD
  5. Execução e diagnóstico
  6. Emissão e revogação de certificados
  7. Configuração da rede
  8. O que vem a seguir

Instalação do SO e do software aplicativo

Usamos a distribuição CentOS 7.8.2003. Precisamos da instalação do SO em configuração mínima. É conveniente fazer isso usando kickstart, clonagem de uma imagem de SO já instalada e outros meios.

Após a instalação, ao atribuir o endereço ao interface de rede (de acordo com o caso, 172.16.19.123), realizamos a atualização do SO:

$ sudo yum update -y && reboot

Também é necessário garantir que a sincronização de tempo esteja em execução em nossa máquina.
Para instalar o software aplicativo, são necessários os pacotes openvpn, openvpn-auth-ldap, easy-rsa e vim como editor principal (o repositório EPEL será necessário).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Para a máquina virtual, é útil instalar o agente convidado:

$ sudo yum install open-vm-tools

para hosts VMware ESXi, ou para oVirt

$ sudo yum install ovirt-guest-agent

Configuração da criptografia

Vamos para o diretório easy-rsa:

$ cd /usr/share/easy-rsa/3/

Criamos o arquivo de variáveis:

$ sudo vim vars

users.module.ts

export KEY_COUNTRY="BR"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.com"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.com"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Aqui estão descritos os parâmetros para a organização hipotética LLC "ABC"; você pode corrigi-los para valores reais ou deixá-los do exemplo. O mais importante nos parâmetros é a última linha, que define o prazo de validade do certificado em dias. No exemplo, foi utilizado um valor de 10 anos (365*10+2 anos bissextos). Esse valor precisará ser ajustado antes da emissão dos certificados dos usuários.

Em seguida, configuramos a autoridade certificadora autônoma.

A configuração inclui a exportação de variáveis, a inicialização da CA, a emissão da chave raiz e do certificado da CA, a chave Diffie-Hellman, a chave TLS, bem como a chave e o certificado do servidor. A chave da autoridade certificadora deve ser rigorosamente protegida e mantida em segredo! Todos os parâmetros nas solicitações podem ser deixados como padrão.

cd /usr/share/easy-rsa/3/
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req myvpngw nopass
./easyrsa sign-req server myvpngw
./easyrsa gen-crl
openvpn --genkey --secret pki/ta.key

Assim, a parte principal da configuração do mecanismo criptográfico está concluída.

Configuração do OpenVPN

Vamos para o diretório OpenVPN, criamos diretórios e adicionamos 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/

Criamos o arquivo principal de configuração do OpenVPN:

$ sudo vim server.conf

do 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 observações sobre os parâmetros:

  • se ao emitir o certificado foi especificado outro nome — informe-o;
  • o pool de endereços deve ser ajustado de acordo com suas necessidades*;
  • as rotas e servidores DNS podem ser um ou vários;
  • as 2 últimas linhas são necessárias para implementar a autenticação no AD**.

*O intervalo de endereços escolhido no exemplo permitirá a conexão simultânea de até 127 clientes, já que foi selecionada a rede /23, e o OpenVPN cria uma sub-rede de máscara /30 para cada cliente.
Em casos especiais, a porta e o protocolo podem ser alterados, porém deve-se ter em mente que a mudança do número da porta exigirá configuração no SELinux, e o uso do protocolo TCP aumentará a sobrecarga, pois o controle da entrega dos 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, e pule a próxima seção; no template, remova a linha auth-user-pass..

Autenticação no AD

Para suportar o segundo fator, usaremos a verificação da conta no AD.

Precisamos de uma conta no domínio com privilégios de usuário comum e um grupo, cuja associação determinará a possibilidade de conexão.

Criamos o arquivo de configuração:

/etc/openvpn/ldap.conf

do seguinte conteúdo

URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes


        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"

Principais parâmetros:

  • URL "ldap://ldap.abc.ru" — endereço do controlador de domínio;
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" — nome canônico para vinculação ao LDAP (usuário — bindUsr no contêiner abc.ru/Users);
  • Password b1ndP@SS — senha do usuário para vinculação;
  • BaseDN "OU=allUsr,DC=abc,DC=ru" — caminho a partir do qual começar a busca pelo usuário;
  • BaseDN "OU=myGrp,DC=abc,DC=ru" — contêiner do grupo permissivo (grupo myVPNUsr no contêiner abc.ru/myGrp);
  • SearchFilter "(cn=myVPNUsr)" — nome do grupo permissivo.

Execução e diagnóstico

Agora podemos tentar habilitar e iniciar nosso servidor:

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

Verificação de inicialização:

systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Emissão e revogação de certificados

Como, além dos próprios certificados, são necessárias as chaves e outras configurações, é muito conveniente agrupar tudo isso em um arquivo de perfil. Este arquivo é então passado ao usuário e o perfil já é importado no cliente OpenVPN. Para isso, criaremos um template de configurações e um script que formará o perfil.

No perfil, é necessário adicionar o conteúdo dos arquivos do certificado raiz (ca.crt) e a chave TLS (ta.key).

Antes de emitir os certificados dos usuários. não se esqueça de definir o prazo de validade dos certificados no arquivo de parâmetros. Não deve ser muito longo, recomendo limitar 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


-----BEGIN CERTIFICATE-----
COLOQUE SEU CERTIFICADO CA (ca.crt) AQUI
-----END CERTIFICATE-----


key-direction 1

-----BEGIN OpenVPN Static key V1-----
COLOQUE SUA CHAVE TA (ta.key) AQUI
-----END OpenVPN Static key V1-----

Notas:

  • linhas COLOQUE SEU… trocamos pelo conteúdo seus certificados;
  • na diretiva remote, insira o nome/endereço do seu gateway;
  • a diretiva auth-user-pass é usada para autenticação externa adicional.

No diretório pessoal (ou em outro lugar 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 ~

Tornamos o arquivo executável:

chmod a+x ~/make.profile.sh

E podemos emitir nosso primeiro certificado.

~/make.profile.sh my-first-user

Comentário

Em caso de comprometimento do certificado (perda, roubo), é necessário revogar esse certificado:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Visualização de certificados emitidos e revogados

Para visualizar os certificados emitidos e revogados, basta verificar o arquivo de índice:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Notas:

  • a primeira linha contém o certificado do servidor;
  • o primeiro caractere
    • V (Válido) — válido;
    • R (Revogado) — revogado.

Configuração da rede

Os últimos passos — a configuração da rede de transmissão — roteamento e firewalls.

Permitir conexões no firewall local:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Em seguida, habilitamos o roteamento do tráfego IP:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

Em um ambiente corporativo, provavelmente há divisão em sub-redes e precisamos informar ao roteador(-es) como enviar pacotes endereçados aos nossos clientes VPN. No terminal, executamos o comando semelhante (depende do equipamento utilizado):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

e salvamos a configuração.

Além disso, na interface do roteador de borda, onde é atendido o endereço externo gw.abc.ru, é necessário permitir a passagem de pacotes udp/1194.

Caso a organização tenha regras de segurança rigorosas, é necessário configurar um firewall em nosso servidor VPN. Na minha opinião, a configuração das cadeias FORWARD do iptables oferece a maior flexibilidade, embora seja menos conveniente configurá-las. Um pouco mais sobre como configurá-las. Para isso, é mais fácil utilizar "regras diretas" — direct rules, armazenadas em um arquivo. /etc/firewalld/direct.xml. A configuração atual das regras pode ser obtida da seguinte forma:

$ sudo firewall-cmd --direct --get-all-rule

Antes de modificar o arquivo, faça um backup dele:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

O conteúdo aproximado do arquivo é o seguinte:


  
    -i tun0 -o ens192 -p udp --dport 53 -j ACCEPT
  
    -i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    -i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '

Explicações

Essencialmente, estas são regras padrão do iptables, empacotadas após a introdução do firewalld.

O interface de destino nas configurações padrão é tun0, e o externo para o túnel pode ser diferente, por exemplo, ens192, dependendo da plataforma utilizada.

A última linha é destinada ao registro de pacotes descartados. Para que o registro funcione, é necessário alterar o nível de depuração na configuração do firewalld:

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

Aplicar as configurações — o comando padrão do firewalld para recarregar as configurações é:

$ sudo firewall-cmd --reload

Os pacotes descartados podem ser visualizados da seguinte forma:

grep forward_fw /var/log/messages

O que vem a seguir

A configuração está completa!

Agora, é necessário instalar o software cliente do lado do cliente, importar o perfil e conectar. Para sistemas operacionais Windows, o pacote está disponível em site do desenvolvedor.

Por fim, conectamos nosso novo servidor aos sistemas de monitoramento e arquivamento, e não nos esquecemos de instalar as atualizações regularmente.

Uma conexão estável!

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