Organizzazione del lavoro remoto per le PMI con OpenVPN

Definizione del compito

L'articolo descrive l'organizzazione dell'accesso remoto ai dipendenti utilizzando prodotti open source e può essere utilizzato sia per costruire un sistema completamente autonomo, sia per espandere un sistema commerciale esistente quando ci sono carenze di licenze o le sue prestazioni risultano insufficienti.

L'obiettivo dell'articolo è implementare un sistema completo per fornire accesso remoto all'organizzazione, che è un po' più di "installare OpenVPN in 10 minuti".

Di conseguenza, otterremo un sistema in cui l'autenticazione degli utenti utilizzerà certificati e (opzionalmente) un catalogo aziendale Active Directory. In questo modo, avremo un sistema con due fattori di autenticazione: ciò che possiedo (certificato) e ciò che so (password).

Il segno che un utente è autorizzato a connettersi è la sua appartenenza al gruppo myVPNUsr. Il centro di certificazione sarà autonomo.

Il costo di implementazione della soluzione è solo poche risorse hardware e 1 ora di lavoro dell'amministratore di sistema.

Utilizzeremo una macchina virtuale con OpenVPN e Easy-RSA versione 3 su CentOS 7, con 4 vCPU e 4 GiB di RAM per un calcolo di 100 connessioni.

Nell'esempio, la rete della nostra organizzazione è 172.16.0.0/16, in cui il server VPN con indirizzo 172.16.19.123 si trova nel segmento 172.16.19.0/24, i server DNS sono 172.16.16.16 e 172.16.17.17, mentre per i client VPN è stata assegnata la sottorete 172.16.20.0/23.

Per le connessioni esterne si utilizza la connessione sulla porta 1194/udp, e per il nostro server è stata creata un record A in DNS gw.abc.ru.

Disabilitare SELinux è categoricamente sconsigliato! OpenVPN funziona senza disabilitare le politiche di sicurezza.

Contenuto

  1. Installazione del sistema operativo e del software applicativo
  2. Configurazione della crittografia
  3. Configurazione di OpenVPN
  4. Autenticazione in AD
  5. Avvio e diagnostica
  6. Emissione e revoca del certificato
  7. Configurazione della rete
  8. E ora?

Installazione del sistema operativo e del software applicativo

Utiizziamo la distribuzione CentOS 7.8.2003. Ci serve installare il sistema operativo in una configurazione minimale. È comodo farlo utilizzando kickstart, clonando un'immagine del sistema operativo già installata e altri mezzi.

Dopo l'installazione, assegnando un indirizzo all'interfaccia di rete (secondo le condizioni specificate 172.16.19.123), eseguiamo l'aggiornamento del sistema operativo:

$ sudo yum update -y && reboot

È inoltre necessario assicurarsi che la nostra macchina stia eseguendo la sincronizzazione dell'orario.
Per l'installazione del software applicativo sono necessari i pacchetti openvpn, openvpn-auth-ldap, easy-rsa e vim come editor principale (ci sarà bisogno del repository EPEL).

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

Per la macchina virtuale, è utile installare l'agente guest:

$ sudo yum install open-vm-tools

per gli host VMware ESXi o per oVirt

$ sudo yum install ovirt-guest-agent

Configurazione della crittografia

Entriamo nella cartella easy-rsa:

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

Creiamo il file delle variabili:

$ sudo vim vars

del seguente contenuto:

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

Qui vengono descritti i parametri per una ipotetica organizzazione chiamata "ABC"; puoi modificarli con quelli reali o lasciare quelli dell'esempio. La cosa più importante nei parametri è l'ultima riga che definisce la durata della validità del certificato in giorni. Nell'esempio è stato utilizzato un valore di 10 anni (365*10+2 anni bisestili). Questo valore dovrà essere correttamente aggiornato prima del rilascio dei certificati per gli utenti.

Successivamente, configuriamo l'autorità di certificazione autonoma.

La configurazione comprende l'esportazione delle variabili, l'inizializzazione della CA, il rilascio della chiave e del certificato radice della CA, della chiave Diffie-Hellman, della chiave TLS, nonché della chiave e del certificato del server. La chiave dell'autorità di certificazione deve essere protetta e conservata segretamente! Tutti i parametri nelle richieste possono rimanere predefiniti.

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

A questo punto, la parte principale della configurazione del meccanismo crittografico è terminata.

Configurazione di OpenVPN

Procediamo nella cartella OpenVPN, creiamo le cartelle di supporto e aggiungiamo un link 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/

Creiamo il file di configurazione principale di OpenVPN:

$ sudo vim server.conf

del seguente contenuto

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

Alcune osservazioni sui parametri:

  • se durante il rilascio del certificato è stato indicato un nome diverso, specifica quello;
  • il pool degli indirizzi deve essere adattato alle tue necessità*;
  • le rotte e i server DNS possono essere uno o più;
  • le ultime 2 righe sono necessarie per implementare l'autenticazione in AD**.

*L'intervallo di indirizzi scelto nell'esempio consente di connettere fino a 127 client contemporaneamente, poiché è stata selezionata una rete /23 e OpenVPN crea una sottorete /30 per ogni client.
In caso di necessità particolare, la porta e il protocollo possono essere modificati, tuttavia è importante tenere presente che la modifica del numero di porta richiederà la configurazione di SELinux, e l'uso del protocollo TCP aumenterà le spese generali, poiché il controllo della consegna dei pacchetti TCP viene già effettuato a livello dei pacchetti incapsulati nel tunnel.

