Boek "Linux in actie"

Boek "Linux in actie" Hallo, inwoners van Khabro! In het boek beschrijft David Clinton twaalf projecten uit de praktijk, waaronder het automatiseren van je back-up- en herstelsysteem, het opzetten van een persoonlijke bestandswolk in Dropbox-stijl en het creëren van je eigen MediaWiki-server. Je onderzoekt virtualisatie, noodherstel, beveiliging, back-up, DevOps en systeemprobleemoplossing aan de hand van interessante casestudy's. Elk hoofdstuk eindigt met een overzicht van best practices, een verklarende woordenlijst met nieuwe termen en oefeningen.

Uittreksel “10.1. Een OpenVPN-tunnel maken"

Ik heb in dit boek al veel over encryptie gesproken. SSH en SCP kunnen gegevens beschermen die worden overgedragen via externe verbindingen (hoofdstuk 3), bestandsversleuteling kan gegevens beschermen terwijl deze op de server zijn opgeslagen (hoofdstuk 8), en TLS/SSL-certificaten kunnen gegevens beschermen die worden overgedragen tussen sites en clientbrowsers (hoofdstuk 9) . Maar soms moeten uw gegevens over een groter aantal verbindingen worden beschermd. Misschien werken sommige van uw teamleden bijvoorbeeld onderweg terwijl ze verbinding maken met wifi via openbare hotspots. U moet er zeker niet van uitgaan dat al deze toegangspunten veilig zijn, maar uw mensen hebben wel een manier nodig om verbinding te maken met bedrijfsbronnen – en dat is waar een VPN kan helpen.

Een goed ontworpen VPN-tunnel zorgt voor een directe verbinding tussen externe clients en de server, op een manier die gegevens verbergt terwijl deze over een onveilig netwerk reizen. Dus? Je hebt al veel tools gezien die dit met encryptie kunnen doen. De echte waarde van een VPN is dat je, door een tunnel te openen, externe netwerken kunt verbinden alsof ze allemaal lokaal zijn. In zekere zin maakt u gebruik van een bypass.

Met behulp van dit uitgebreide netwerk kunnen beheerders vanaf elke locatie hun werk op hun servers uitvoeren. Maar nog belangrijker is dat een bedrijf met middelen verspreid over meerdere locaties deze allemaal zichtbaar en toegankelijk kan maken voor alle groepen die ze nodig hebben, waar ze zich ook bevinden (Figuur 10.1).

De tunnel zelf garandeert geen veiligheid. Maar een van de encryptiestandaarden kan in de netwerkstructuur worden opgenomen, wat het beveiligingsniveau aanzienlijk verhoogt. Tunnels die zijn gemaakt met het open source OpenVPN-pakket gebruiken dezelfde TLS/SSL-codering waarover u al hebt gelezen. OpenVPN is niet de enige beschikbare tunneloptie, maar wel een van de bekendste. Het wordt als iets sneller en veiliger beschouwd dan het alternatieve Layer 2-tunnelprotocol dat gebruikmaakt van IPsec-codering.

Wilt u dat iedereen in uw team veilig met elkaar kan communiceren terwijl u onderweg bent of in verschillende gebouwen werkt? Om dit te doen, moet u een OpenVPN-server maken om het delen van applicaties en toegang tot de lokale netwerkomgeving van de server mogelijk te maken. Om dit te laten werken, hoeft u alleen maar twee virtuele machines of twee containers te gebruiken: één om als server/host te fungeren en één om als client te fungeren. Het bouwen van een VPN is geen eenvoudig proces, dus het is waarschijnlijk de moeite waard om een ​​paar minuten de tijd te nemen om het grote geheel in gedachten te krijgen.

Boek "Linux in actie"

10.1.1. OpenVPN-serverconfiguratie

Voordat je begint, geef ik je wat nuttig advies. Als u het zelf gaat doen (en ik raad u ten zeerste aan dat te doen), zult u waarschijnlijk merken dat u met meerdere terminalvensters op uw bureaublad werkt, elk verbonden met een andere machine. Het risico bestaat dat u op een gegeven moment de verkeerde opdracht in het venster invoert. Om dit te voorkomen, kunt u de opdracht hostnaam gebruiken om de machinenaam die op de opdrachtregel wordt weergegeven, te wijzigen in iets dat u duidelijk vertelt waar u zich bevindt. Zodra u dit doet, moet u zich afmelden bij de server en opnieuw aanmelden om de nieuwe instellingen van kracht te laten worden. Dit is hoe het eruit ziet:

