Taakstelling
Dit artikel beschrijft de organisatie van externe toegang voor medewerkers op basis van open source-producten en kan worden gebruikt voor zowel het opzetten van een volledig autonoom systeem als voor uitbreiding wanneer er een tekort aan licenties in het bestaande commerciële systeem is of wanneer de prestaties onvoldoende blijken te zijn.
Het doel van dit artikel is om een volledige oplossing voor externe toegang in de organisatie te implementeren, wat meer is dan alleen 'OpenVPN in 10 minuten installeren'.
Het resultaat zal een systeem zijn waarin certificaten en (optioneel) de Active Directory-catalogus voor gebruikersauthenticatie worden gebruikt. Zo krijgen we een systeem met twee verificatiefactoren — wat je hebt (certificaat) en wat je weet (wachtwoord).
Het teken dat de gebruiker is toegestaan om verbinding te maken, is zijn lidmaatschap in de groep myVPNUsr. Een autonome certificeringsautoriteit zal worden gebruikt.
De kosten voor de implementatie van de oplossing zijn slechts enkele hardwarebronnen en 1 uur van de systeembeheerder.
We zullen een virtuele machine met OpenVPN en Easy-RSA versie 3 op CentOS 7 gebruiken, waarvoor 4 vCPU en 4 GiB RAM zijn toegewezen op basis van 100 verbindingen.
In ons voorbeeld is het netwerk van onze organisatie 172.16.0.0/16, waarbij de VPN-server met adres 172.16.19.123 zich in het segment 172.16.19.0/24 bevindt, de DNS-servers zijn 172.16.16.16 en 172.16.17.17, en voor de VPN-klanten is er een subnet 172.16.20.0/23 toegewezen.
Voor externe verbindingen wordt poort 1194/udp gebruikt, en in DNS is er een A-record voor onze server gemaakt met de naam gw.abc.ru.
Het is ten zeerste afgeraden om SELinux uit te schakelen! OpenVPN functioneert zonder de beveiligingsbeleid uit te schakelen.
Inhoud
Installatie van het besturingssysteem en de applicatiesoftware
We gebruiken de distributie CentOS 7.8.2003. We hebben een installatie van het besturingssysteem in minimale configuratie nodig. Dit is handig om te doen met behulp van , het klonen van een eerder geïnstalleerd besturingssysteem-image en andere middelen.
Na de installatie, het toewijzen van een adres aan de netwerkinterface (volgens de vereisten 172.16.19.123), voeren we de OS-update uit:
$ sudo yum update -y && reboot
Ook moet worden gecontroleerd of onze machine de tijd synchroniseert.
Voor de installatie van de applicatiesoftware zijn de pakketten openvpn, openvpn-auth-ldap, easy-rsa en vim als hoofdeditor nodig (de EPEL-repository is nodig).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
Voor een virtuele machine is het nuttig om een gastagent te installeren:
$ sudo yum install open-vm-toolsvoor VMware ESXi-hosts, of voor oVirt
$ sudo yum install ovirt-guest-agent
Configuratie van cryptografie
We gaan naar de easy-rsa directory:
$ cd /usr/share/easy-rsa/3/We maken een bestand met variabelen aan:
$ sudo vim varsmet de volgende inhoud:
export KEY_COUNTRY="NL"
export KEY_PROVINCE="MijnRegio"
export KEY_CITY="MijnStad"
export KEY_ORG="ABC BV"
export KEY_EMAIL="admin@abc.nl"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.nl"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Hier worden parameters beschreven voor de hypothetische organisatie BV "ABC"; je kunt ze aanpassen met echte gegevens of het voorbeeld laten staan. Het belangrijkste in de parameters is de laatste regel, die de geldigheidsduur van het certificaat in dagen bepaalt. In het voorbeeld is een waarde van 10 jaar gebruikt (365*10+2 schrikkeljaren). Deze waarde moet worden aangepast voor de uitgifte van gebruikerscertificaten.
Vervolgens configureren we een autonome certificeringsautoriteit.
De configuratie omvat het exporteren van variabelen, het initialiseren van de CA, het uitgeven van de root sleutel en het CA-certificaat, de Diffie-Hellman sleutel, de TLS sleutel, evenals de server sleutel en certificaat. De sleutel van de certificeringsautoriteit moet zorgvuldig worden beschermd en geheim worden gehouden! Alle parameters kunnen op de standaardinstellingen blijven.
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
Hiermee is het belangrijkste deel van de configuratie van het cryptografische mechanisme voltooid.
Configuratie van OpenVPN
We gaan naar de OpenVPN directory, maken de benodigde directories aan en voegen een link naar easy-rsa toe:
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/
We maken het hoofdconfiguratiebestand voor OpenVPN aan:
$ sudo vim server.confmet de volgende inhoud:
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
Enkele opmerkingen over de parameters:
- als er een andere naam is opgegeven tijdens de uitgifte van het certificaat, geef deze dan op;
- geef het adresbereik op voor jouw behoeften*;
- routes en DNS-servers kunnen één of meerdere zijn;
- De laatste 2 regels zijn nodig voor de implementatie van authenticatie in AD.
Het geselecteerde bereik in het voorbeeld stelt in staat om tegelijkertijd tot 127 clients aan te sluiten, omdat er een netwerk /23 is gekozen en OpenVPN voor elke client een subnet met een masker /30 aanmaakt.
In geval van speciale behoefte kunnen de poort en het protocol worden gewijzigd, echter moet men in gedachten houden dat een wijziging van het poortnummer de configuratie van SELinux met zich mee kan brengen, en het gebruik van het TCP-protocol de overhead zal verhogen, aangezien de controle van de aflevering van TCP-pakketten al op het niveau van de in de tunnel ingekapselde pakketten wordt uitgevoerd.
Als authenticatie in AD niet nodig is, commentarieer ze dan uit, sla de volgende sectie over en verwijder in de sjabloon. verwijder de regel auth-user-pass..
Authenticatie in AD
Voor de ondersteuning van de tweede factor zullen we de accountverificatie in AD gebruiken.
We hebben een account in het domein nodig met de rechten van een gewone gebruiker en een groep waarvan het lidmaatschap de mogelijkheid tot verbinding bepaalt.
We maken een configuratiebestand aan:
/etc/openvpn/ldap.confmet de volgende inhoud:
URL "ldap://ldap.abc.nl"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=nl"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
BaseDN "OU=allUsr,DC=abc,DC=nl"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
BaseDN "OU=myGrp,DC=abc,DC=nl"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
Hoofdpuntparameters:
- URL "ldap://ldap.abc.nl" — het adres van de domeincontroller;
- BindDN "CN=bindUsr,CN=Users,DC=abc,DC=nl" — het canonieke naam voor binding met LDAP (gebruikersnaam — bindUsr in de container abc.nl/Users);
- Password b1ndP@SS — het wachtwoord van de gebruiker voor binding;
- BaseDN "OU=allUsr,DC=abc,DC=nl" — het pad van waaruit de gebruikerszoekopdracht begint;
- BaseDN "OU=myGrp,DC=abc,DC=nl" — de container van de goedkeuringsgroep (groep myVPNUsr in de container abc.nl/myGrp);
- SearchFilter "(cn=myVPNUsr)" — de naam van de goedkeuringsgroep.
Start en diagnose
Nu kunnen we proberen onze server in te schakelen en te starten:
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Statuscontrole:
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Uitgifte en intrekking van certificaten
Aangezien naast de certificaten ook sleutels en andere instellingen nodig zijn, is het erg handig om dit alles in één profielbestand te wikkelen. Dit bestand wordt vervolgens naar de gebruiker verzonden en het profiel wordt vervolgens op de OpenVPN-client geïmporteerd. Daarom maken we een sjabloon voor de instellingen en een script dat het profiel vormt.
In het profiel moet de inhoud van de bestanden van het root-certificaat (ca.crt) en de TLS-sleutel (ta.key) worden toegevoegd.
Voordat u gebruikerscertificaten uitgeeft vergeet niet de vereiste geldigheidsduur van certificaten in te stellen in het configuratiebestand. Maak het niet te groot, ik raad aan om maximaal 180 dagen te beperken.
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-----
PLAATS HIER UW CA CERT (ca.crt)
-----END CERTIFICATE-----
key-direction 1
-----BEGIN OpenVPN Static key V1-----
PLAATS HIER UW TA KEY (ta.key)
-----END OpenVPN Static key V1-----
Aantekeningen:
- lijnen PLAATS HIER... vervangen door de inhoud van uw certificaten;
- geef in de directive remote de naam/adres van uw gateway op;
- de directive auth-user-pass wordt gebruikt voor aanvullende externe authenticatie.
In de home directory (of een andere handige locatie) maken we een script aan voor het aanvragen van certificaten en het creëren van profielen:
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 ~
Maak het bestand uitvoerbaar:
chmod a+x ~/make.profile.shEn we kunnen ons eerste certificaat uitgeven.
~/make.profile.sh my-first-userReview
In het geval van compromittering van het certificaat (verlies, diefstal) moet dit certificaat worden ingetrokken:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Bekijk uitgegeven en ingetrokken certificaten
Om de uitgegeven en ingetrokken certificaten te bekijken, volstaat het de indexfile te bekijken:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Uitleg:
- de eerste regel bevat het servercertificaat;
- het eerste teken
- V (Valid) — geldig;
- R (Revoked) — ingetrokken.
Netwerkconfiguratie
De laatste stappen — configuratie van de overdrachtsnetwerken — routering en firewalls.
Toestaan van verbindingen in de lokale firewall:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Vervolgens schakelen we IP-verkeer routering in:
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
In een bedrijfsomgeving is er waarschijnlijk een verdeling in subnetten en moeten we de router(s) vertellen hoe ze de pakketten moeten verzenden die zijn gericht aan onze VPN-clients. Voer de volgende opdracht uit in de commandoregel (afhangend van de gebruikte apparatuur):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123en sla de configuratie op.
Daarnaast moet op de interface van de randrouter, waar het externe adres gw.abc.ru wordt bediend, toegestaan worden om pakketten udp/1194 door te laten.
Als er strikte beveiligingsregels in de organisatie gelden, moet er op onze VPN-server ook een firewall worden ingesteld. Naar mijn mening biedt de configuratie van iptables ketens FORWARD de grootste flexibiliteit, hoewel het minder eenvoudig is om ze in te stellen. Hier is meer informatie over de configuratie. Het handigst is om 'directe regels' — direct rules, die in een bestand zijn opgeslagen, te gebruiken. /etc/firewalld/direct.xml. De actieve regelconfiguratie kan als volgt worden opgevraagd:
$ sudo firewall-cmd --direct --get-all-ruleMaak een reservekopie van het bestand voordat u het wijzigt:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakEen voorbeeldinhoud van het bestand is als volgt:
-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 '
Uitleg
In wezen zijn dit gewone iptables-regels, verpakt na de komst van firewalld.
Het doelinterface is standaard tun0, en het externe tunnelinterface kan iets anders zijn, bijvoorbeeld ens192, afhankelijk van het gebruikte platform.
De laatste regel is bedoeld voor het loggen van weggegooide pakketten. Om het loggen te laten werken, moet het foutopsporingsniveau in de firewalld-configuratie worden aangepast:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Toepassen van de instellingen — de gebruikelijke firewalld-opdracht om de instellingen opnieuw te lezen:
$ sudo firewall-cmd --reloadAfgewezen pakketten kunnen als volgt worden bekeken:
grep forward_fw /var/log/messages
Hier was eigenlijk een praktische sectie gepland met demonstratie van drie projecten op STM32 en STM8, speciaal voor dit artikel gemaakt met behulp van datasheets, met lampen, SPI, timers, PWM en interrupts:
De configuratie is hiermee voltooid!
Het enige wat overblijft is het clientsoftware aan de kant van de klant te installeren, het profiel te importeren en verbinding te maken. Voor Windows-besturingssystemen is de distributie beschikbaar op .
Tot slot verbinden we onze nieuwe server met monitoring- en archiveringssystemen, en vergeten we niet regelmatig updates te installeren.
Stabiele verbinding!
Bron: habr.com
