Problemformulering
Artiklen beskriver organiseringen af fjernadgang for medarbejdere på produkter med åbne kilder og kan bruges til at opbygge et helt autonomt system, samt være nyttigt til udvidelse, når der i det eksisterende kommercielle system er mangel på licenser eller dens ydeevne viser sig at være utilstrækkelig.
Artiklens mål er at implementere et helt system til at give fjernadgang til organisationen, hvilket er lidt mere end "installation af OpenVPN på 10 minutter".
Som resultat vil vi få et system, hvor certifikater og (valgfrit) virksomhedens Active Directory katalog vil blive brugt til autentificering af brugere. Herved får vi et system med to faktorer til verificering — hvad jeg har (certifikat) og hvad jeg kender (kodeord).
Et kendetegn ved, at brugeren er blevet givet tilladelse til at forbinde, er hans medlemskab i gruppen myVPNUsr. Certifikatcentret vil blive anvendt autonomt.
Omkostningerne ved at implementere løsningen er kun små hardware-ressourcer og 1 times arbejde for systemadministratoren.
Vi vil bruge en virtuel maskine med OpenVPN og Easy-RSA version 3 på CentOS 7, der er tildelt 4 vCPU og 4 GiB RAM, beregnet til 100 forbindelser.
I eksemplet er vores organisations netværk 172.16.0.0/16, hvor VPN-serveren med adressen 172.16.19.123 ligger i segmentet 172.16.19.0/24, DNS-serverne 172.16.16.16 og 172.16.17.17, og for VPN-klienter er der tildelt et subnet 172.16.20.0/23.
Til ekstern forbindelse anvendes tilslutning via port 1194/udp, og der er oprettet en A-post i DNS for vores server gw.abc.ru.
Det anbefales kategorisk ikke at deaktivere SELinux! OpenVPN fungerer uden at deaktivere sikkerhedspolitikkerne.
Indhold
Installation af OS og applikationssoftware
Vi bruger distributionen CentOS 7.8.2003. Vi har brug for installationen af OS i minimal konfiguration. Det er praktisk at gøre dette ved hjælp af , kloning af tidligere installerede OS-billeder og andre metoder.
Efter installationen, tildeling af IP-adresse til netværksinterfacet (ifølge opgavens betingelser 172.16.19.123), opdaterer vi OS:
$ sudo yum update -y && reboot
Det er også nødvendigt at sikre, at tidsynkronisering udføres på vores maskine.
For at installere applikationssoftwaren kræves pakkerne openvpn, openvpn-auth-ldap, easy-rsa og vim som hovedredaktør (EPEL-repositoriet vil være nødvendigt).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
For den virtuelle maskine er det nyttigt at installere gæsteagenten:
$ sudo yum install open-vm-toolstil VMware ESXi-værter eller til oVirt
$ sudo yum install ovirt-guest-agent
Indstilling af kryptografi
Vi går ind i easy-rsa-kataloget:
$ cd /usr/share/easy-rsa/3/Opretter en variabelfil:
$ sudo vim varsmed følgende indhold:
export KEY_COUNTRY="DK"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.dk"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.dk"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Her beskrives parametrene for den hypotetiske organisation ABC ApS; de kan ændres til virkelige eller forblive som i eksemplet. Den vigtigste parameter er den sidste linje, der angiver gyldighedsperioden for certifikatet i dage. I eksemplet er værdien sat til 10 år (365*10+2 skudår). Dette skal justeres inden brug af brugercertifikater.
Herefter opsætter vi en autonom certifikationsmyndighed.
Opsætningen omfatter eksport af variable, initialisering af CA, udstedelse af rodnøgle og certifikat for CA, Diffie-Hellman-nøgle, TLS-nøgle, samt servernøgle og certifikat. Nøglen til certifikationsmyndigheden skal beskyttes godt og opbevares hemmeligt! Alle parametre ved forespørgsler kan efterlades som standard.
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
Herved er hoveddelen af opsætningen af den kryptografiske mekanisme afsluttet.
Indstilling af OpenVPN
Vi går ind i OpenVPN-kataloget, opretter tjenestekataloger og tilføjer et link til 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/
Opretter den primære OpenVPN-konfigurationsfil:
$ sudo vim server.confaf følgende indhold
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
Nogle bemærkninger om parametrene:
- hvis der ved udstedelse af certifikatet blev angivet et andet navn — angiv det;
- adresserne i puljen skal angives til dine behov*;
- der kan være en eller flere ruter og DNS-servere;
- de sidste 2 linjer er nødvendige for at implementere autentificering i AD**.
*Det valgte adresseinterval fra eksemplet giver mulighed for, at op til 127 klienter kan tilsluttes samtidig, da netværket er valgt som /23, og OpenVPN opretter et undernetværk med masken /30 for hver klient.
Hvis der er et særligt behov, kan porten og protokol ændres, men det skal tages i betragtning, at ændring af portnummeret vil medføre justering af SELinux, mens brugen af TCP-protokollen vil øge overhead, da kontrol af leveringen af TCP-pakker allerede udføres på niveauet for de indkapslede pakker i tunnelen.
**Hvis AD-godkendelse ikke er nødvendig, kommentér dem, og spring over det følgende afsnit i skabelonen fjerne linjen auth-user-pass.
Autentificering i AD
Til at støtte den anden faktor vil vi bruge en konto-godkendelse i AD.
Vi har brug for en domænekonto med almindelige brugerrettigheder og en gruppe, hvor medlemskabet afgør muligheden for forbindelse.
Opretter konfigurationsfilen:
/etc/openvpn/ldap.confaf følgende indhold
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"
Primære parametre:
- URL "ldap://ldap.abc.ru" — adressen til domænekontrolleren;
- BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" — det kanoniske navn til binding til LDAP (bruger — bindUsr i containeren abc.ru/Users);
- Password b1ndP@SS — brugerens password til binding;
- BaseDN "OU=allUsr,DC=abc,DC=ru" — stien, hvorfra brugerens søgning starter;
- BaseDN "OU=myGrp,DC=abc,DC=ru" — containeren for godkendelsesgruppen (gruppen myVPNUsr i containeren abc.ru/myGrp);
- SearchFilter "(cn=myVPNUsr)" — navnet på godkendelsesgruppen.
Start og diagnose
Nu kan vi prøve at aktivere og starte vores server:
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Kontrol af opstart:
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Udstedelse og tilbagekaldelse af certifikat
Da der udover selve certifikaterne også er brug for nøgler og andre indstillinger, er det meget praktisk at pakke det hele ind i én profilfil. Denne fil sendes derefter til brugeren, og profilen importeres på OpenVPN-klienten. Til dette opretter vi en skabelon for indstillingerne og et script, der danner profilen.
Profils indhold skal inkludere indholdet af rodcertifikatfilerne (ca.crt) og TLS-nøglen (ta.key).
Før udstedelse af brugercertifikater glem ikke at angive den nødvendige udløbsdato for certifikaterne i parameterfilen. Det bør ikke være for lang, jeg anbefaler at begrænse det til maksimalt 180 dage.
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-----
Bemærkninger:
- linjer PUT YOUR… ændres til indholdet dine certifikater;
- angiv navnet/adressen på din gateway i remote direktivet;
- auth-user-pass direktivet bruges til ekstern autentificering.
I din hjemme-mappe (eller et andet praktisk sted) opretter vi et script til anmodning om certifikat og oprettelse af profil:
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 ~
Gør filen eksekverbar:
chmod a+x ~/make.profile.shOg vi kan udstede vores første certifikat.
~/make.profile.sh my-first-userAnmeldelse
I tilfælde af kompromittering af certifikatet (tab, tyveri) er det nødvendigt at tilbagekalde dette certifikat:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Visning af udstedte og tilbagekaldte certifikater
For at se de udstedte og tilbagekaldte certifikater, skal du bare tjekke indeksfilen:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Forklaringer:
- den første række indeholder servercertifikatet;
- den første karakter
- V (Valid) — gyldig;
- R (Revoked) — tilbagekaldt.
Netværksopsætning
De sidste skridt — opsætning af netværksoverførsel — routing og firewalls.
Tilladelse til forbindelser i den lokale firewall:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Dernæst aktiverer vi IP trafikrouting:
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
I et virksomhedsmiljø findes der sandsynligvis undernet, og vi skal informere routeren(e) om, hvordan man sender pakker til vores VPN-klienter. I kommandoprompten kører vi kommandoen i stil med (afhænger af det anvendte udstyr):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123og gemmer konfigurationen.
Derudover skal der på grænserouterens interface, hvor den eksterne adresse gw.abc.ru betjenes, gives tilladelse til passage af UDP-pakker/1194.
Hvis der gælder strenge sikkerhedsregler i organisationen, skal der også konfigureres en firewall på vores VPN-server. Efter min mening giver konfigurationen af iptables kæderne FORWARD den største fleksibilitet, selvom det er mindre praktisk at konfigurere dem. Her er lidt mere om, hvordan man konfigurerer dem. Det er nemmest at bruge "direct rules", der gemmes i en fil. /etc/firewalld/direct.xml. Den aktuelle konfiguration af reglerne kan findes således:
$ sudo firewall-cmd --direct --get-all-ruleFør du ændrer filen, skal du lave en sikkerhedskopi:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakEn omtrentlig indhold af filen ser således ud:
-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 '
Forklaringer
I bund og grund er dette almindelige iptables-regler, der er pakket ind efter introduktionen af firewalld.
Målgrænsefladen ved standardindstillingerne er tun0, mens den eksterne for tunnelen kan være en anden, f.eks. ens192, afhængigt af den anvendte platform.
Den sidste linje er til logføring af afvist pakker. For at logføring kan fungere, skal niveauet for debugging ændres i firewalld-konfigurationen:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Anvendelsen af indstillingerne er en almindelig firewalld-kommando til at genlæse indstillingerne:
$ sudo firewall-cmd --reloadAfviste pakker kan ses således:
grep forward_fw /var/log/messages
vil være udsolgt
Så er konfigurationen færdig!
Det resterende er at installere klientsoftwaren på klientsiden, importere profilen og oprette forbindelse. For Windows-baserede operativsystemer er distributionen placeret på .
Til slut forbinder vi vores nye server til overvågnings- og arkiveringssystemerne og husker at installere opdateringer regelmæssigt.
Stabil forbindelse!
Kilde: habr.com
