Urganizazione di u travagliu remoto di una urganizazione SMB in OpenVPN

Formulazione di u prublema

L'articulu descrive l'urganizazione di l'accessu remotu per l'impiegati nantu à i prudutti open source è pò esse usatu sia per custruisce un sistema completamente autònumu, è serà utile per espansione quandu ci hè una mancanza di licenze in u sistema cummerciale esistente o u so rendimentu hè insufficiente.

U scopu di l'articulu hè di implementà un sistema cumpletu per furnisce l'accessu remotu à una urganizazione, chì hè pocu più di "installà OpenVPN in 10 minuti".

In u risultatu, averemu un sistema in quale i certificati è (opcionalmente) l'Active Directory corporativu seranu utilizati per autentificà l'utilizatori. Chì. averemu un sistema cù dui fattori di verificazione - ciò chì aghju (certificatu) è ciò chì cunnoscu (password).

Un signu chì un utilizatore hè permessu di cunnette hè a so appartenenza à u gruppu myVPNUsr. L'autorità di certificazione serà aduprata offline.

U costu di l'implementazione di a suluzione hè solu risorsi di hardware petite è 1 ora di travagliu di l'amministratore di u sistema.

Utilizemu una macchina virtuale cù OpenVPN è Easy-RSA versione 3 in CetntOS 7, chì hè attribuita 100 vCPU è 4 GiB RAM per 4 cunnessione.

In l'esempiu, a reta di a nostra urganizazione hè 172.16.0.0/16, in quale u servitore VPN cù l'indirizzu 172.16.19.123 si trova in u segmentu 172.16.19.0/24, servitori DNS 172.16.16.16 è 172.16.17.17, è 172.16.20.0 sub.net. .23/XNUMX hè attribuitu per i clienti VPN.

Per cunnette da l'esternu, una cunnessione via u portu 1194/udp hè utilizatu, è un A-record gw.abc.ru hè statu creatu in u DNS per u nostru servitore.

Hè strettamente micca cunsigliatu di disattivà SELinux! OpenVPN funziona senza disattivà e pulitiche di sicurezza.

Cuntenuti

  1. Installazione di u SO è u software d'applicazione
  2. Configurazione di a criptografia
  3. Configurazione di OpenVPN
  4. Autentificazione AD
  5. Startup è diagnostica
  6. Emissione di certificatu è revocazione
  7. Cunfigurazione di rete
  8. Chì vene

Installazione di u SO è u software d'applicazione

Avemu aduprà a distribuzione CentOS 7.8.2003. Avemu bisognu di stallà u SO in una cunfigurazione minima. Hè cunvenutu per fà questu usu kickstart, clonà una maghjina OS installata prima è altri mezi.

Dopu a stallazione, assignendu un indirizzu à l'interfaccia di a rete (sicondu i termini di u compitu 172.16.19.123), aghjurnà u SO:

$ sudo yum update -y && reboot

Avemu ancu bisognu di assicurà chì a sincronizazione di u tempu hè realizata nantu à a nostra macchina.
Per installà u software di l'applicazione, avete bisognu di i pacchetti openvpn, openvpn-auth-ldap, easy-rsa è vim cum'è editore principale (avete bisognu di u repository EPEL).

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

Hè utile installà un agentu invitatu per una macchina virtuale:

$ sudo yum install open-vm-tools

per host VMware ESXi, o per oVirt

$ sudo yum install ovirt-guest-agent

Configurazione di a criptografia

Andà à u cartulare easy-rsa:

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

Crea un schedariu variabile:

$ sudo vim vars

u seguenti cuntenutu:

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 paràmetri per l'urganizazione cundizionale ABC LLC sò descritti quì; pudete correggerli à i veri o lascià da l'esempiu. A più impurtante in i paràmetri hè l'ultima linea, chì determina u periodu di validità di u certificatu in ghjorni. L'esempiu usa u valore 10 anni (365 * 10 + 2 anni bisestili). Stu valore deve esse aghjustatu prima chì i certificati d'utilizatori sò emessi.