Boek "Linux in actie"
Door deze aanpak te volgen en de juiste namen te geven aan elk van de machines waarmee u werkt, kunt u eenvoudig bijhouden waar u zich bevindt.

Nadat u de hostnaam heeft gebruikt, kunt u vervelende Unable to Resolve Host OpenVPN-Server-berichten tegenkomen bij het uitvoeren van volgende opdrachten. Het bijwerken van het bestand /etc/hosts met de juiste nieuwe hostnaam zou het probleem moeten oplossen.

Uw server voorbereiden op OpenVPN

Om OpenVPN op uw server te installeren, heeft u twee pakketten nodig: openvpn en easy-rsa (om het proces voor het genereren van encryptiesleutels te beheren). CentOS-gebruikers moeten indien nodig eerst de epel-release repository installeren, zoals je in hoofdstuk 2 hebt gedaan. Om de toegang tot de serverapplicatie te kunnen testen, kun je ook de Apache-webserver installeren (apache2 op Ubuntu en httpd op CentOS).

Terwijl u uw server instelt, raad ik u aan een firewall te activeren die alle poorten blokkeert, behalve 22 (SSH) en 1194 (de standaardpoort van OpenVPN). Dit voorbeeld illustreert hoe ufw zou werken op Ubuntu, maar ik weet zeker dat je je het CentOS firewalld-programma uit hoofdstuk 9 nog herinnert:

# ufw enable
# ufw allow 22
# ufw allow 1194

Om interne routering tussen netwerkinterfaces op de server mogelijk te maken, moet u het commentaar op één regel (net.ipv4.ip_forward = 1) in het bestand /etc/sysctl.conf verwijderen. Hierdoor kunnen externe clients indien nodig worden omgeleid zodra ze zijn verbonden. Om de nieuwe optie te laten werken, voer je sysctl -p uit:

# nano /etc/sysctl.conf
# sysctl -p

Uw serveromgeving is nu volledig geconfigureerd, maar er moet nog één ding worden gedaan voordat u er klaar voor bent: u moet de volgende stappen voltooien (we zullen ze hierna in detail bespreken).

  1. Creëer een set PKI-coderingssleutels (Public Key Infrastructure) op de server met behulp van de scripts die bij het easy-rsa-pakket zijn geleverd. In wezen fungeert de OpenVPN-server ook als zijn eigen certificeringsinstantie (CA).
  2. Zorg voor de juiste sleutels voor de klant
  3. Configureer het server.conf-bestand voor de server
  4. Stel uw OpenVPN-client in
  5. Controleer uw VPN

Encryptiesleutels genereren

Om het simpel te houden, kunt u uw sleutelinfrastructuur opzetten op dezelfde machine waarop de OpenVPN-server draait. Best practices op het gebied van beveiliging suggereren echter doorgaans het gebruik van een afzonderlijke CA-server voor productie-implementaties. Het proces van het genereren en distribueren van encryptiesleutelbronnen voor gebruik in OpenVPN wordt geïllustreerd in Fig. 10.2.

Boek "Linux in actie"
Toen u OpenVPN installeerde, werd de map /etc/openvpn/ automatisch aangemaakt, maar daar staat nog niets in. Bij de pakketten openvpn en easy-rsa worden voorbeeldsjabloonbestanden geleverd 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 gaat u naar de easy-rsa/ map:

# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa

De easy-rsa directory zal nu een flink aantal scripts bevatten. In tafel 10.1 geeft een overzicht van de tools die u gaat gebruiken om sleutels te maken.

Boek "Linux in actie"

Voor de bovenstaande bewerkingen zijn rootrechten vereist, dus u moet root worden via sudo su.

Het eerste bestand waarmee u gaat werken heet vars en bevat de omgevingsvariabelen die easy-rsa gebruikt bij het genereren van sleutels. U moet het bestand bewerken om uw eigen waarden te gebruiken in plaats van de standaardwaarden die er al zijn. Dit is hoe mijn bestand eruit zal zien (Listing 10.1).

Lijst 10.1. Belangrijkste 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="[email protected]"
export KEY_OU="IT"

Als u het vars-bestand uitvoert, worden de waarden doorgegeven aan de shell-omgeving, waar ze worden opgenomen in de inhoud van uw nieuwe sleutels. Waarom werkt het sudo-commando op zichzelf niet? Omdat we in de eerste stap het script met de naam vars bewerken en vervolgens toepassen. Toepassen en betekent dat het vars-bestand zijn waarden doorgeeft aan de shell-omgeving, waar ze worden opgenomen in de inhoud van uw nieuwe sleutels.