**Se l'autenticazione AD non è necessaria, commentali, salta la sezione successiva e nel modello rimuovi la riga auth-user-pass.

Autenticazione in AD

Per supportare il secondo fattore utilizzeremo la verifica dell'account in AD.

Abbiamo bisogno di un account nel dominio con diritti di utente standard e di un gruppo il cui appartenenza determinerà la possibilità di connessione.

Creiamo un file di configurazione:

/etc/openvpn/ldap.conf

del seguente contenuto

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"

Parametri principali:

  • URL «ldap://ldap.abc.ru» — indirizzo del controller di dominio;
  • BindDN «CN=bindUsr,CN=Users,DC=abc,DC=ru» — nome canonico per il binding a LDAP (utente — bindUsr nella directory abc.ru/Users);
  • Password b1ndP@SS — password dell'utente per il binding;
  • BaseDN «OU=allUsr,DC=abc,DC=ru» — percorso da cui iniziare la ricerca dell'utente;
  • BaseDN «OU=myGrp,DC=abc,DC=ru» — contenitore del gruppo autorizzante (gruppo myVPNUsr nel contenitore abc.ru/myGrp);
  • SearchFilter "(cn=myVPNUsr)" — nome del gruppo autorizzante.

Avvio e diagnostica

Ora possiamo provare a abilitare e avviare il nostro server:

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

Controllo avvio:

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

Emissione e revoca del certificato

Poiché oltre ai certificati stessi sono necessarie le chiavi e altre impostazioni, è molto comodo racchiudere tutto in un unico file di profilo. Questo file viene poi trasferito all'utente e il profilo viene importato sul client OpenVPN. Per questo creiamo un modello di impostazioni e uno script che genera il profilo.

Nel profilo è necessario aggiungere il contenuto dei file del certificato root (ca.crt) e della chiave TLS (ta.key).

Prima del rilascio dei certificati per gli utenti non dimenticare di impostare il termine di scadenza richiesto per i certificati nel file delle impostazioni. Non dovrebbe essere troppo lungo, consiglio di limitarsi a un massimo di 180 giorni.

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-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----


key-direction 1

-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----

Note:

  • righe PUT YOUR… cambiamo con il contenuto dei tuoi certificati;
  • nella direttiva remote specifica il nome/l'indirizzo del tuo gateway;
  • la direttiva auth-user-pass è utilizzata per un'autenticazione esterna aggiuntiva.

Nella home directory (o in un'altra posizione comoda) creiamo uno script per la richiesta del certificato e la creazione del profilo:

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 ~

Rendiamo il file eseguibile:

chmod a+x ~/make.profile.sh

E si può emettere il nostro primo certificato.

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

Revoca

In caso di compromissione del certificato (perdita, furto), è necessario revocare questo certificato:

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

Visualizza certificati emessi e revocati

Per visualizzare i certificati emessi e revocati basta aprire il file indice:

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

Spiegazioni:

  • la prima riga contiene il certificato del server;
  • il primo carattere
    • V (Valid) — valido;
    • R (Revoked) — revocato.

Configurazione della rete

Ultimi passaggi — configurazione della rete di trasmissione — routing e firewall.

Abilitazione delle connessioni nel firewall locale:

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

Successivamente, abilitiamo il routing del traffico IP:

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

In un ambiente aziendale ci sarà sicuramente una suddivisione in sottoreti e dobbiamo informare i router su come inviare i pacchetti destinati ai nostri client VPN. Eseguiamo un comando al prompt dei comandi simile (dipende dall'hardware utilizzato):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

e salviamo la configurazione.

Inoltre, sull'interfaccia del router di confine, dove viene gestito l'indirizzo esterno gw.abc.ru, è necessario consentire il passaggio dei pacchetti udp/1194.

Se nell'organizzazione vigono rigide norme di sicurezza, è necessario configurare anche un firewall sul nostro server VPN. A mio avviso, la configurazione delle catene FORWARD di iptables offre la massima flessibilità, anche se è meno comodo impostarle. Ecco qualche dettaglio in più sulla loro configurazione. È più conveniente utilizzare le “regole dirette” – direct rules, memorizzate in un file /etc/firewalld/direct.xml. Puoi scoprire la configurazione attuale delle regole così:

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

Prima di modificare il file, esegui un backup:

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

Il contenuto esemplificativo del file è il seguente:


  
    -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 '

Chiarimenti

Essenzialmente, queste sono regole iptables comuni, imballate diversamente dopo l'arrivo di firewalld.

L'interfaccia di destinazione nelle impostazioni predefinite è tun0, mentre l'esterno del tunnel può essere diverso, ad esempio, ens192, a seconda della piattaforma utilizzata.

L'ultima riga è destinata alla registrazione dei pacchetti scartati. Per far funzionare la registrazione, è necessario modificare il livello di debug nella configurazione di firewalld:

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

L'applicazione delle impostazioni è un comando comune di firewalld per rileggere le configurazioni:

$ sudo firewall-cmd --reload

È possibile visualizzare i pacchetti scartati in questo modo:

grep forward_fw /var/log/messages

E ora?

Con questa configurazione, hai finito!

Resta da installare il software cliente sul lato client, importare il profilo e connettersi. Per i sistemi operativi Windows, il pacchetto è disponibile su sito dello sviluppatore.

Infine, colleghiamo il nostro nuovo server ai sistemi di monitoraggio e archiviazione, e non dimentichiamo di installare regolarmente gli aggiornamenti.

Buona connessione!

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS - ProHoster