Dopu, cunfiguremu una autorità di certificazione autonoma.

L'installazione include l'esportazione di variabili, l'inizializazione di a CA, l'emissione di a chjave di a radica CA è u certificatu, a chjave Diffie-Hellman, a chjave TLS è a chjave di u servitore è u certificatu. A chjave CA deve esse prutetta cù cura è tenuta sicreta! Tutti i paràmetri di dumanda ponu esse lasciati predeterminati.

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

Questu cumpleta a parte principale di a creazione di u mecanismu criptograficu.

Configurazione di OpenVPN

Andate à u cartulare OpenVPN, create cartulari di serviziu è aghjunghje un ligame à 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 u schedariu principale di cunfigurazione OpenVPN:

$ sudo vim server.conf

seguenti cuntenutu

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 nantu à i paràmetri:

  • se un nome differente hè statu specificatu quandu emette u certificatu, indicà;
  • specificà u pool di indirizzi per adattà à i vostri compiti *;
  • pò esse una o più rotte è servitori DNS;
  • L'ultimi 2 linee sò necessarii per implementà l'autentificazione in AD**.

* A gamma di indirizzi selezziunati in l'esempiu permetterà finu à i clienti 127 per cunnette simultaneamente, perchè a rete / 23 hè sceltu, è OpenVPN crea una subnet per ogni cliente utilizendu a maschera / 30.
S'ellu hè particularmente necessariu, u portu è u protokollu pò esse cambiatu, però, deve esse cunsideratu chì cambià u numeru di u portu di u portu implicarà a cunfigurazione di SELinux, è l'usu di u protokollu tcp aumenterà l'overhead, perchè U cuntrollu di consegna di pacchetti TCP hè digià realizatu à u livellu di i pacchetti incapsulati in u tunnel.

**Se l'autentificazione in AD ùn hè micca necessariu, cummentate, saltate a sezione dopu, è in u mudellu caccià a linea auth-user-pass.

Autentificazione AD

Per sustene u sicondu fattore, avemu aduprà a verificazione di u contu in AD.

Avemu bisognu di un contu in u duminiu cù i diritti di un utilizatore ordinariu è un gruppu, l'appartenenza in quale determinarà a capacità di cunnette.

Crea un schedariu di cunfigurazione:

/etc/openvpn/ldap.conf

seguenti cuntenutu

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

