Hallo, Habr-bezoekers! In het boek beschrijft David Clinton 12 echte projecten, waaronder de automatisering van een back-up- en herstemsysteem, de configuratie van een persoonlijke cloudopslag zoals Dropbox en het opzetten van een eigen MediaWiki-server. Aan de hand van interessante voorbeelden leer je over virtualisatie, noodherstel, beveiliging, back-up, implementatie van DevOps en het oplossen van systeemproblemen. Elk hoofdstuk eindigt met een overzicht van praktische aanbevelingen, een glossarium van nieuwe termen en oefeningen.
Fragment "10.1. OpenVPN-tunnel creƫren"
In dit boek heb ik al veel verteld over encryptie. SSH en SCP kunnen gegevens beschermen die worden verzonden via externe verbindingen (hoofdstuk 3), bestandscodering beschermt gegevens bij opslag op de server (hoofdstuk 8), en TLS/SSL-certificaten kunnen gegevens beschermen tijdens verzending tussen websites en klantbrowsers (hoofdstuk 9). Maar soms hebben jouw gegevens een breder scala aan bescherming nodig. Bijvoorbeeld, sommige leden van jouw team moeten misschien onderweg werken en verbinden met netwerken via openbare Wi-Fi-hotspots. Je moet absoluut niet aannemen dat al deze hotspots veilig zijn, maar jouw mensen hebben zeker een manier nodig om verbinding te maken met de bedrijfsbronnen ā en in dat geval helpt een VPN.
Een goed ontworpen VPN-tunnel biedt een directe verbinding tussen externe klanten en de server, zodat gegevens worden verborgen tijdens verzending via een onveilige netwerk. En wat dan? Je hebt al veel tools gezien die dit kunnen doen met encryptie. De echte waarde van een VPN is dat je, zodra je een tunnel hebt geopend, externe netwerken kunt verbinden alsof ze allemaal lokaal zijn. In zekere zin maak je gebruik van een omweg.
Met een dergelijk uitgebreid netwerk kunnen beheerders hun taken op hun servers vanuit elke locatie uitvoeren. Maar nog belangrijker is dat een bedrijf met bronnen die verdeeld zijn over verschillende vestigingen deze allemaal zichtbaar en toegankelijk kan maken voor alle groepen die ze nodig hebben, waar ze zich ook bevinden (fig. 10.1).
Een tunnel op zich garandeert geen veiligheid. Maar ƩƩn van de encryptiestandaarden kan in de netwerkstructuur worden opgenomen, wat het beveiligingsniveau aanzienlijk verhoogt. Tunnele die gebruik maken van het OpenVPN-pakket met open-source code, gebruiken dezelfde TLS/SSL-encryptie waar je al over hebt gelezen. OpenVPN is niet de enige beschikbare optie voor tunneling, maar wel ƩƩn van de bekendste. Het wordt als iets sneller en veiliger beschouwd dan het alternatieve tunnelingprotocol op niveau 2 dat IPsec-encryptie gebruikt.
Wil je dat je team veilig met elkaar communiceert terwijl ze onderweg zijn of in verschillende gebouwen werken? Dan moet je een OpenVPN-server opzetten om applicaties te delen en toegang te krijgen tot de lokale netwerkomgeving van de server. Om dit te laten werken, hoef je slechts twee virtuele machines of twee containers op te starten: ƩƩn voor de rol van server/host en de andere voor de client. Het opzetten van een VPN is een complex proces, dus het is waarschijnlijk de moeite waard om een paar minuten te nemen om het geheel in kaart te brengen.

10.1.1. Configuratie van de OpenVPN-server
Voordat je begint, geef ik je een nuttige tip. Als je van plan bent om alles zelf te doen (en ik raad je sterk aan dat te doen), zul je waarschijnlijk merken dat je werkt met meerdere terminalvensters die op je bureau zijn geopend, elk verbonden met hun eigen machine. Er is een risico dat je op een gegeven moment een commando in het verkeerde venster typt. Om dit te vermijden, kun je het commando hostname gebruiken om de machine-naam die in de opdrachtregel wordt weergegeven te veranderen in iets dat je duidelijk vertelt waar je bent. Zodra je dit hebt gedaan, moet je uitloggen van de server en opnieuw inloggen om de nieuwe instellingen van kracht te laten worden. Zo ziet dat eruit:

