Organización do traballo remoto dunha organización de pemes en OpenVPN

Declaración de problemas

O artigo describe a organización do acceso remoto para os empregados en produtos de código aberto e pode ser usado tanto para construír un sistema completamente autónomo, como será útil para a súa expansión cando haxa escaseza de licenzas no sistema comercial existente ou o seu rendemento sexa insuficiente.

O obxectivo do artigo é implementar un sistema completo para proporcionar acceso remoto a unha organización, que é pouco máis que "instalar OpenVPN en 10 minutos".

Como resultado, obteremos un sistema no que se utilizarán certificados e (opcionalmente) o Active Directory corporativo para autenticar usuarios. Iso. obteremos un sistema con dous factores de verificación: o que teño (certificado) e o que sei (contrasinal).

Un sinal de que un usuario pode conectarse é a súa pertenza ao grupo myVPNUsr. A autoridade de certificación empregarase sen conexión.

O custo de implementación da solución é só de pequenos recursos de hardware e 1 hora de traballo do administrador do sistema.

Usaremos unha máquina virtual con OpenVPN e Easy-RSA versión 3 en CetntOS 7, á que se lle asignan 100 vCPU e 4 GiB de RAM por cada 4 conexións.

No exemplo, a rede da nosa organización é 172.16.0.0/16, na que o servidor VPN co enderezo 172.16.19.123 está situado no segmento 172.16.19.0/24, os servidores DNS 172.16.16.16 e 172.16.17.17 e 172.16.20.0, e a subrede 23. .XNUMX/XNUMX está asignado para clientes VPN.

Para conectarse desde fóra, utilízase unha conexión a través do porto 1194/udp e creouse un rexistro A gw.abc.ru no DNS para o noso servidor.

Non se recomenda estrictamente desactivar SELinux! OpenVPN funciona sen desactivar as políticas de seguranza.

Contido

  1. Instalación de SO e software de aplicación
  2. Configuración da criptografía
  3. Configurando OpenVPN
  4. Autenticación AD
  5. Arranque e diagnóstico
  6. Expedición e revogación do certificado
  7. Configuración da rede
  8. Que hai a continuación

Instalación de SO e software de aplicación

Usamos a distribución CentOS 7.8.2003. Necesitamos instalar o sistema operativo nunha configuración mínima. É conveniente facelo usando kickstart, clonando unha imaxe do sistema operativo instalada previamente e outros medios.

Despois da instalación, asignando un enderezo á interface de rede (segundo os termos da tarefa 172.16.19.123), actualizamos o SO:

$ sudo yum update -y && reboot

Tamén temos que asegurarnos de que a sincronización horaria se realiza na nosa máquina.
Para instalar o software da aplicación, necesitará os paquetes openvpn, openvpn-auth-ldap, easy-rsa e vim como editor principal (necesitará o repositorio EPEL).

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

É útil instalar un axente convidado para unha máquina virtual:

$ sudo yum install open-vm-tools

para hosts VMware ESXi ou para oVirt

$ sudo yum install ovirt-guest-agent

Configuración da criptografía

Vaia ao directorio easy-rsa:

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

Crear un ficheiro variable:

$ sudo vim vars

o seguinte contido:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
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

Aquí descríbense os parámetros para a organización condicional ABC LLC; pode corrixilos aos reais ou deixalos do exemplo. O máis importante nos parámetros é a última liña, que determina o período de validez do certificado en días. O exemplo usa o valor 10 anos (365*10+2 anos bisiestos). Este valor terá que ser axustado antes de emitir certificados de usuario.

A continuación, configuramos unha autoridade de certificación autónoma.

A configuración inclúe a exportación de variables, a inicialización da CA, a emisión da clave raíz e o certificado da CA, a clave Diffie-Hellman, a clave TLS e a clave e o certificado do servidor. A chave CA debe estar coidadosamente protexida e manterse en segredo. Todos os parámetros de consulta pódense deixar como predeterminados.

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

Isto completa a parte principal da configuración do mecanismo criptográfico.

Configurando OpenVPN

Vaia ao directorio OpenVPN, cree directorios de servizos e engade unha ligazón a 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/

Cree o ficheiro de configuración principal de OpenVPN:

$ sudo vim server.conf

contidos seguintes

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

Algunhas notas sobre os parámetros:

  • se se especificou un nome diferente ao emitir o certificado, indíqueo;
  • especifique o conxunto de enderezos para adaptarse ás súas tarefas*;
  • pode haber unha ou máis rutas e servidores DNS;
  • As últimas 2 liñas son necesarias para implementar a autenticación en AD**.

*O rango de enderezos seleccionados no exemplo permitirá que ata 127 clientes se conecten simultaneamente, porque a rede /23 está seleccionada e OpenVPN crea unha subrede para cada cliente usando a máscara /30.
Se é especialmente necesario, pódese cambiar o porto e o protocolo, non obstante, hai que ter en conta que cambiar o número de porto do porto implicará configurar SELinux, e o uso do protocolo tcp aumentará a sobrecarga, porque O control de entrega de paquetes TCP xa se realiza a nivel de paquetes encapsulados no túnel.

