Organizzazione del lavoro remoto di un'organizzazione PMI su OpenVPN
Formulazione del problema
L'articolo descrive l'organizzazione dell'accesso remoto per i dipendenti su prodotti open source e può essere utilizzato sia per costruire un sistema completamente autonomo, sia sarà utile per l'espansione quando vi è carenza di licenze nel sistema commerciale esistente o le sue prestazioni sono insufficienti.
L’obiettivo dell’articolo è implementare un sistema completo per fornire accesso remoto a un’organizzazione, che sia poco più che “installare OpenVPN in 10 minuti”.
Di conseguenza, otterremo un sistema in cui i certificati e (facoltativamente) l'Active Directory aziendale verranno utilizzati per autenticare gli utenti. Quello. otterremo un sistema con due fattori di verifica: cosa ho (certificato) e cosa so (password).
Un segno che un utente è autorizzato a connettersi è la sua appartenenza al gruppo myVPNUsr. L'autorità di certificazione verrà utilizzata offline.
Il costo di implementazione della soluzione è solo di piccole risorse hardware e 1 ora di lavoro dell'amministratore di sistema.
Utilizzeremo una macchina virtuale con OpenVPN e Easy-RSA versione 3 su CetntOS 7, a cui vengono allocate 100 vCPU e 4 GiB RAM per 4 connessioni.
Nell'esempio, la rete della nostra organizzazione è 172.16.0.0/16, in cui il server VPN con l'indirizzo 172.16.19.123 si trova nel segmento 172.16.19.0/24, i server DNS 172.16.16.16 e 172.16.17.17 e la sottorete 172.16.20.0 .23/XNUMX è assegnato ai client VPN .
Per la connessione dall'esterno viene utilizzata la connessione tramite la porta 1194/udp e per il nostro server è stato creato un record A gw.abc.ru nel DNS.
È severamente sconsigliato disabilitare SELinux! OpenVPN funziona senza disabilitare le politiche di sicurezza.
Installazione del sistema operativo e del software applicativo
Utilizziamo la distribuzione CentOS 7.8.2003. Dobbiamo installare il sistema operativo in una configurazione minima. È conveniente farlo usando kickstart, clonando un'immagine del sistema operativo precedentemente installata e altri mezzi.
Dopo l'installazione, assegnando un indirizzo all'interfaccia di rete (secondo i termini dell'attività 172.16.19.123), aggiorniamo il sistema operativo:
$ sudo yum update -y && reboot
Dobbiamo anche assicurarci che la sincronizzazione dell'ora venga eseguita sulla nostra macchina.
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).
I parametri per l'organizzazione condizionale ABC LLC sono descritti qui; potete correggerli con quelli reali o lasciarli dall'esempio. La cosa più importante nei parametri è l'ultima riga, che determina il periodo di validità del certificato in giorni. Nell'esempio viene utilizzato il valore 10 anni (365*10+2 anni bisestili). Questo valore dovrà essere modificato prima dell'emissione dei certificati utente.
Successivamente, configuriamo un'autorità di certificazione autonoma.
La configurazione include l'esportazione delle variabili, l'inizializzazione della CA, l'emissione della chiave root e del certificato della CA, della chiave Diffie-Hellman, della chiave TLS e della chiave e del certificato del server. La chiave CA deve essere attentamente protetta e mantenuta segreta! Tutti i parametri di query possono essere lasciati come predefiniti.
Questo completa la parte principale della configurazione del meccanismo crittografico.
Configurazione di OpenVPN
Vai alla directory OpenVPN, crea directory di servizio e aggiungi 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/
Crea il file di configurazione principale di OpenVPN:
$ sudo vim server.conf
il 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 note sui parametri:
se in sede di emissione del certificato è stato specificato un nome diverso, indicarlo;
specifica il pool di indirizzi adatto alle tue attività*;
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 selezionato nell'esempio consentirà a un massimo di 127 client di connettersi simultaneamente, perché viene selezionata la rete /23 e OpenVPN crea una sottorete per ciascun client utilizzando la maschera /30.
Se particolarmente necessario, la porta e il protocollo possono essere modificati, tuttavia, va tenuto presente che la modifica del numero di porta comporterà la configurazione di SELinux e l'utilizzo del protocollo tcp aumenterà il sovraccarico, perché 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 rimuovere la riga auth-user-pass.
Autenticazione AD
Per supportare il secondo fattore, utilizzeremo la verifica dell'account in AD.
Abbiamo bisogno di un account nel dominio con i diritti di un utente normale e di un gruppo, la cui appartenenza determinerà la possibilità di connettersi.
systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Emissione e revoca del certificato
Perché Oltre ai certificati stessi, sono necessarie chiavi e altre impostazioni; è molto comodo racchiudere tutto questo in un unico file di profilo. Questo file viene quindi trasferito all'utente e il profilo viene importato sul client OpenVPN. Per fare ciò, creeremo un modello di impostazioni e uno script che generi il profilo.
È necessario aggiungere il contenuto dei file del certificato radice (ca.crt) e della chiave TLS (ta.key) al profilo.
Prima di emettere certificati utente non dimenticare di impostare il periodo di validità richiesto per i certificati nel file dei parametri. Non dovresti farcela troppo a lungo; ti consiglio di limitarti 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
<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>
Osservazioni:
строки METTI IL TUO... modificare il contenuto loro certificati;
nella direttiva remote, specifica il nome/indirizzo del tuo gateway;
la direttiva auth-user-pass viene utilizzata per un'ulteriore autenticazione esterna.
Nella directory home (o altro posto conveniente) creiamo uno script per richiedere un certificato e creare un 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 ~
Rendere il file eseguibile:
chmod a+x ~/make.profile.sh
E possiamo rilasciare il nostro primo certificato.
~/make.profile.sh my-first-user
richiamo
In caso di compromissione di un certificato (smarrimento, furto), è necessario revocare tale certificato:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Visualizza i certificati emessi e revocati
Per visualizzare i certificati emessi e revocati è sufficiente visionare il file indice:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Spiegazione:
la prima riga è il certificato del server;
primo personaggio
V (Valido) - valido;
R (Revocato) – richiamato.
Configurazione di rete
Gli ultimi passaggi riguardano la configurazione della rete di trasmissione: routing e firewall.
In un ambiente aziendale, è probabile che sia presente una sottorete e dobbiamo dire ai router come inviare i pacchetti destinati ai nostri client VPN. Sulla riga di comando eseguiamo il comando nel modo (a seconda dell'apparecchiatura utilizzata):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123
e salvare la configurazione.
Inoltre, sull'interfaccia del router di frontiera dove viene servito l'indirizzo esterno gw.abc.ru, è necessario consentire il passaggio dei pacchetti udp/1194.
Nel caso in cui l'organizzazione abbia rigide regole di sicurezza, è necessario configurare anche un firewall sul nostro server VPN. A mio parere, la massima flessibilità è fornita dalla configurazione delle catene iptables FORWARD, anche se configurarle è meno conveniente. Qualcosa in più su come configurarli. Per fare ciò, è più conveniente utilizzare le "regole dirette": regole dirette, memorizzate in un file /etc/firewalld/direct.xml. L'attuale configurazione delle regole può essere trovata come segue:
$ sudo firewall-cmd --direct --get-all-rule
Prima di modificare un file, creane una copia di backup:
Queste sono essenzialmente regole regolari di iptables, altrimenti pacchettizzate dopo l'avvento di firewalld.
L'interfaccia di destinazione con le impostazioni predefinite è tun0 e l'interfaccia esterna per il tunnel può essere diversa, ad esempio ens192, a seconda della piattaforma utilizzata.
L'ultima riga serve per registrare i pacchetti persi. Affinché la registrazione funzioni, è necessario modificare il livello di debug nella configurazione di firewalld:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
L'applicazione delle impostazioni è il solito comando firewalld per rileggere le impostazioni:
$ sudo firewall-cmd --reload
Puoi visualizzare i pacchetti eliminati in questo modo:
grep forward_fw /var/log/messages
Cosa c'è Next
Questo completa la configurazione!
Non resta che installare il software client lato client, importare il profilo e connettersi. Per i sistemi operativi Windows, il kit di distribuzione si trova su sito dello sviluppatore.
Infine, colleghiamo il nostro nuovo server ai sistemi di monitoraggio e archiviazione e non dimentichiamo di installare regolarmente gli aggiornamenti.