Organizzazione del lavoro remoto per le PMI con OpenVPN

Definizione del compito

Articolo che descrive come organizzare l'accesso remoto dei dipendenti utilizzando soluzioni open source e che può essere utilizzato sia per costruire un sistema completamente autonomo, sia per estensioni quando nel sistema commerciale esistente ci sono carenze di licenze o quando le sue prestazioni non sono sufficienti.

L'obiettivo dell'articolo è implementare un sistema completo per fornire accesso remoto all'organizzazione, che va oltre la semplice ‘installazione di OpenVPN in 10 minuti’.

Di conseguenza, otterremo un sistema in cui per l'autenticazione degli utenti verranno utilizzati certificati e (opzionalmente) un catalogo aziendale Active Directory. Così avremo un sistema a due fattori di verifica: 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à utilizzato in modalità autonoma.

Il costo per implementare la soluzione è solo una piccola quantità di risorse hardware e 1 ora di lavoro di un 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 allocate per 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, e la subnet per i client VPN è 172.16.20.0/23.

Per le connessioni esterne, utilizziamo il port 1194/udp, e nel DNS del nostro server è stata creata un'A-record gw.abc.ru.

È assolutamente sconsigliato disabilitare SELinux! 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. Cosa succede dopo

Installazione del sistema operativo e del software applicativo

Utilizziamo la distribuzione CentOS 7.8.2003. Abbiamo bisogno di installare il sistema operativo in configurazione minima. È comodo farlo utilizzando kickstart, la clonazione di un'immagine del sistema operativo precedentemente installata e altri strumenti.

Dopo l'installazione e l'assegnazione dell'indirizzo all'interfaccia di rete (secondo i requisiti, 172.16.19.123), eseguiamo l'aggiornamento del sistema operativo:

$ sudo yum update -y && reboot

È inoltre necessario assicurarsi che il nostro server stia sincronizzando il tempo.
Per installare il software applicativo, sono necessari i pacchetti openvpn, openvpn-auth-ldap, easy-rsa e vim come editor principale (sarà necessario il repository EPEL).

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

È utile installare l'agente ospite per la macchina virtuale:

$ sudo yum install open-vm-tools

per host VMware ESXi, o per oVirt

$ sudo yum install ovirt-guest-agent

Configurazione della crittografia

Passiamo alla directory easy-rsa:

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

Creiamo il file delle variabili:

$ sudo vim vars

con il seguente contenuto:

export KEY_COUNTRY="IT"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC S.R.L."
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 sono descritti i parametri per la fittizia organizzazione S.R.L. «ABC», che possono essere corretti con dati reali o lasciati come 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 corretto prima dell'emissione dei certificati per gli utenti.

Successivamente, configuriamo un centro di certificazione autonomo.

La configurazione include l'esportazione delle variabili, l'inizializzazione della CA, la generazione delle chiavi e del certificato della CA, la chiave Diffie-Hellman, la chiave TLS, così come la chiave e il certificato del server. La chiave della certificazione deve essere protetta con la massima attenzione e mantenuta segreta! Tutti i parametri delle richieste possono essere lasciati di default.

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 è completata.

Configurazione di OpenVPN

Passiamo alla directory di OpenVPN, creiamo le directory di servizio e aggiungiamo un collegamento 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

con il seguente contenuto

porta 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

Alcuni commenti sui parametri:

  • se durante il rilascio del certificato era stato specificato un altro nome, indicarlo;
  • la piscina degli indirizzi deve essere definita in base alle proprie esigenze*;
  • possono esserci uno o più percorsi e server DNS;
  • le ultime 2 righe sono necessarie per implementare l'autenticazione in AD**.

*L'intervallo di indirizzi scelto nell'esempio consentirà di connettersi contemporaneamente fino a 127 clienti, poiché è stata scelta una rete /23, e OpenVPN crea una sottorete per ciascun cliente con una maschera /30.
In circostanze particolari, la porta e il protocollo possono essere modificati, tuttavia, è importante tenere presente che la modifica del numero di porta comporterà la configurazione di SELinux, e l'uso del protocollo tcp aumenterà l'overhead, poiché il controllo della consegna dei pacchetti tcp viene già eseguito a livello dei pacchetti incapsulati nel tunnel.