Zorg ervoor dat u het bestand opnieuw uitvoert met een nieuwe shell om het onvoltooide proces te voltooien. Wanneer dit is gebeurd, zal het script u vragen een ander script uit te voeren, clean-all, om alle inhoud in de map /etc/openvpn/easy-rsa/keys/ te verwijderen:

Boek "Linux in actie"
De volgende stap is uiteraard het uitvoeren van het clean-all-script, gevolgd door build-ca, dat het pkitool-script gebruikt om het rootcertificaat te maken. U wordt gevraagd de identiteitsinstellingen van vars te bevestigen:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

Vervolgens komt het build-key-server-script. Omdat het hetzelfde pkitool-script gebruikt samen met een nieuw rootcertificaat, zult u dezelfde vragen zien om de aanmaak van het sleutelpaar te bevestigen. De sleutels krijgen een naam op basis van de argumenten die u doorgeeft, die, tenzij u meerdere VPN's op deze machine gebruikt, meestal een 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 Updated

OpenVPN gebruikt parameters die zijn gegenereerd door het Diffie-Hellman-algoritme (met behulp van build-dh) om te onderhandelen over authenticatie voor nieuwe verbindingen. Het hier gemaakte bestand hoeft niet geheim te zijn, maar moet worden gegenereerd met behulp van het build-dh-script voor de RSA-sleutels die momenteel actief zijn. Als u in de toekomst nieuwe RSA-sleutels maakt, moet u ook het Diffie-Hellman-bestand bijwerken:

# ./build-dh

Uw sleutels aan de serverzijde komen nu in de map /etc/openvpn/easy-rsa/keys/ terecht, 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/openvpn

Clientversleutelingssleutels voorbereiden

Zoals je al hebt gezien, maakt TLS-codering gebruik van paren overeenkomende sleutels: één geïnstalleerd op de server en één geïnstalleerd op de externe client. Dit betekent dat u clientsleutels nodig heeft. Onze oude vriend pkitool is precies wat je hiervoor nodig hebt. Wanneer we in dit voorbeeld het programma uitvoeren in de map /etc/openvpn/easy-rsa/, geven we het clientargument door om bestanden te genereren met de namen client.crt en client.key:

# ./pkitool client

De twee clientbestanden, samen met het originele ca.crt-bestand dat zich nog in de sleutels/ directory bevindt, zouden nu veilig naar uw client moeten worden overgedragen. Vanwege hun eigendoms- en toegangsrechten is dit misschien niet zo eenvoudig. De eenvoudigste aanpak is om de inhoud van het bronbestand (en niets anders dan die inhoud) handmatig te kopiëren naar een terminal op het bureaublad van uw pc (selecteer de tekst, klik er met de rechtermuisknop op en selecteer Kopiëren in het menu). Plak dit vervolgens in een nieuw bestand met dezelfde naam dat u aanmaakt in een tweede terminal die is aangesloten op uw client.

Maar iedereen kan knippen en plakken. Denk in plaats daarvan als een beheerder, omdat u niet altijd toegang heeft tot de GUI waar knip- en plakbewerkingen mogelijk zijn. Kopieer de bestanden naar de thuismap van uw gebruiker (zodat de externe scp-bewerking er toegang toe heeft) en gebruik vervolgens chown om het eigendom van de bestanden te wijzigen van root naar een gewone niet-rootgebruiker, zodat de externe scp-actie kan worden uitgevoerd. Zorg ervoor dat al uw bestanden momenteel zijn geïnstalleerd en toegankelijk zijn. Je verplaatst ze even later naar de klant:

# 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.crt

Met een volledige set coderingssleutels klaar voor gebruik, moet u de server vertellen hoe u de VPN wilt maken. Dit wordt gedaan met behulp van het server.conf-bestand.

Het aantal toetsaanslagen verminderen

Is er te veel getypt? Uitbreiding met haakjes zal deze zes opdrachten tot twee terugbrengen. Ik weet zeker dat je deze twee voorbeelden kunt bestuderen en kunt begrijpen wat er aan de hand is. Belangrijker nog is dat u zult begrijpen hoe u deze principes kunt toepassen op bewerkingen waarbij tientallen of zelfs honderden elementen betrokken zijn:

# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}

Het server.conf-bestand instellen

Hoe weet je hoe het server.conf-bestand eruit moet zien? Herinner je je de easy-rsa-directorysjabloon die je hebt gekopieerd van /usr/share/? Toen u OpenVPN installeerde, hield u een gecomprimeerd configuratiesjabloonbestand over dat u naar /etc/openvpn/ kunt kopiëren. Ik zal voortbouwen op het feit dat de sjabloon is gearchiveerd en u kennis laten maken met een handig hulpmiddel: zcat.

