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 usado para criar um sistema totalmente autônomo e será útil para expansão quando houver falta de licenças em um sistema comercial existente ou seu desempenho for insuficiente.O objetivo do artigo é apresentar um sistema completo para fornecer acesso remoto a uma organização, que é um pouco mais do que "instalar o OpenVPN em 10 minutos".Como resultado, obtemos um sistema no qual os certificados e (opcionalmente) o diretório corporativo do Active Directory serão usados para autenticação do usuário. PARA. obtemos um sistema com dois fatores de verificação - o que tenho (certificado) e o que sei (senha).Um sinal de que o usuário pode se conectar é sua associação ao grupo myVPNUsr. A Autoridade de Certificação será usada de forma independente.O custo da implementação da solução são apenas pequenos recursos de hardware e 1 hora de trabalho do administrador do sistema.Usaremos uma máquina virtual com a versão OpenVPN e Easy-RSA 3rd no CetntOS 7, que com base em 100 conexões emitidas 4 vCPU, 4 GiB RAM.No exemplo, a rede de 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 são 172.16.16.16 e 172.16.17.17 e a sub-rede 172.16.20.0/23 é alocada para clientes VPN .Para conexões externas, uma conexão é usada na porta 1194 / udp, e um registro A gw.abc.ru foi criado para o nosso servidor no DNS.Não é altamente recomendável desativar o SELinux! O OpenVPN funciona sem desativar as políticas de segurança.Conteúdo
- Instalação de SO e software aplicativo
- Configuração de criptografia
- Configurar o OpenVPN
- Autenticação no AD
- Lançamento e diagnóstico
- Emissão e revogação de certificado
- Configuração de rede
- Qual é o próximo
Instalação de SO e software aplicativo
Utilizamos o kit de distribuição CentOS 7.8.2003. Precisamos instalar o sistema operacional em uma configuração mínima. É conveniente fazer isso usando o kickstart , clonando uma imagem do sistema operacional instalada anteriormente e outros meios.Após a instalação, atribuindo um endereço à interface de rede (de acordo com as condições da tarefa 172.16.19.123), atualizamos o sistema operacional:$ sudo yum update -y && reboot
Também é necessário garantir que a sincronização de tempo seja realizada em nossa máquina.Para instalar o software do aplicativo, você precisa dos pacotes openvpn, openvpn-auth-ldap, easy-rsa e vim como o editor principal (você precisará do repositório EPEL).$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
Para uma máquina virtual, é útil instalar um agente convidado:$ sudo yum install open-vm-tools
para hosts VMware ESXi ou para oVirt$ sudo yum install ovirt-guest-agent
Configuração de criptografia
Vá para o diretório easy-rsa:$ cd /usr/share/easy-rsa/3/
Crie um arquivo variável:$ sudo vim vars
o seguinte conteúdo:export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.ru"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.ru"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Os parâmetros para a organização condicional da ABC LLC estão descritos aqui.Você pode corrigi-los de verdade ou deixá-los como um exemplo. O mais importante nos parâmetros é a última linha, que determina o período de validade do certificado em dias. No exemplo, o valor de 10 anos é usado (365 * 10 + 2 anos bissextos). Esse valor precisará ser ajustado antes de emitir certificados de usuário.Em seguida, configure uma autoridade de certificação independente.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, bem como a chave e o certificado do servidor. A chave da autoridade de certificação deve ser cuidadosamente guardada e mantida em segredo! Todos os parâmetros nas solicitações podem ser deixados por 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
Com isso, a parte principal da configuração do mecanismo criptográfico está concluída.Configurar 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 principal arquivo de configuração do OpenVPN:$ sudo vim server.conf
o seguinte conteúdoport 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 um nome diferente foi indicado ao emitir o certificado, indique-o;
- especifique o conjunto de endereços para suas tarefas *;
- rotas e servidores DNS podem ser um ou mais;
- As duas últimas linhas são necessárias para implementar a autenticação no AD **.
* 127 , .. /23, OpenVPN /30.
, , SELinux, tcp , .. tcp- .
** AD , , — , auth-user-pass.AD
Para dar suporte ao 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 associação determinará a capacidade de conexão.Crie um arquivo de configuração:/etc/openvpn/ldap.conf
o seguinte conteúdo<LDAP>
URL "ldap://ldap.abc.ru"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
</LDAP>
<Authorization>
BaseDN "OU=allUsr,DC=abc,DC=ru"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
<Group>
BaseDN "OU=myGrp,DC=abc,DC=ru"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
</Group>
</Authorization>
Parâmetros principais:- URL "ldap: //ldap.abc.ru" - o endereço do controlador de domínio;
- BindDN “CN = bindUsr, CN = Usuários, DC = abc, DC = ru” - o nome canônico da ligação ao LDAP (UZ - bindUsr no contêiner abc.ru/Users);
- Senha b1ndP @ SS - senha do usuário para ligação;
- BaseDN "OU = allUsr, DC = abc, DC = ru" - o caminho a partir do qual iniciar a pesquisa do usuário;
- BaseDN “OU = myGrp, DC = abc, DC = ru” - o contêiner do grupo de permissão (o grupo myVPNUsr no contêiner abc.ru \ myGrp);
- SearchFilter "(cn = myVPNUsr)" é o nome do grupo de resolução.
Lançamento e diagnóstico
Agora podemos tentar ligar e iniciar nosso servidor:$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Iniciar verificação:systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Emissão e revogação de certificado
Porque Além dos 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 já foi importado no cliente OpenVPN. Para fazer isso, crie um modelo de configuração e um script que forme o perfil.No perfil, você precisa adicionar o conteúdo dos arquivos de certificado raiz (ca.crt) e a chave TLS (ta.key).Antes de emitir certificados de usuário, certifique-se de definir o período de validade do certificado necessário no arquivo de parâmetros. Você não deve torná-lo grande demais, recomendo limitá-lo 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>
Notas:- COLOQUE AS ... strings são alteradas para o conteúdo de seus 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
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn
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
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
rm -f $basepath/$1.crt
echo Complete. See $profile file.
cd ~
Tornamos o arquivo executável:chmod a+x ~/make.profile.sh
E você pode emitir nosso primeiro certificado.~/make.profile.sh my-first-user
Comentários
Se o certificado estiver comprometido (perda, roubo), este certificado deverá ser revogado:cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Ver certificados emitidos e revogados
Para visualizar os certificados emitidos e revogados, basta visualizar o arquivo de índice:cd /usr/share/easy-rsa/3/
cat pki/index.txt
Explicações:- a primeira linha é o certificado do servidor;
- primeiro personagem
- V (válido) - válido;
- R (revogado) - lembrado.
Configuração de rede
Os últimos passos são a configuração de uma rede de transmissão - roteamento e firewalls.Permissão para conexões no firewall local:$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Em seguida, ative o roteamento de 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 existe uma divisão em sub-redes e precisamos informar ao (s) roteador (s) como enviar pacotes endereçados aos nossos clientes VPN. Na linha de comando, execute o comando da maneira (depende do equipamento usado):
e salve a configuração.Além disso, na interface do roteador de borda, onde o endereço externo gw.abc.ru é servido, é necessário permitir a passagem de pacotes udp / 1194.Se sua organização possui regras rígidas de segurança, você também deve configurar um firewall em nosso servidor VPN. Na minha opinião, configurar cadeias iptables FORWARD oferece mais flexibilidade, embora configurá-las seja menos conveniente. Um pouco mais sobre como configurá-los. Para isso, é mais conveniente usar “regras diretas” - regras diretas armazenadas no arquivo /etc/firewalld/direct.xml . A configuração atual da regra pode ser encontrada da seguinte maneira:$ sudo firewall-cmd --direct --get-all-rule
Antes de alterar o arquivo, faça uma cópia de backup dele:cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak
O conteúdo aproximado do arquivo é o seguinte:<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
<rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>
Explicações
Essencialmente, essas são as regras usuais do iptables, que são compactadas após o aparecimento do firewalld.A interface de destino nas configurações padrão é tun0 e a externa do túnel pode ser diferente, por exemplo, ens192, dependendo da plataforma usada.A última linha é para registrar 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 configurações - o comando firewalld usual para reler as configurações:$ sudo firewall-cmd --reload
Pacotes descartados podem ser vistos da seguinte maneira:grep forward_fw /var/log/messages
Qual é o próximo
A configuração está concluída!Ele permanece no lado do cliente para instalar o software do cliente, importar o perfil e conectar-se. Para um sistema operacional como o Windows, a distribuição está disponível no site do desenvolvedor .Concluindo, conectamos nosso novo servidor a sistemas de monitoramento e arquivamento e não esquecemos de instalar atualizações regularmente.Conexão estável!