Door deze aanpak aan te houden en elke machine die je gebruikt een geschikte naam te geven, kun je gemakkelijk bijhouden waar je bent.
Na het gebruik van hostname kun je hinderlijke foutmeldingen tegenkomen zoals Unable to Resolve Host OpenVPN-Server bij het uitvoeren van latere commando's. Het bijwerken van het bestand /etc/hosts met de bijbehorende nieuwe hostnaam zou het probleem moeten verhelpen.
Bereid je server voor op OpenVPN
Voor de installatie van OpenVPN op uw server zijn twee pakketten nodig: openvpn en easy-rsa (voor het beheren van het proces van het genereren van de versleuteling sleutel). CentOS-gebruikers moeten indien nodig eerst de epel-release repository installeren, zoals u deed in hoofdstuk 2. Om toegang tot de serverapplicatie te kunnen controleren, kunt u ook een webserver Apache installeren (apache2 voor Ubuntu en httpd op CentOS).
Zolang u de server instelt, raad ik aan de firewall te activeren die alle poorten blokkeert, behalve 22 (SSH) en 1194 (de standaard poort voor OpenVPN). Dit voorbeeld illustreert hoe ufw werkt op Ubuntu, maar ik weet zeker dat u het firewalld-programma op CentOS uit hoofdstuk 9 nog herinnert:
# ufw enable
# ufw allow 22
# ufw allow 1194Om interne routering tussen de netwerkinterfaces op de server toe te staan, moet u een regel (net.ipv4.ip_forward = 1) in het bestand /etc/sysctl.conf uitcommentariƫren. Dit zal het mogelijk maken om externe clients indien nodig door te sturen nadat ze zijn verbonden. Om de nieuwe instelling te laten werken, voert u sysctl -p uit:
# nano /etc/sysctl.conf
# sysctl -pNu is de serveromgeving volledig ingesteld, maar er moet nog iets gebeuren voordat u klaar bent: u moet de volgende stappen uitvoeren (we zullen ze later in detail bekijken).
- Maak op de server een stel sleutels voor de Public Key Infrastructure (PKI) aan met behulp van de scripts die bij het easy-rsa pakket worden geleverd. In wezen fungeert de OpenVPN-server ook als zijn eigen certificeringsautoriteit (CA).
- Bereid de juiste sleutels voor de cliƫnt voor
- Configureer het server.conf bestand voor de server
- Configureer uw OpenVPN-client
- Controleer uw VPN
Genereren van versleuteling sleutels
Om het niet te ingewikkeld te maken, kunt u uw sleutel-infrastructuur op dezelfde machine instellen als waar de OpenVPN-server draait. Echter, in veiligheidsaanbevelingen wordt meestal aangeraden een aparte CA-server te gebruiken voor implementaties in een productieomgeving. Het proces van het genereren en distribueren van versleuteling sleutels voor gebruik in OpenVPN is geĆÆllustreerd in figuur 10.2.

Wanneer u OpenVPN installeerde, werd automatisch de map /etc/openvpn/ aangemaakt, maar deze bevat nog niets. De pakketten openvpn en easy-rsa worden geleverd met sjabloonbestanden die u als basis voor uw configuratie kunt gebruiken. Om het certificeringsproces te starten, kopieert u de easy-rsa sjabloonmap van /usr/share/ naar /etc/openvpn en navigeert u naar de easy-rsa/:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsaDe easy-rsa catalogus bevat nu behoorlijk wat scripts. In tabel 10.1 staan de tools vermeld die je zult gebruiken voor het genereren van sleutels.

De genoemde opdrachten vereisen root-rechten, dus via sudo su moet je root worden.
Het eerste bestand waarmee je zult werken, heet vars en bevat omgevingsvariabelen die easy-rsa gebruikt bij het genereren van sleutels. Je moet het bestand bewerken om eigen waarden te gebruiken in plaats van de standaardwaarden die al aanwezig zijn. Mijn bestand zou er als volgt uitzien (lijst 10.1).
Lijst 10.1. Belangrijke fragmenten van het bestand /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"Het uitvoeren van het vars-bestand stelt je in staat om de waarden naar de shell-omgeving door te geven, waar ze worden opgenomen in de inhoud van je nieuwe sleutels. Waarom werkt de sudo-opdracht op zichzelf niet? Omdat we in de eerste fase het script met de naam vars bewerken en het vervolgens toepassen. Toepassing betekent dat het vars-bestand zijn waarden doorgeeft aan de shell-omgeving, waar ze worden opgenomen in de inhoud van je nieuwe sleutels.
Zorg ervoor dat je het bestand opnieuw uitvoert met een nieuwe shell om het onvoltooide proces af te ronden. Wanneer dit is gedaan, vraagt het script je om een ander script, clean-all, uit te voeren om alle inhoud in de map /etc/openvpn/easy-rsa/keys/: te verwijderen.

