Postavljanje zadatka
Ovaj članak opisuje organizaciju udaljenog pristupa zaposlenika putem proizvoda s otvorenim izvorom i može se koristiti za izgradnju potpuno autonomnog sustava ili kao pomoć pri proširenju, kada postojeći komercijalni sustav pati od nedostatka licenci ili njegova izvedba nije dovoljna.
Cilj članka je implementirati završen sustav za pružanje udaljenog pristupa organizaciji, što je malo više od „instalacije OpenVPN-a za 10 minuta”.
Kao rezultat toga, dobit ćemo sustav u kojem će se za autentifikaciju korisnika koristiti certifikati i (opcionalno) korporativni direktorij Active Directory. Tako ćemo dobiti sustav s dvostrukom provjerom — što posjedujem (certifikat) i što znam (lozinka).
Znaku da je korisniku dopušteno povezivanje je njegovo članstvo u grupi myVPNUsr. Centar za certifikaciju će biti autonoman.
Cijena implementacije rješenja je samo mali hardverski resursi i 1 sat rada sistem administratora.
Koristit ćemo virtualnu mašinu s OpenVPN-om i Easy-RSA verzije 3 na CentOS 7, kojoj su raspoređena 4 vCPU i 4 GiB RAM-a za 100 povezanih korisnika.
U primjeru, mreža naše organizacije je 172.16.0.0/16, u kojoj je VPN poslužitelj s adresom 172.16.19.123 smješten u segmentu 172.16.19.0/24, DNS poslužitelji su 172.16.16.16 i 172.16.17.17, a za VPN klijente je dodijeljena podmreža 172.16.20.0/23.
Za vanjsko povezivanje koristi se veza putem porta 1194/udp, a u DNS-u za naš poslužitelj je kreirana A-zapis gw.abc.ru.
Kategorijski se ne preporučuje isključivanje SELinux-a! OpenVPN radi bez isključivanja politika sigurnosti.
Sadržaj
Instalacija OS-a i aplikativnog softvera
Koristimo distribuciju CentOS 7.8.2003. Potrebna nam je instalacija OS-a u minimalnoj konfiguraciji. Praktično je to raditi koristeći , kloniranje prethodno instaliranog OS-a i drugim sredstvima.
Nakon instalacije, dodeljivanja adrese mrežnom sučelju (prema zadatku 172.16.19.123), izvršavamo ažuriranje OS-a:
$ sudo yum update -y && reboot
Također je potrebno osigurati da se na našoj mašini vrši sinkronizacija vremena.
Za instalaciju aplikativnog softvera potrebni su paketi openvpn, openvpn-auth-ldap, easy-rsa i vim kao glavni urednik (trebat će nam EPEL repozitorij).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
Za virtualnu mašinu korisno je instalirati gostujuću agenciju:
$ sudo yum install open-vm-toolsza VMware ESXi hotele ili za oVirt
$ sudo yum install ovirt-guest-agent
Podešavanje kriptografije
Idemo u mapu easy-rsa:
$ cd /usr/share/easy-rsa/3/Kreiramo datoteku s varijablama:
$ sudo vim varssljedeće sadržaje:
export KEY_COUNTRY="HR"
export KEY_PROVINCE="MojaRegija"
export KEY_CITY="MojGrad"
export KEY_ORG="ABC d.o.o."
export KEY_EMAIL="admin@abc.hr"
export KEY_CN="sviKorisnici"
export KEY_OU="sviKorisnici"
export KEY_NAME="gw.abc.hr"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Ovdje su opisane postavke za fiktivnu organizaciju d.o.o. "ABC"; možete ih ispraviti na stvarne ili ostaviti iz primjera. Najvažnija stavka kod postavki je posljednji red, koji definira razdoblje valjanosti certifikata u danima. U primjeru je postavljena vrijednost 10 godina (365*10+2 prijestupne godine). Ovu vrijednost treba prilagoditi prije izdavanja korisničkih certifikata.
Nakon toga postavljamo autonomni centar za certificiranje.
Postavke uključuju izvoz varijabli, inicializaciju CA, izdavanje korijenskih ključeva i certifikata CA, Diffie-Hellman ključ, TLS ključ, kao i ključ i certifikat poslužitelja. Ključ centra za certificiranje treba čuvati i čuvati u tajnosti! Sve postavke kod zahtjeva mogu ostati prema zadanim vrijednostima.
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
Time je osnovni dio postavke kriptografskog mehanizma završen.
Podešavanje OpenVPN-a
Idemo u mapu OpenVPN, kreiramo radne mape i dodajemo poveznicu na 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/
Kreiramo glavni konfiguracijski fajl OpenVPN:
$ sudo vim server.confsljedeće sadržine
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
Nekoliko napomena u vezi s parametrima:
- ako je prilikom izdavanja certifikata navedeno drugo ime — navedite ga;
- pulp adresâ navedite prema svojim potrebama*;
- ruta i DNS serveri mogu biti jedan ili više;
- Posljednje 2 linije potrebne su za implementaciju autentifikacije u AD**.
*Odabrani raspon adresa u primjeru omogućit će povezivanje do 127 klijenata, jer je odabrana mreža /23, a OpenVPN stvara podmrežu s maskom /30 za svakog korisnika.
U slučaju posebne potrebe, port i protokol mogu se promijeniti, no treba imati na umu da će promjena broja porta zahtijevati podešavanje SELinux-a, a korištenje TCP protokola povećat će troškove, jer kontrola isporuke TCP paketa već se vrši na razini paketa koji su encapsulirani u tunelu.
**Ako AD autentifikacija nije potrebna, komentirajte ih, sljedeći odjeljak — preskočite, a u predlošku izbrišite redak auth-user-pass.
Autentifikacija u AD
Kako bismo podržali drugi faktor, koristit ćemo provjeru računa u AD-u.
Trebamo korisnički račun u domeni s pravima običnog korisnika i grupu, čije članstvo će odrediti mogućnost povezivanja.
Stvaramo konfiguracijsku datoteku:
/etc/openvpn/ldap.confsljedeće sadržine
URL "ldap://ldap.abc.hr"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=hr"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
BaseDN "OU=allUsr,DC=abc,DC=hr"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
BaseDN "OU=myGrp,DC=abc,DC=hr"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
Osnovni parametri:
- URL „ldap://ldap.abc.hr“ — adresa kontrolera domene;
- BindDN „CN=bindUsr,CN=Users,DC=abc,DC=hr“ — kanoničko ime za vezivanje uz LDAP (korisnik — bindUsr u kontejneru abc.hr/Users);
- Password b1ndP@SS — lozinka korisnika za vezivanje;
- BaseDN „OU=allUsr,DC=abc,DC=hr“ — putanja s koje počinjemo pretraživanje korisnika;
- BaseDN „OU=myGrp,DC=abc,DC=hr“ — kontejner odobravajuće grupe (grupa myVPNUsr u kontejneru abc.hrmmyGrp);
- SearchFilter "(cn=myVPNUsr)" — ime odobravajuće grupe.
Pokretanje i dijagnostika
Sada možemo probati uključiti i pokrenuti naš server:
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Provjera pokretanja:
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Izdavanje i opoziv certifikata
Budući da osim samih certifikata trebaju i ključevi i ostale postavke, vrlo je praktično sve to obaviti u jednu datoteku profila. Ova datoteka se zatim predaje korisniku i profil se već uvozi na klijentu OpenVPN. Za ovo ćemo stvoriti predložak postavki i skriptu koja formira profil.
U profil treba dodati sadržaj datoteka korijenskog certifikata (ca.crt) i TLS ključ (ta.key).
Prije izdavanja korisničkih certifikata ne zaboravite postaviti potrebni rok važenja certifikata u datoteci parametara. Ne bi trebao biti predug, preporučujem ograničenje na maksimalno 180 dana.
vim /usr/share/easy-rsa/3/vars...
export EASYRSA_CERT_EXPIRE=180
vim /usr/share/easy-rsa/3/client/template.ovpnclient
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-----
Napomene:
- redovi PUT YOUR… mijenjamo na sadržaj svojih certifikata;
- u direktivi remote navedite ime/adresu svog gateway-a;
- direktiva auth-user-pass koristi se za dodatnu vanjsku autentifikaciju.
U svom domaćem direktoriju (ili drugom prikladnom mjestu) kreiramo skriptu za zahtjev certifikata i izradu profila:
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 ~
Učinimo datoteku izvršnom:
chmod a+x ~/make.profile.shI možemo izdati naš prvi certifikat.
~/make.profile.sh my-first-userRevokacija
U slučaju kompromitacije certifikata (gubitak, krađa) potrebno je opozvati taj certifikat:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Pregled izdanih i opozvanih certifikata
Za pregled izdanih i opozvanih certifikata dovoljno je pregledati indeksnu datoteku:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Objašnjenja:
- prvi redak sadrži certifikat servera;
- prvi simbol
- V (Valid) — važeći;
- R (Revoked) — opozvan.
Podešavanje mreže
Zadnji koraci — konfiguracija mrežne transmisije — rutiranja i vatrozida.
Dopustite povezivanja u lokalnom vatrozidu:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Nakon toga, uključite IP promet rutiranja:
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
U korporativnom okruženju sigurno ovise o podmrežama i moramo obavijestiti usmjerivače kako slati pakete usmjereni našim VPN klijentima. U komandnoj liniji izvršite naredbu u stilu (ovisno o korištenoj opremi):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123i spremite konfiguraciju.
Osim toga, na sučelju vanjskog usmjerivača, gdje se obrađuje vanjska adresa gw.abc.ru, potrebno je omogućiti prolazak paketa udp/1194.
U slučaju da u organizaciji vrijede stroga pravila sigurnosti, također je potrebno konfigurirati vatrozid na našem VPN poslužitelju. Po mom mišljenju, najveću fleksibilnost osigurava konfiguracija iptables lanaca FORWARD, iako je njihovo postavljanje manje praktično. Malo više o njihovoj konfiguraciji. Najlakše je koristiti "izravna pravila" – direct rules, pohranjena u datoteci /etc/firewalld/direct.xml. Aktivnu konfiguraciju pravila možete saznati na sljedeći način:
$ sudo firewall-cmd --direct --get-all-rulePrije promjene datoteke napravite sigurnosnu kopiju:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakPribližan sadržaj datoteke je sljedeći:
-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 '
Objašnjenja
Zahtjev se zapravo radi o uobičajenim pravilima iptables, samo pakiranim nakon dolaska firewalld-a.
Odredišni sučelje prema zadanim postavkama je tun0, a vanjsko za tunel može biti drugo, npr. ens192, ovisno o korištenoj platformi.
Zadnji redak je namijenjen za evidentiranje odbijenih paketa. Kako bi evidentiranje radilo, potrebno je promijeniti razinu otklanjanja pogrešaka u konfiguraciji firewalld:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Primjena postavki – uobičajena naredba firewalld-a za ponovno učitavanje postavki:
$ sudo firewall-cmd --reloadOdbijene pakete možete pregledati na sljedeći način:
grep forward_fw /var/log/messages
Što dalje
S ovim je postavljanje završeno!
Preostaje samo na strani klijenta instalirati klijentski softver, uvesti profil i povezati se. Za Windows sustave distribuirani paket je smješten na .
Na kraju, povezujemo naš novi poslužitelj s sustavima za nadgledanje i arhiviranje, i ne zaboravimo redovito instalirati ažuriranja.
Stabilne veze!
Izvor: habr.com