U weet al hoe u de tekstinhoud van een bestand naar het scherm kunt afdrukken met de opdracht cat, maar wat als het bestand wordt gecomprimeerd met gzip? Je kunt het bestand altijd uitpakken en dan zal cat het met plezier uitvoeren, maar dat zijn een of twee stappen meer dan nodig. In plaats daarvan kunt u, zoals u misschien al geraden had, de opdracht zcat gebruiken om de uitgepakte tekst in één stap in het geheugen te laden. In het volgende voorbeeld, in plaats van tekst naar het scherm af te drukken, stuurt u 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/openvpn

Laten we de uitgebreide en nuttige documentatie die bij het bestand wordt geleverd, terzijde leggen en kijken hoe het eruit zou kunnen zien als u klaar bent met bewerken. Merk op dat de puntkomma (;) OpenVPN vertelt de volgende regel niet te lezen of uit te voeren (Lijst 10.2).

Boek "Linux in actie"
Laten we enkele van deze instellingen doornemen.

  • Standaard draait OpenVPN op poort 1194. Je kunt dit bijvoorbeeld wijzigen om je activiteiten verder te verbergen of conflicten met andere actieve tunnels te voorkomen. Omdat 1194 minimale coördinatie met klanten vereist, kunt u dit het beste op deze manier doen.
  • OpenVPN gebruikt Transmission Control Protocol (TCP) of User Datagram Protocol (UDP) om gegevens te verzenden. TCP is misschien iets langzamer, maar het is betrouwbaarder en wordt waarschijnlijker begrepen door toepassingen die aan beide uiteinden van de tunnel draaien.
  • U kunt dev tun opgeven als u een eenvoudigere, efficiëntere IP-tunnel wilt maken die gegevensinhoud overdraagt ​​en niets anders. Als je daarentegen meerdere netwerkinterfaces (en de netwerken die ze vertegenwoordigen) met elkaar moeten verbinden en een Ethernet-brug wilt creëren, zul je dev tap moeten kiezen. Als je niet begrijpt wat dit allemaal betekent, gebruik dan het tun-argument.
  • De volgende vier regels geven OpenVPN de namen van de drie authenticatiebestanden op de server en het dh2048-optiebestand dat u eerder hebt gemaakt.
  • De serverlijn stelt het bereik en het subnetmasker in dat wordt gebruikt om IP-adressen aan clients toe te wijzen bij het inloggen.
  • Met de optionele push-parameter "route 10.0.3.0 255.255.255.0" kunnen externe clients toegang krijgen tot privé-subnetten achter de server. Om dit te laten werken, is het ook nodig om het netwerk op de server zelf in te stellen, zodat het privé-subnet op de hoogte is van het OpenVPN-subnet (10.8.0.0).
  • Met de port-share localhost 80-regel kunt u clientverkeer dat op poort 1194 binnenkomt, omleiden naar een lokale webserver die luistert op poort 80. (Dit is handig als u de webserver gaat gebruiken om uw VPN te testen.) Dit werkt alleen vervolgens wanneer het TCP-protocol is geselecteerd.
  • De regels gebruiker niemand en groep geengroep moeten worden ingeschakeld door de puntkomma's (;) te verwijderen. Door externe clients te dwingen als niemand en geen groep te werken, worden sessies op de server zonder privileges gegarandeerd.
  • log specificeert dat huidige loggegevens oude vermeldingen zullen overschrijven telkens wanneer OpenVPN wordt gestart, terwijl log-append nieuwe vermeldingen aan het bestaande logbestand toevoegt. Het bestand openvpn.log zelf wordt naar de map /etc/openvpn/ geschreven.

Daarnaast wordt er vaak ook een client-to-client waarde aan het configuratiebestand toegevoegd, zodat meerdere clients elkaar naast de OpenVPN-server kunnen zien. Als u tevreden bent met uw configuratie, kunt u de OpenVPN-server starten:

# systemctl start openvpn

Vanwege de veranderende aard van de relatie tussen OpenVPN en systemd kan de volgende syntaxis soms nodig zijn om een ​​dienst te starten: systemctl start openvpn@server.

Als u ip addr uitvoert om de netwerkinterfaces van uw server weer te geven, zou er nu een link moeten worden weergegeven naar een nieuwe interface genaamd tun0. OpenVPN zal het creëren om inkomende 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 forever