Natuurlijk is de volgende stap het uitvoeren van het clean-all script, gevolgd door build-ca, dat het pkitool script gebruikt om het rootcertificaat te maken. Je wordt gevraagd om de identificatie-instellingen die door vars zijn verstrekt te bevestigen.
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private keyVervolgens komt het build-key-server script. Aangezien het hetzelfde pkitool script gebruikt samen met het nieuwe rootcertificaat, zul je dezelfde vragen zien ter bevestiging van de sleutelparen. De sleutels krijgen namen op basis van de door jou doorgegeven argumenten, die, tenzij je meerdere VPN's op deze computer uitvoert, meestal server zullen zijn, zoals in het voorbeeld:
# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base UpdatedOpenVPN gebruikt parameters die zijn gegenereerd met behulp van het Diffie-Hellman-algoritme (met behulp van build-dh) om de authenticatie voor nieuwe verbindingen te coƶrdineren. Het bestand dat hier wordt aangemaakt, hoeft niet geheim te zijn, maar moet zijn gegenereerd met het build-dh-script voor de momenteel actieve RSA-sleutels. Als u in de toekomst nieuwe RSA-sleutels genereert, moet u ook het bestand op basis van het Diffie-Hellman-algoritme bijwerken:
# ./build-dhUw sleutels aan de serverzijde zullen nu in de map /etc/openvpn/easy-rsa/keys/ terechtkomen, maar OpenVPN weet dit niet. Standaard zoekt OpenVPN naar sleutels in /etc/openvpn/, dus kopieer ze:
# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpnVoorbereiding van de encryptiesleutels voor de client
Zoals u al hebt gezien, worden bij TLS-encryptie paren van overeenkomstige sleutels gebruikt: ƩƩn op de server en de andere op de externe client. Dit betekent dat u client-sleutels nodig heeft. Onze oude vriend pkitool is precies wat u hiervoor nodig heeft. In dit voorbeeld, door het programma uit te voeren in de map /etc/openvpn/easy-rsa/, geven we het argument client mee om bestanden met de naam client.crt en client.key te genereren:
# ./pkitool clientDe twee clientbestanden samen met het oorspronkelijke bestand ca.crt, dat nog steeds in de map keys/ staat, moeten nu veilig naar uw client worden overgedragen. Vanwege hun eigendom en toegangsrechten kan dit een lastige opgave zijn. De eenvoudigste benadering is om handmatig de inhoud van het oorspronkelijke bestand (en niets anders dan die inhoud) naar de terminal op uw desktop-pc te kopiƫren (selecteer de tekst, klik met de rechtermuisknop en kies in het menu de optie Kopiƫren). Plak dit vervolgens in een nieuw bestand met dezelfde naam als die u aanmaakt in de tweede terminal, verbonden met uw client.
Maar iedereen kan knippen en plakken. Denk aan de andere kant als een administrator, want u heeft niet altijd toegang tot een GUI waar knip-/plakacties mogelijk zijn. Kopieer de bestanden naar de thuismap van uw gebruiker (zodat de externe scp-operatie er toegang toe heeft), en verander vervolgens met chown de eigenaar van de bestanden van root naar een gewone gebruiker zonder root-rechten, zodat de externe scp-actie kan worden uitgevoerd. Zorg ervoor dat al uw bestanden momenteel zijn ingesteld en toegankelijk zijn. U verplaatst ze later naar de client:
# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crtMet een volledige set encryptiesleutels die klaar zijn voor gebruik, moet u de server vertellen hoe u de VPN wilt opzetten. Dit gebeurt met behulp van het bestand server.conf.
Verminder het aantal toetsaanslagen
Moet je te veel typen? De extensie met haakjes helpt deze zes opdrachten terug te brengen tot twee. Ik ben ervan overtuigd dat je deze twee voorbeelden kunt leren en begrijpen wat er aan de hand is. Nog belangrijker is dat je zult begrijpen hoe je deze principes kunt toepassen op bewerkingen die tientallen of zelfs honderden elementen omvatten:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
Configuratie van het bestand server.conf
Waaruit kun je opmaken hoe het bestand server.conf eruit moet zien? Vergeet niet de sjabloonmap easy-rsa die je hebt gekopieerd vanuit /usr/share/? Bij de installatie van OpenVPN bleef er een gecomprimeerd configuratiesjabloon over dat je kunt kopiƫren naar /etc/openvpn/. Ik ga ervan uit dat de sjabloon gecomprimeerd is en ik zal je voorstellen aan een nuttig hulpmiddel: zcat.
Je weet al hoe je de inhoud van een tekstbestand op het scherm kunt weergeven met de cat-opdracht, maar wat als het bestand gecomprimeerd is met gzip? Je kunt het bestand altijd uitpakken, en dan zal cat met plezier het weergeven, maar dat is een stap of twee meer dan nodig is. In plaats daarvan, zoals je waarschijnlijk al hebt geraden, kun je de opdracht zcat invoeren om de uitgepakte tekst in ƩƩn stap in het geheugen te laden. In het volgende voorbeeld leid je in plaats van de tekst op het scherm te drukken, deze om naar een nieuw bestand met de naam server.conf:
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpnLaten we de uitgebreide en nuttige documentatie die bij het bestand is gevoegd, even terzijde schuiven en kijken hoe het eruit kan zien wanneer je klaar bent met bewerken. Let op dat het puntkomma (;) OpenVPN aangeeft om de volgende regel niet te lezen of uit te voeren (lijst 10.2).