Parametri principali:

  • URL "ldap://ldap.abc.ru" - indirizzu di cuntrollu di duminiu;
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" - nome canonicu per u ligame à LDAP (UZ - bindUsr in u container abc.ru/Users);
  • Password b1ndP@SS - password d'utilizatore per ubligatoriu;
  • BaseDN "OU=allUsr,DC=abc,DC=ru" - u percorsu da quale principià a ricerca di l'utilizatore;
  • BaseDN "OU=myGrp,DC=abc,DC=ru" - cuntainer di u gruppu chì permette (gruppu myVPNUsr in u container abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" hè u nome di u gruppu chì permette.

Startup è diagnostica

Avà pudemu pruvà à attivà è inizià u nostru servitore:

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

Verificazione di l'iniziu:

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

Emissione di certificatu è revocazione

Perchè In più di i certificati stessi, avete bisognu di chjavi è altri paràmetri; hè assai cunvenutu per imballà tuttu questu in un schedariu di prufilu. Stu schedariu hè dopu trasferitu à l'utilizatore è u prufilu hè impurtatu nantu à u cliente OpenVPN. Per fà questu, creeremu un mudellu di paràmetri è un script chì genera u prufilu.

Avete bisognu di aghjunghje u cuntenutu di u certificatu radicali (ca.crt) è i schedarii di chjave TLS (ta.key) à u prufilu.

Prima di emissione di certificati d'utilizatore ùn vi scurdate di stabilisce u periodu di validità necessariu per i certificati in u schedariu di paràmetri. Ùn duvete micca fà troppu longu; vi cunsigliu di limità à un massimu di 180 ghjorni.

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>

Noti:

  • corde Mettite u vostru... cambià à u cuntenutu a so certificati;
  • in a direttiva remota, specifica u nome / indirizzu di a vostra porta;
  • a direttiva auth-user-pass hè aduprata per l'autentificazione esterna supplementaria.

In u cartulare di casa (o un altru locu cunvene) creemu un script per dumandà un certificatu è creà un prufilu:

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 ~

Fendu u schedariu eseguibile:

chmod a+x ~/make.profile.sh

È pudemu emette u nostru primu certificatu.

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

Feedback

In casu di cumprumissu di un certificatu (perdita, furtu), hè necessariu di revocà stu certificatu:

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

Vede i certificati emessi è revocati

Per vede i certificati emessi è revocati, basta à vede u schedariu index:

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

Пояснения:

  • a prima linea hè u certificatu di u servitore;
  • primu caratteru
    • V (Valid) - validu;
    • R (Revocatu) - ricurdatu.

Cunfigurazione di rete

L'ultimi passi sò di cunfigurà a reta di trasmissione - routing è firewalls.

Permettenu cunnessione in u firewall locale:

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

Dopu, attivate u routing di u trafficu IP:

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

In un ambiente corporativu, ci hè prubabile di esse subnetting è avemu bisognu di dì à u router (s) cumu mandà pacchetti destinati à i nostri clienti VPN. Nantu à a linea di cumanda, eseguimu u cumandamentu in a manera (secondu l'equipaggiu utilizatu):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

è salvà a cunfigurazione.

Inoltre, nantu à l'interfaccia di u router di cunfini induve l'indirizzu esternu gw.abc.ru hè servutu, hè necessariu di permette u passaghju di pacchetti udp/1194.

In casu chì l'urganizazione hà regule strette di sicurità, un firewall deve ancu esse cunfiguratu in u nostru servitore VPN. In u mo parè, a più grande flessibilità hè furnita da a creazione di catene iptables FORWARD, ancu s'ellu hè menu cunvene. Un pocu di più nantu à a stallazione. Per fà questu, hè più cunvenutu di utilizà "reguli diretti" - regule dirette, guardate in un schedariu /etc/firewalld/direct.xml. A cunfigurazione attuale di e regule pò esse truvata cusì:

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

Prima di cambià un schedariu, fate una copia di salvezza:

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

U cuntenutu apprussimativu di u schedariu sò:

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

Quessi sò essenzialmente reguli iptables regulari, altrimenti imballati dopu l'avventu di firewalld.

L'interfaccia di destinazione cù i paràmetri predeterminati hè tun0, è l'interfaccia esterna per u tunnel pò esse diversa, per esempiu, ens192, secondu a piattaforma utilizata.

L'ultima linea hè per a registrazione di i pacchetti sguassati. Per u logging per travaglià, avete bisognu di cambià u livellu di debug in a cunfigurazione firewalld:

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

L'applicazione di i paràmetri hè u cumandimu di firewalld abituale per rileghje i paràmetri:

$ sudo firewall-cmd --reload

Pudete vede i pacchetti abbandunati cusì:

grep forward_fw /var/log/messages

Chì vene

Questu cumpleta a stallazione!

Tuttu ciò chì resta hè di stallà u software di u cliente da u cliente, impurtà u prufilu è cunnette. Per i sistemi operativi Windows, u kit di distribuzione hè situatu situ di sviluppatore.

Infine, cunnettemu u nostru novu servitore à i sistemi di monitoraghju è archiviu, è ùn vi scurdate di stallà regularmente l'aghjurnamenti.

Cunnessione stabile!

Source: www.habr.com

Add a comment