**Se l'autenticazione in 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, useremo la verifica dell'account in AD.

Abbiamo bisogno di un account di dominio con diritti di utente normale e di un gruppo, la cui appartenenza determinerà la possibilità di connessione.

Creiamo il file di configurazione:

/etc/openvpn/ldap.conf

con il 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=it» — nome canonico per il binding a LDAP (UTENTE — bindUsr nel contenitore abc.it/Users);
  • Password b1ndP@SS — password dell'utente per il binding;
  • BaseDN «OU=allUsr,DC=abc,DC=it» — percorso da cui iniziare la ricerca dell'utente;
  • BaseDN «OU=myGrp,DC=abc,DC=it» — contenitore del gruppo autorizzato (gruppo myVPNUsr nel contenitore abc.it/myGrp);
  • SearchFilter "(cn=myVPNUsr)" — nome del gruppo autorizzato.

Avvio e diagnostica

Ora possiamo provare ad abilitare e avviare il nostro server:

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

Controllo dell'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 servono le chiavi e altre impostazioni, è molto utile racchiudere tutto questo in un unico file profilo. Questo file viene poi fornito all'utente e il profilo viene importato sul client OpenVPN. Per fare ciò, creiamo un modello di configurazione e uno script che genera il profilo.

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

Prima di emettere i certificati per gli utenti non dimenticate di impostare la durata richiesta per i certificati nel file delle impostazioni. Non deve essere troppo lungo, consiglio di limitarlo 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:

  • lines PUT YOUR… replace with the content your certificates;
  • in the remote directive specify the name/address of your gateway;
  • the auth-user-pass directive is used for additional external authentication.

In the home directory (or another convenient location), create a script to request a certificate and create a profile:

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 ~

Make the file executable:

chmod a+x ~/make.profile.sh

And we can issue our first certificate.

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

Revoke

In case of certificate compromise (loss, theft), it is necessary to revoke this certificate:

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

View issued and revoked certificates

To view issued and revoked certificates, just check the index file:

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

Explanations:

  • the first line contains the server certificate;
  • the first character
    • V (Valid) — valid;
    • R (Revocato) — revocato.

Configurazione della rete

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

Autorizzazione delle connessioni nel firewall locale:

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

Successivamente, abilitiamo l'instradamento 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, esiste sicuramente una suddivisione in sottoreti e dobbiamo comunicare ai router come inviare i pacchetti destinati ai nostri client VPN. Nella riga di comando eseguiamo un comando del tipo (a seconda dell'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 è gestito l'indirizzo esterno gw.abc.ru, è necessario consentire il passaggio dei pacchetti udp/1194.

Nel caso in cui l'organizzazione abbia regole di sicurezza restrittive, sul nostro server VPN è necessario configurare anche il firewall. A mio avviso, la configurazione delle catene FORWARD di iptables offre la maggiore flessibilità, anche se la loro configurazione è meno comoda. È più semplice utilizzare le «regole dirette» — direct rules, archiviate in un file. /etc/firewalld/direct.xml. La configurazione attuale delle regole può essere controllata in questo modo:

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

Fate una copia di backup del file prima di modificarlo:

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

Il contenuto approssimativo 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 '

Spiegazioni

Di fatto, queste sono regole iptables normali, imballate in modo diverso dopo l'introduzione di firewalld.

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

L'ultima riga è destinata al logging dei pacchetti scartati. Per attivare il logging, è necessario modificare il livello di debug nella configurazione di firewalld:

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

Applicare le impostazioni è un comando comune di firewalld per rileggere le impostazioni:

$ sudo firewall-cmd --reload

I pacchetti scartati possono essere visualizzati in questo modo:

grep forward_fw /var/log/messages

Cosa succede dopo

Con questa, la configurazione è completata!

Resta da installare il software client 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.

Connessione stabile!

Fonte: habr.com

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