Laten we een aantal van deze instellingen doornemen.
- Standaard werkt OpenVPN via poort 1194. Je kunt dit wijzigen, bijvoorbeeld om je activiteiten nog verder te verbergen of om conflicten met andere actieve tunnels te vermijden. Aangezien 1194 minimale coƶrdinatie met klanten vereist, is dat de beste aanpak.
- OpenVPN gebruikt voor gegevensoverdracht of het Transmission Control Protocol (TCP) of het User Datagram Protocol (UDP). TCP kan iets langzamer zijn, maar is betrouwbaarder en gemakkelijker te begrijpen voor de applicaties die aan beide uiteinden van de tunnel werken.
- U kunt dev tun opgeven wanneer u een eenvoudigere en efficiƫntere IP-tunnel wilt creƫren die alleen gegevensinhoud verspreidt. Als u daarentegen meerdere netwerkinterfaces (en de netwerken die ze vertegenwoordigen) wilt verbinden door een Ethernet-brug te creƫren, moet u dev tap kiezen. Als u niet begrijpt wat dit betekent, gebruik dan het argument tun.
- De volgende vier regels geven OpenVPN de namen van drie authenticatiefiles op de server en het dh2048-parameters bestand dat u eerder heeft aangemaakt.
- De regel server stelt het bereik en het subnetmasker in dat wordt gebruikt voor het toewijzen van IP-adressen aan klanten bij inloggen.
- De optionele parameter push "route 10.0.3.0 255.255.255.0" stelt externe klanten in staat om toegang te krijgen tot privƩ-subnetten achter de server. Voor deze taak is ook netwerkconfiguratie op de server zelf vereist, zodat het privƩ-subnet op de hoogte is van het OpenVPN-subnet (10.8.0.0).
- De regel port-share localhost 80 maakt het mogelijk om klantverkeer, dat binnenkomt via poort 1194, door te sturen naar de lokale webserver die poort 80 beluistert. (Dit is nuttig als u een webserver voor het testen van uw VPN wilt inzetten.) Dit werkt alleen als het tcp-protocol is gekozen.
- De regels user nobody en group nogroup moeten actief zijn ā dit bereikt u door de puntkomma's (; ) te verwijderen. Het afdwingen dat externe klanten als nobody en nogroup werken, garandeert dat sessies op de server niet met privileges uitgevoerd worden.
- log geeft aan dat de huidige logrecords oude records zullen overschrijven bij elke start van OpenVPN, terwijl log-append nieuwe records aan het bestaande logbestand toevoegt. Het logbestand openvpn.log wordt geschreven naar de map /etc/openvpn/.
Bovendien wordt vaak de waarde client-to-client aan het configuratiebestand toegevoegd, zodat meerdere klanten elkaar kunnen zien naast de OpenVPN-server. Als u tevreden bent met uw configuratie, kunt u de OpenVPN-server starten:
# systemctl start openvpnVanwege de veranderende relatie tussen OpenVPN en systemd kan het soms nodig zijn om de service te starten met de volgende syntaxis: systemctl start openvpn@server.
De uitvoering van ip addr om de lijst met netwerkinterfaces van uw server weer te geven, zou nu een verwijzing naar de nieuwe interface met de naam tun0 moeten geven. OpenVPN zal deze creƫren om binnenkomende klanten te bedienen:
$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft foreverMogelijk moet u de server opnieuw opstarten voordat alles volledig werkt. De volgende stap is de clientcomputer.
10.1.2. OpenVPN-client configureren
Traditioneel worden tunnels gebouwd met ten minste twee uitgangen (anders zouden we ze grotten noemen). Een correct geconfigureerde OpenVPN op de server leidt verkeer de tunnel in en uit aan de ene kant. Maar u heeft ook software nodig die aan de klantzijde werkt, dat wil zeggen aan de andere kant van de tunnel.
In dit gedeelte ga ik me concentreren op de handmatige configuratie van een Linux-computer van welk type dan ook als OpenVPN-client. Maar dit is niet de enige manier waarop deze mogelijkheid beschikbaar is. OpenVPN ondersteunt clientapplicaties die kunnen worden geĆÆnstalleerd en gebruikt op desktop- en laptopcomputers met Windows of macOS, evenals op smartphones en tablets met Android en iOS. Voor meer details, zie openvpn.net.
Het OpenVPN-pakket moet op de clientcomputer worden geïnstalleerd, zoals het op de server is geïnstalleerd, hoewel hier geen easy-rsa nodig is, omdat de sleutels die u gebruikt al bestaan. U moet het sjabloonbestand client.conf kopiëren naar de map /etc/openvpn/, die zojuist is aangemaakt. Deze keer wordt het bestand niet gecomprimeerd, dus de gewone cp-opdracht is perfect geschikt voor deze taak:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/De meeste instellingen in uw client.conf-bestand zullen vrij vanzelfsprekend zijn: ze moeten overeenkomen met de waarden op de server. Zoals te zien is in het volgende voorbeeld van een bestand, is de unieke parameter remote 192.168.1.23 1194, die de client de IP-adres van de server aangeeft. Zorg er opnieuw voor dat dit het adres van uw server is. U moet ook de clientcomputer laten controleren op de authenticiteit van het servercertificaat om mogelijke "man-in-the-middle"-aanvallen te voorkomen. Een manier om dit te doen is door de regel remote-cert-tls server toe te voegen (lijst 10.3).