**Se non é necesaria a autenticación en AD, coméntaas, omite a seguinte sección e no modelo eliminar a liña auth-user-pass.

Autenticación AD

Para soportar o segundo factor, utilizaremos a verificación da conta en AD.

Necesitamos unha conta no dominio cos dereitos dun usuario común e dun grupo, a pertenza no que determinará a posibilidade de conectarse.

Crea un ficheiro de configuración:

/etc/openvpn/ldap.conf

contidos seguintes

<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" - enderezo do controlador de dominio;
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" - nome canónico para vincular a LDAP (UZ - bindUsr no contedor abc.ru/Users);
  • Contrasinal b1ndP@SS — contrasinal de usuario para vincular;
  • BaseDN "OU=allUsr,DC=abc,DC=ru" — o camiño desde o que comezar a buscar o usuario;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – contenedor do grupo que permite (grupo myVPNUsr no contenedor abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" é o nome do grupo que permite.

Arranque e diagnóstico

Agora podemos tentar activar e iniciar o noso servidor:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Comprobación de inicio:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Expedición e revogación do certificado

Porque Ademais dos propios certificados, necesitas claves e outras configuracións; é moi cómodo envolver todo isto nun ficheiro de perfil. Este ficheiro transfírese entón ao usuario e o perfil impórtase no cliente OpenVPN. Para iso, crearemos un modelo de configuración e un script que xere o perfil.

Debe engadir o contido dos ficheiros de certificado raíz (ca.crt) e clave TLS (ta.key) ao perfil.

Antes de emitir certificados de usuario non esqueza establecer o período de validez necesario para os certificados no ficheiro de parámetros. Non debes facelo demasiado longo; recoméndoche que te limites a un máximo de 180 días.

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:

  • cordas POÑA O TEU... cambiar ao contido dos seus certificados;
  • na directiva remota, especifique o nome/enderezo da súa pasarela;
  • a directiva auth-user-pass úsase para a autenticación externa adicional.

No directorio de inicio (ou outro lugar conveniente) creamos un script para solicitar un certificado e crear un 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 ~

Facendo o ficheiro executable:

chmod a+x ~/make.profile.sh

E podemos emitir o noso primeiro certificado.

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

Comentarios

En caso de compromiso dun certificado (pérda, roubo), é necesario revogar este certificado:

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

Consulta os certificados emitidos e revogados

Para ver os certificados emitidos e revogados, basta con ver o ficheiro índice:

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

Explicacións:

  • a primeira liña é o certificado do servidor;
  • primeiro personaxe
    • V (válido) - válido;
    • R (Revogado) - recordado.

Configuración da rede

Os últimos pasos son configurar a rede de transmisión: enrutamento e cortalumes.

Permitindo conexións no firewall local:

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

A continuación, active o enrutamento do tráfico IP:

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

Nun entorno corporativo, é probable que haxa subredes e teñamos que indicarlle aos enrutadores como enviar paquetes destinados aos nosos clientes VPN. Na liña de comandos executamos o comando do xeito (dependendo do equipo utilizado):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

e gardar a configuración.

Ademais, na interface do enrutador de fronteira onde se serve o enderezo externo gw.abc.ru, é necesario permitir o paso de paquetes udp/1194.

No caso de que a organización teña regras de seguridade estritas, tamén se debe configurar un firewall no noso servidor VPN. Na miña opinión, a maior flexibilidade prodúcese configurando cadeas FORWARD de iptables, aínda que configuralas é menos conveniente. Un pouco máis sobre configuralos. Para iso, é máis conveniente usar "regras directas": regras directas, almacenadas nun ficheiro /etc/firewalld/direct.xml. A configuración actual das regras pódese atopar da seguinte maneira:

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

Antes de cambiar un ficheiro, faga unha copia de seguridade do mesmo:

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

O contido aproximado do ficheiro é:

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <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>
  <!--Some Other Systems-->
    <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>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

Explicacións

Estas son esencialmente regras de iptables habituais, doutro xeito empaquetadas despois da chegada do firewalld.

A interface de destino coa configuración predeterminada é tun0, e a interface externa para o túnel pode ser diferente, por exemplo, ens192, dependendo da plataforma utilizada.

A última liña é para rexistrar paquetes soltos. Para que o rexistro funcione, cómpre cambiar o nivel de depuración na configuración do firewalld:

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

Aplicar a configuración é o comando habitual de firewalld para volver ler a configuración:

$ sudo firewall-cmd --reload

Podes ver os paquetes soltos como este:

grep forward_fw /var/log/messages

Que hai a continuación

Isto completa a configuración!

Só queda instalar o software do cliente no lado do cliente, importar o perfil e conectarse. Para os sistemas operativos Windows, o kit de distribución atópase activado sitio para desenvolvedores.

Finalmente, conectamos o noso novo servidor aos sistemas de seguimento e arquivo, e non esquezamos instalar actualizacións regularmente.

Conexión estable!

Fonte: www.habr.com

Engadir un comentario