Organisering af fjernarbejde for en SMB-organisation på OpenVPN
Formulering af problemet
Artiklen beskriver tilrettelæggelsen af fjernadgang for medarbejdere på open source-produkter og kan både bruges til at bygge et helt autonomt system, og vil være nyttig til udvidelse, når der er mangel på licenser i det eksisterende kommercielle system eller dets ydeevne er utilstrækkelig.
Målet med artiklen er at implementere et komplet system til at give fjernadgang til en organisation, hvilket er lidt mere end at "installere OpenVPN på 10 minutter."
Som et resultat vil vi få et system, hvor certifikater og (valgfrit) virksomhedens Active Directory vil blive brugt til at autentificere brugere. At. vi får et system med to verifikationsfaktorer - hvad jeg har (certifikat) og hvad jeg ved (adgangskode).
Et tegn på, at en bruger har tilladelse til at oprette forbindelse, er deres medlemskab i myVPNUsr-gruppen. Certifikatmyndigheden vil blive brugt offline.
Omkostningerne ved at implementere løsningen er kun små hardwareressourcer og 1 times arbejde for systemadministratoren.
Vi vil bruge en virtuel maskine med OpenVPN og Easy-RSA version 3 på CetntOS 7, som er tildelt 100 vCPU'er og 4 GiB RAM pr. 4 forbindelser.
I eksemplet er vores organisations netværk 172.16.0.0/16, hvor VPN-serveren med adressen 172.16.19.123 er placeret i segmentet 172.16.19.0/24, DNS-servere 172.16.16.16 og 172.16.17.17. .172.16.20.0/23 er allokeret til VPN-klienter.
For at forbinde udefra bruges en forbindelse via port 1194/udp, og der er oprettet en A-record gw.abc.ru i DNS til vores server.
Det anbefales strengt ikke at deaktivere SELinux! OpenVPN fungerer uden at deaktivere sikkerhedspolitikker.
Vi bruger CentOS 7.8.2003 distributionen. Vi skal installere OS i en minimal konfiguration. Det er praktisk at gøre dette ved hjælp af kickstart, kloning af et tidligere installeret OS-image og andre midler.
Efter installation, tildeling af en adresse til netværksgrænsefladen (i henhold til vilkårene for opgave 172.16.19.123), opdaterer vi OS:
$ sudo yum update -y && reboot
Vi skal også sørge for, at tidssynkronisering udføres på vores maskine.
For at installere applikationssoftware skal du bruge pakkerne openvpn, openvpn-auth-ldap, easy-rsa og vim som hovededitor (du skal bruge EPEL-lageret).
Parametrene for den betingede organisation ABC LLC er beskrevet her; du kan rette dem til de rigtige eller forlade dem fra eksemplet. Det vigtigste i parametrene er den sidste linje, som bestemmer certifikatets gyldighedsperiode i dage. Eksemplet bruger værdien 10 år (365*10+2 skudår). Denne værdi skal justeres, før brugercertifikater udstedes.
Dernæst konfigurerer vi en selvstændig certificeringsmyndighed.
Opsætningen omfatter eksport af variabler, initialisering af CA, udstedelse af CA-rodnøgle og certifikat, Diffie-Hellman-nøgle, TLS-nøgle og servernøgle og certifikat. CA-nøglen skal omhyggeligt beskyttes og holdes hemmelig! Alle forespørgselsparametre kan efterlades som standard.
Dette fuldender hoveddelen af opsætningen af den kryptografiske mekanisme.
Opsætning af OpenVPN
Gå til OpenVPN-biblioteket, opret servicemapper og tilføj 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/
Opret den primære OpenVPN-konfigurationsfil:
$ sudo vim server.conf
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 et andet navn blev angivet ved udstedelsen af certifikatet, angiv det;
specificer puljen af adresser, der passer til dine opgaver*;
der kan være en eller flere ruter og DNS-servere;
De sidste 2 linjer er nødvendige for at implementere godkendelse i AD**.
*Rækken af adresser valgt i eksemplet vil tillade op til 127 klienter at oprette forbindelse samtidigt, fordi /23-netværket er valgt, og OpenVPN opretter et undernet for hver klient ved hjælp af /30-masken.
Hvis det er særligt nødvendigt, kan porten og protokollen ændres, dog skal man huske på, at ændring af portportnummeret vil medføre konfiguration af SELinux, og brug af tcp-protokollen vil øge overhead, fordi TCP-pakkeleveringskontrol udføres allerede på niveauet for pakker indkapslet i tunnelen.
**Hvis godkendelse i AD ikke er nødvendig, skal du kommentere dem, springe næste afsnit over og i skabelonen fjerne auth-user-pass-linjen.
AD-godkendelse
For at understøtte den anden faktor vil vi bruge kontobekræftelse i AD.
Vi har brug for en konto på domænet med rettighederne for en almindelig bruger og en gruppe, hvor medlemskab vil bestemme muligheden for at oprette forbindelse.
systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Certifikatudstedelse og tilbagekaldelse
Fordi Ud over selve certifikaterne har du brug for nøgler og andre indstillinger; det er meget praktisk at pakke alt dette ind i en profilfil. Denne fil overføres derefter til brugeren, og profilen importeres til OpenVPN-klienten. For at gøre dette opretter vi en indstillingsskabelon og et script, der genererer profilen.
Du skal tilføje indholdet af rodcertifikatet (ca.crt) og TLS key (ta.key) filer til profilen.
Før du udsteder brugercertifikater glem ikke at indstille den nødvendige gyldighedsperiode for certifikater i parameterfilen. Du bør ikke gøre det for langt, jeg anbefaler, at du begrænser dig til maksimalt 180 dage.
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>
Bemærkninger:
deadlines PUT DIN... skifte til indhold deres certifikater;
i fjerndirektivet skal du angive navnet/adressen på din gateway;
auth-user-pass-direktivet bruges til yderligere ekstern godkendelse.
I hjemmebiblioteket (eller et andet praktisk sted) opretter vi et script til at anmode om et certifikat og oprette en 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.sh
Og vi kan udstede vores første certifikat.
~/make.profile.sh my-first-user
tilbagekaldelse
I tilfælde af kompromittering af et certifikat (tab, tyveri), er det nødvendigt at tilbagekalde dette certifikat:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Se udstedte og tilbagekaldte certifikater
For at se udstedte og tilbagekaldte certifikater skal du blot se indeksfilen:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Forklaring:
den første linje er servercertifikatet;
første tegn
V (gyldig) - gyldig;
R (Tilbagekaldt) - tilbagekaldt.
Netværkskonfiguration
De sidste trin er at konfigurere transmissionsnetværket - routing og firewalls.
I et virksomhedsmiljø er der sandsynligvis undernet, og vi er nødt til at fortælle routeren/routerne, hvordan de sender pakker, der er bestemt til vores VPN-klienter. På kommandolinjen udfører vi kommandoen på den måde (afhængigt af det anvendte udstyr):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123
og gem konfigurationen.
Derudover er det på grænseroutergrænsefladen, hvor den eksterne adresse gw.abc.ru serveres, nødvendigt at tillade passage af udp/1194-pakker.
I tilfælde af at organisationen har strenge sikkerhedsregler, skal der også konfigureres en firewall på vores VPN-server. Efter min mening opnås den største fleksibilitet ved at opsætte iptables FORWARD-kæder, selvom det er mindre bekvemt at sætte dem op. Lidt mere om at sætte dem op. For at gøre dette er det mest bekvemt at bruge "direkte regler" - direkte regler, gemt i en fil /etc/firewalld/direct.xml. Den aktuelle konfiguration af reglerne kan findes som følger:
$ sudo firewall-cmd --direct --get-all-rule
Før du ændrer en fil, skal du lave en sikkerhedskopi af den:
Disse er grundlæggende almindelige iptables-regler, ellers pakket efter fremkomsten af firewalld.
Destinationsgrænsefladen med standardindstillinger er tun0, og den eksterne grænseflade for tunnelen kan være anderledes, for eksempel ens192, afhængigt af den anvendte platform.
Den sidste linje er til logning af tabte pakker. For at logge skal fungere, skal du ændre fejlfindingsniveauet i firewalld-konfigurationen:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Anvendelse af indstillinger er den sædvanlige firewalld-kommando til at genlæse indstillingerne:
$ sudo firewall-cmd --reload
Du kan se tabte pakker som dette:
grep forward_fw /var/log/messages
Hvad er næste
Dette fuldender opsætningen!
Tilbage er blot at installere klientsoftwaren på klientsiden, importere profilen og oprette forbindelse. For Windows-operativsystemer er distributionssættet placeret på udvikler site.
Endelig forbinder vi vores nye server til overvågnings- og arkiveringssystemerne, og glem ikke regelmæssigt at installere opdateringer.