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.

contenuto

  1. Installazione del sistema operativo e del software applicativo
  2. Impostazione della crittografia
  3. Configurazione di OpenVPN
  4. Autenticazione AD
  5. Avvio e diagnostica
  6. Emissione e revoca del certificato
  7. Configurazione di rete
  8. Cosa c'è Next

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).

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

È utile installare un agente guest per una macchina virtuale:

$ sudo yum install open-vm-tools

per host VMware ESXi o per oVirt

$ sudo yum install ovirt-guest-agent

Impostazione della crittografia

Vai alla directory easy-rsa:

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

Crea un file variabile:

$ sudo vim vars

come segue:

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

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.

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

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.

Crea un file di configurazione:

/etc/openvpn/ldap.conf

il seguente contenuto

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

I parametri principali:

  • URL “ldap://ldap.abc.ru” - indirizzo del controller di dominio;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - nome canonico per l'associazione a LDAP (UZ - bindUsr nel contenitore abc.ru/Users);
  • Password b1ndP@SS: password utente per l'associazione;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — il percorso da cui iniziare la ricerca dell'utente;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – contenitore del gruppo consentito (gruppo myVPNUsr nel contenitore abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" è il nome del gruppo che lo consente.

Avvio e diagnostica

Ora possiamo provare ad abilitare e avviare il nostro server:

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

Controllo all'avvio:

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.

Consentire le connessioni nel firewall locale:

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

Successivamente, abilita 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, è 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:

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

I contenuti approssimativi del file sono:

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

spiegazioni

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.

Connessione stabile!

Fonte: habr.com

Aggiungi un commento