Mogelijk moet u de server opnieuw opstarten voordat alles volledig begint te werken. De volgende stop is de clientcomputer.

10.1.2. De OpenVPN-client configureren

Traditioneel worden tunnels gebouwd met minimaal twee uitgangen (anders zouden we ze grotten noemen). Een goed geconfigureerde OpenVPN op de server leidt het verkeer aan één kant de tunnel in en uit. Maar je hebt ook software nodig die aan de clientzijde draait, dat wil zeggen aan de andere kant van de tunnel.

In dit gedeelte ga ik me concentreren op het handmatig instellen van een soort Linux-computer om als OpenVPN-client te fungeren. Maar dit is niet de enige manier waarop deze mogelijkheid beschikbaar is. OpenVPN ondersteunt clienttoepassingen die kunnen worden geïnstalleerd en gebruikt op desktops en laptops met Windows of macOS, maar ook op Android- en iOS-smartphones en -tablets. Zie openvpn.net voor details.

Het OpenVPN-pakket moet op de clientcomputer worden geïnstalleerd zoals het op de server is geïnstalleerd, hoewel er hier geen behoefte is aan easy-rsa omdat de sleutels die u gebruikt al bestaan. U moet het client.conf-sjabloonbestand kopiëren naar de map /etc/openvpn/ die u zojuist hebt gemaakt. Deze keer wordt het bestand niet gecomprimeerd, dus het gewone cp-commando zal het werk prima doen:

# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf 
  /etc/openvpn/

De meeste instellingen in uw client.conf-bestand spreken voor zich: ze moeten overeenkomen met de waarden op de server. Zoals u kunt zien in het volgende voorbeeldbestand, is de unieke parameter extern 192.168.1.23 1194, wat de client het IP-adres van de server vertelt. Nogmaals, zorg ervoor dat dit uw serveradres is. U moet de clientcomputer ook dwingen de authenticiteit van het servercertificaat te verifiëren om een ​​mogelijke man-in-the-middle-aanval te voorkomen. Eén manier om dit te doen is door de regel remote-cert-tls server toe te voegen (Lijst 10.3).

Boek "Linux in actie"
U kunt nu naar de map /etc/openvpn/ gaan en de certificeringssleutels van de server extraheren. Vervang het IP-adres of de domeinnaam van de server in het voorbeeld door uw waarden:

Boek "Linux in actie"
Er zal waarschijnlijk niets spannends gebeuren totdat u OpenVPN op de client uitvoert. Omdat u een aantal argumenten moet doorgeven, doet u dit vanaf de opdrachtregel. Het argument --tls-client vertelt OpenVPN dat u als client zult optreden en verbinding zult maken via TLS-codering, en --config verwijst naar uw configuratiebestand:

# openvpn --tls-client --config /etc/openvpn/client.conf

Lees de opdrachtuitvoer zorgvuldig om er zeker van te zijn dat u correct bent aangesloten. Als er de eerste keer iets misgaat, kan dit te wijten zijn aan een verkeerde combinatie van de instellingen tussen de server- en clientconfiguratiebestanden of aan een probleem met de netwerkverbinding/firewall. Hier volgen enkele tips voor het oplossen van problemen.

  • Lees zorgvuldig de uitvoer van de OpenVPN-bewerking op de client. Het bevat vaak waardevol advies over wat er precies niet kan worden gedaan en waarom.
  • Controleer de foutmeldingen in de bestanden openvpn.log en openvpn-status.log in de map /etc/openvpn/ op de server.
  • Controleer de systeemlogboeken op de server en client op OpenVPN-gerelateerde en getimede berichten. (journalctl -ce toont de meest recente vermeldingen.)
  • Zorg ervoor dat u een actieve netwerkverbinding hebt tussen de server en de client (meer hierover in hoofdstuk 14).

Over de auteur

David Clinton - systeembeheerder, docent en schrijver. Hij heeft educatief materiaal beheerd, geschreven en gemaakt voor veel belangrijke technische disciplines, waaronder Linux-systemen, cloud computing (met name AWS) en containertechnologieën zoals Docker. Hij schreef het boek Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Veel van zijn videotrainingen zijn te vinden op Pluralsight.com, en links naar zijn andere boeken (over Linux-beheer en servervirtualisatie) zijn beschikbaar op bootstrap-it.com.

» Meer details over het boek zijn te vinden op website van de uitgever
» inhoudsopgave
» Uittreksel

Voor Khabrozhiteley 25% korting met coupon - Linux
Na betaling van de papieren versie van het boek wordt een elektronisch boek per e-mail verzonden.

Bron: www.habr.com

Voeg een reactie