Nu kunt u naar de map /etc/openvpn/ gaan en de certificeringssleutels van de server ophalen. Vervang het IP-adres van de server of de domeinnaam in het voorbeeld door uw eigen waarden:

Er zal waarschijnlijk niets spannends gebeuren totdat je OpenVPN op de client opstart. Aangezien je een paar argumenten moet doorgeven, doe je dit vanuit de opdrachtregel. Het argument ātls-client vertelt OpenVPN dat je als client gaat optreden en verbinding maakt via TLS-encryptie, terwijl āconfig naar je configuratiebestand verwijst:
# openvpn --tls-client --config /etc/openvpn/client.confLees de uitvoer van het commando zorgvuldig door om ervoor te zorgen dat je correct bent verbonden. Als er de eerste keer iets misgaat, kan dat liggen aan een mismatch tussen de configuratiebestanden van de server en de client, of aan een probleem met de netwerkverbinding/firewall. Hier zijn enkele tips voor het oplossen van problemen.
- Lees de uitvoer van de OpenVPN-operatie op de client zorgvuldig door. Deze bevat vaak waardevolle aanwijzingen over wat niet kan worden uitgevoerd en waarom.
- Controleer op foutmeldingen in de bestanden openvpn.log en openvpn-status.log in de map /etc/openvpn/ op de server.
- Controleer gerelateerde OpenVPN-berichten en rechtsgeldige tijdstempels in de systeemlogboeken op de server en de client. (journalctl -ce toont de recentste berichten.)
- Zorg ervoor dat er een actieve netwerkverbinding is tussen de server en de client (meer informatie ā in hoofdstuk 14).
Over de auteur
David Clinton ā systeembeheerder, docent en schrijver. Hij heeft veel belangrijke technische vakken beheerd, over geschreven en lesmateriaal ontwikkeld, waaronder Linux-systemen, cloud computing (in het bijzonder AWS) en containertechnologieĆ«n zoals Docker. Hij schreef het boek Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Veel van zijn opleidingsvideocursussen zijn te vinden op Pluralsight.com, en links naar zijn andere boeken (over Linux-beheer en servervirtualisatie) zijn beschikbaar op .
Ā» Meer informatie over het boek is te vinden op
Ā»
Ā»
Voor Habr-bewoners is er 25% korting met de coupon ā Linux
Na betaling van de papieren versie van het boek ontvangt u de elektronische versie per e-mail.
Bron: habr.com
