Bogen «Linux i praksis»

Bogen «Linux i praksis» Hej, Habr-ere! I bogen beskriver David Clinton 12 virkelige projekter, herunder automatisering af backupsystemer, opsætning af et personligt filcloud i stil med Dropbox og oprettelse af en egen MediaWiki-server. Gennem interessante eksempler vil du lære om virtualisering, katastrofegendannelse, sikkerhed, backup, implementering af DevOps og fejlfinding i systemet. Hver kapitel afsluttes med en oversigt over praktiske anbefalinger, et glosarium med nye termer og øvelser.

Uddrag «10.1. Oprettelse af OpenVPN-tunnel»

I denne bog har jeg allerede beskrevet en del om kryptering. SSH og SCP kan beskytte data, der sendes over fjerntilkoblede forbindelser (kapitel 3), filkryptering sikrer data, der opbevares på serveren (kapitel 8), og TLS/SSL-certifikater kan beskytte data, når de overføres mellem websteder og kunde-browserne (kapitel 9). Men nogle gange kræver dine data beskyttelse i et bredere spektrum af forbindelser. For eksempel kan nogle medlemmer af dit team være nødt til at arbejde på farten og forbinde til netværket via Wi-Fi gennem offentlige hotspots. Det er bestemt ikke sikkert at antage, at alle sådanne hotspots er sikre, men dine medarbejdere har brug for en måde at tilslutte sig virksomhedens ressourcer — og i dette tilfælde vil en VPN være til hjælp.

Et korrekt designet VPN-tunnel sikrer en direkte forbindelse mellem fjerntliggende klienter og serveren, så dataene skjules ved overførsel gennem usikre netværk. Så hvad så? Du har allerede set mange værktøjer, der kan gøre dette med kryptering. Den reelle værdi ved VPN er, at når du åbner en tunnel, kan du forbinde fjerntliggende netværk, som om de alle var lokale. På en måde bruger du en omvej.

Ved at bruge et sådant avanceret netværk kan administratorer udføre deres arbejde på deres servere fra ethvert sted. Men vigtigere er, at en virksomhed med ressourcer fordelt på flere filialer kan gøre dem alle synlige og tilgængelige for alle grupper, der har brug for dem, uanset hvor de befinder sig (fig. 10.1).

Selv tunnelen i sig selv garanterer ikke sikkerhed. Men en af standarderne for kryptering kan integreres i netværksstrukturen, hvilket væsentligt forbedrer sikkerhedsniveauet. Tunneler, der er oprettet ved brug af OpenVPN-pakken med åbent kildekode, bruger den samme TLS/SSL-kryptering, som du allerede har læst om. OpenVPN er ikke den eneste tilgængelige mulighed for tunneldannelser, men det er en af de mest kendte. Det antages at være lidt hurtigere og mere sikkert end den alternative tunneleringsprotokol på niveau 2, der bruger IPsec-kryptering.

Ønsker du, at dit team kan kommunikere sikkert med hinanden, mens de er på farten eller arbejder i forskellige bygninger? For at opnå dette er det nødvendigt at oprette en OpenVPN-server for at tillade applikationsdeling og adgang til serverens lokale netværksmiljø. For at dette kan fungere, skal du blot starte to virtuelle maskiner eller to containere: en til at udfylde rollen som server/vært og den anden til klienten. Oprettelse af en VPN er en kompleks proces, så det kan være en god idé at bruge et par minutter på at visualisere det samlede billede.

Bogen «Linux i praksis»

10.1.1. Konfiguration af OpenVPN-serveren

Før du starter, vil jeg give dig et nyttigt råd. Hvis du planlægger at gøre alt selv (og jeg anbefaler stærkt dig at gøre det), vil du sandsynligvis opdage, at du arbejder med flere terminalvinduer åbne på skrivebordet, hver forbundet til sin egen maskine. Der er en risiko for, at du på et tidspunkt indtaster en kommando i det forkerte vindue. For at undgå dette kan du bruge kommandoen hostname til at ændre maskinens navn, der vises i kommandoprompten, til noget, der tydeligt fortæller dig, hvor du befinder dig. Når du har gjort dette, skal du logge ud fra serveren og logge ind igen, så de nye indstillinger træder i kraft. Sådan ser det ud:

Bogen «Linux i praksis»
Ved at følge denne tilgang og give de respektive navne til hver af de maskiner, du arbejder med, vil du let være i stand til at holde styr på, hvor du er.

Efter at have brugt hostname kan du støde på irriterende meddelelser 'Unable to Resolve Host OpenVPN-Server', når du udfører efterfølgende kommandoer. Opdatering af filen /etc/hosts med det relevante nye værtname skulle løse problemet.

Forberedelse af din server til OpenVPN

For installation of OpenVPN on your server, two packages are required: openvpn and easy-rsa (for managing the encryption key generation process). CentOS users should first install the epel-release repository if necessary, as you did in Chapter 2. To be able to check access to the server application, you may also install the Apache web server (apache2 for Ubuntu and httpd on CentOS).

While you set up the server, I recommend activating a firewall that blocks all ports except for 22 (SSH) and 1194 (the default OpenVPN port). This example illustrates how ufw works in Ubuntu, but I'm sure you still remember the firewalld program from Chapter 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

To allow internal routing between network interfaces on the server, you need to uncomment one line (net.ipv4.ip_forward = 1) in the /etc/sysctl.conf file. This will enable forwarding for remote clients as needed after they connect. To apply the new parameter, run sysctl -p:

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

Now the server environment is fully configured, but there's still something to do before you're ready: you will need to perform the following steps (which we will discuss in detail later).

  1. Create a set of keys for the public key infrastructure (PKI) on the server using the scripts provided with the easy-rsa package. Essentially, the OpenVPN server also acts as its own certificate authority (CA).
  2. Prepare the appropriate keys for the client
  3. Configure the server's server.conf file
  4. Set up your OpenVPN client
  5. Test your VPN

Key generation for encryption

To simplify things, you can set up your key infrastructure on the same machine where the OpenVPN server operates. However, security recommendations usually suggest using a separate CA server for deployments in a production environment. The process of generating and distributing encryption key resources for use in OpenVPN is illustrated in figure 10.2.

Bogen «Linux i praksis»
When you installed OpenVPN, the directory /etc/openvpn/ was automatically created, but it is currently empty. The openvpn and easy-rsa packages come with example template files that you can use as a base for your configuration. To start the certification process, copy the easy-rsa template directory from /usr/share/ to /etc/openvpn and navigate to the easy-rsa/ directory:

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

Katalog easy-rsa vil nu indeholde en hel del scripts. Tabel 10.1 opregner de værktøjer, du vil bruge til at oprette nøgler.

Bogen «Linux i praksis»

De nævnte operationer kræver root-rettigheder, så du skal blive root via sudo su.

Den første fil, du skal arbejde med, hedder vars og indeholder miljøvariabler, som easy-rsa bruger ved generation af nøgler. Du skal redigere filen for at bruge dine egne værdier i stedet for de standardværdier, der allerede er der. Sådan vil min fil se ud (listing 10.1).

Listing 10.1. Vigtige udsnit af filen /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"

Kørslen af filen vars vil tillade, at dens værdier overføres til shell-miljøet, hvorfra de vil blive inkluderet i indholdet af dine nye nøgler. Hvorfor virker sudo-kommandoen selv ikke? Fordi vi i første trin redigerer scriptet med navnet vars, og derefter anvender det. Anvendelse betyder, at filen vars overfører sine værdier til shell-miljøet, hvorfra de vil blive inkluderet i indholdet af dine nye nøgler.

Sørg for at køre filen igen med en ny shell for at afslutte den uafsluttede proces. Når dette er gjort, vil scriptet bede dig om at køre et andet script, clean-all, for at fjerne alt indhold i kataloget /etc/openvpn/easy-rsa/keys/:

Bogen «Linux i praksis»
Næste skridt vil naturligvis være at køre scriptet clean-all, efterfulgt af build-ca, som bruger scriptet pkitool til at oprette det rodfæstede certifikat. Du vil blive bedt om at bekræfte identifikationsindstillingerne leveret af vars:

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

Dernæst kommer scriptet build-key-server. Da det bruger det samme script pkitool sammen med det nye rodcertifikat, vil du se de samme spørgsmål for bekræftelse af oprettelsen af nøgleparet. Nøglerne vil få navne baseret på de argumenter, du videregiver, som vil være server, medmindre du kører flere VPN'er på denne computer.

# ./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 bruger parametre genereret ved hjælp af Diffie-Hellman-algoritmen (ved at anvende build-dh) til at forhandle autentificeringen til nye forbindelser. Den fil, der er oprettet her, behøver ikke at være hemmelig, men skal være genereret med scriptet build-dh for de RSA-nøgler, der i øjeblikket er aktive. Hvis du opretter nye RSA-nøgler i fremtiden, skal du også opdatere filen baseret på Diffie-Hellman-algoritmen:

# ./build-dh

Dine nøgler på serversiden vil nu befinde sig i kataloget /etc/openvpn/easy-rsa/keys/, men OpenVPN er ikke klar over det. Som standard søger OpenVPN efter nøgler i /etc/openvpn/, så kopier dem:

# 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

Forberedelse af klientens krypteringsnøgler

Som du allerede har set, bruges der i TLS-kryptering par af matchende nøgler: én er installeret på serveren, og den anden er på den fjerne klients side. Det betyder, at du har brug for klientnøglerne. Vores gamle ven pkitool er lige det, vi har brug for til dette. I dette eksempel, ved at køre programmet i kataloget /etc/openvpn/easy-rsa/, giver vi det argumentet client for at generere filer med navnet client.crt og client.key:

# ./pkitool client

De to klientfiler sammen med den oprindelige fil ca.crt, som stadig befinder sig i kataloget keys/, skal nu overføres sikkert til din klient. På grund af deres ejerskab og adgangsrettigheder kan det vise sig at være en udfordring. Den enkleste tilgang er at kopiere indholdet af den oprindelige fil (og kun dette indhold) manuelt ind i terminalen, der kører på skrivebordet på din pc (vælg teksten, højreklik på den, og vælg Kopier i menuen). Indsæt dette i en ny fil med det samme navn, som du opretter i den anden terminal, der er tilsluttet din klient.

Men enhver kan klippe og indsætte. Tænk i stedet som en administrator, fordi du ikke altid vil have adgang til GUI, hvor klip/indsæt-handlingen er mulig. Kopier filerne til din brugers hjemmekatalog (så den fjerne scp-operation kan få adgang til dem), og brug derefter chown til at ændre ejerskabet af filerne fra root til en almindelig bruger uden root-beføjelser, så du kan udføre den fjerne scp-handling. Sørg for, at alle dine filer på nuværende tidspunkt er installeret og tilgængelige. Du vil flytte dem til klienten lidt senere:

# 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

Med et fuldt sæt af krypteringsnøgler klar til brug, skal du informere serveren om, hvordan du vil oprette VPN. Dette gøres ved hjælp af filen server.conf.

Reducer antallet af tastetryk

Er der for meget at skrive? Udvidelsen med parenteser hjælper med at reducere de seks kommandoer til to. Jeg er sikker på, at du kan lære disse to eksempler og forstå, hvad der sker. Endnu vigtigere, du vil kunne forstå, hvordan du anvender disse principper på operationer, der involverer dusinvis eller endda hundreder af elementer:

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

Konfiguration af filen server.conf

Hvordan kan du vide, hvordan filen server.conf bør se ud? Husk skabelonmappen easy-rsa, som du kopierede fra /usr/share/? Da du installerede OpenVPN, blev der efterladt en komprimeret konfigurationsskabelon, som du kan kopiere til /etc/openvpn/. Jeg vil bygge videre på det faktum, at skabelonen er arkiveret, og jeg vil introducere dig til et nyttigt værktøj: zcat.

Du ved allerede om output af tekstindholdet fra en fil til skærmen med kommandoen cat, men hvad hvis filen er komprimeret med gzip? Du kan altid udpakke filen, og så vil cat glædeligt vise den, men det kræver et eller to ekstra skridt. I stedet, som du sikkert allerede har gættet, kan du indtaste kommandoen zcat for at indlæse den udpakkede tekst i hukommelsen i ét skridt. I det følgende eksempel vil du i stedet for at skrive teksten på skærmen omdirigere den til en ny fil med navnet server.conf:

# zcat 
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz 
  > /etc/openvpn/server.conf
$ cd /etc/openvpn

Lad os se bort fra den omfattende og nyttige dokumentation, der følger med filen, og se, hvordan den kan se ud, når du er færdig med at redigere. Bemærk, at semikolon (;) angiver til OpenVPN, at den ikke skal læse og udføre den følgende linje (listing 10.2).

Bogen «Linux i praksis»
Lad os gennemgå nogle af disse indstillinger.

  • Som standard arbejder OpenVPN gennem port 1194. Du kan ændre dette, for eksempel for at skjule dine handlinger yderligere eller undgå konflikter med andre aktive tunneller. Da 1194 kræver minimal koordinering med klienterne, er det bedst at gøre det på denne måde.
  • OpenVPN anvender enten Transmission Control Protocol (TCP) eller User Datagram Protocol (UDP) til dataoverførsel. TCP kan være lidt langsommere, men er mere pålideligt og sandsynligvis lettere at forstå for applikationer, der kører i begge ender af tunnelen.
  • Du kan angive dev tun, når du vil oprette en enklere og mere effektiv IP-tunnel, der overfører dataindhold og intet andet. Hvis du derimod har brug for at sammenkoble flere netværksinterfaces (og de netværk, de repræsenterer) ved at oprette en Ethernet-bro, skal du vælge dev tap. Hvis du ikke forstår, hvad det hele betyder, skal du bruge tun-argumentet.
  • De følgende fire linjer angiver OpenVPN filnavne for tre autentifikationsfiler på serveren samt dh2048-parametrene, som du tidligere har oprettet.
  • Linjen server angiver det interval og netmaske, der skal bruges til tildeling af IP-adresser til klienter ved login.
  • Den valgfrie push-parameter ‘route 10.0.3.0 255.255.255.0’ giver fjernklienter adgang til private netværk bag serveren. For at gøre dette kræves der også netværkskonfiguration på selve serveren, så det private netværk kender netværket OpenVPN (10.8.0.0).
  • Linjen port-share localhost 80 gør det muligt at omdirigere klienttrafik, der kommer gennem port 1194, til den lokale webserver, der lytter på port 80. (Dette vil være nyttigt, hvis du planlægger at involvere en webserver til at teste din VPN.) Dette fungerer kun, når protokollen tcp er valgt.
  • Linjerne user nobody og group nogroup skal være aktiveret — for dette skal semikolon (; ) fjernes. At påtvinge, at fjernklienter kører som nobody og nogroup, sikrer, at sessioner på serveren er uden privilegier.
  • log angiver, at de aktuelle logposter vil overskrive de gamle poster ved hver opstart af OpenVPN, mens log-append tilføjer nye poster til den eksisterende logfil. Selve filen openvpn.log skrives til kataloget /etc/openvpn/

Derudover tilføjes værdien client-to-client ofte til konfigurationsfilen, så flere klienter kan se hinanden ud over OpenVPN-serveren. Hvis du er tilfreds med din konfiguration, kan du starte OpenVPN-serveren:

# systemctl start openvpn

På grund af det skiftende forhold mellem OpenVPN og systemd kan det i nogle tilfælde være nødvendigt at bruge følgende syntaks for at starte tjenesten: systemctl start openvpn@server.

At køre ip addr for at vise listen over netværksinterfaces på din server skal nu vise et link til det nye interface med navnet tun0. OpenVPN opretter det for at betjene indkommende klienter:

$ 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

Du skal muligvis genstarte serveren, før alt fungerer korrekt. Næste stop er klientcomputeren.

10.1.2. Konfiguration af OpenVPN-klienten

Traditionelt opbygges tunneler minimum med to udgange (ellers ville vi kalde dem huler). En korrekt konfigureret OpenVPN på serveren dirigerer trafik ind i tunnelen og ud af den på den ene side. Men du skal også have noget software, der kører på klientsiden, altså i den anden ende af tunnelen.

I dette afsnit vil jeg fokusere på manuel konfiguration af en hvilken som helst type Linux-computer til at fungere som OpenVPN-klient. Men dette er ikke den eneste mulighed, der er til rådighed. OpenVPN understøtter klientapplikationer, der kan installeres og anvendes på stationære og bærbare computere med Windows eller macOS samt smartphones og tablets på Android og iOS. Se flere oplysninger på openvpn.net.

OpenVPN-pakken skal installeres på klientcomputeren, ligesom den blev installeret på serveren, selvom der ikke er behov for easy-rsa her, da de nøgler, du bruger, allerede eksisterer. Du skal kopiere skabelonfilen client.conf til katalogen /etc/openvpn/, som lige er blevet oprettet. Denne gang vil filen ikke blive arkiveret, så den almindelige cp-kommando klarer opgaven fint:

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

De fleste indstillinger i din client.conf-fil vil være ret forståelige: de skal svare til værdierne på serveren. Som det ses i det følgende eksempel på en fil, er den unikke parameter remote 192.168.1.23 1194, som angiver klienten serverens IP-adresse. Sørg igen for, at dette er adressen på din server. Du skal også få klientcomputeren til at verificere serverens certifikat for at forhindre mulige 'man-in-the-middle'-angreb. En måde at gøre dette på er at tilføje linjen remote-cert-tls server (listing 10.3).

Bogen «Linux i praksis»
Nu kan du gå til katalogen /etc/openvpn/ og hente certifikatnøglerne fra serveren. Erstat serverens IP-adresse eller domænenavn i eksemplet med dine værdier:

Bogen «Linux i praksis»
Der forventes sandsynligvis ikke noget spændende, før du kører OpenVPN på klienten. Da du skal videregive et par argumenter, gør du det fra kommandolinjen. Argumentet —tls-client fortæller OpenVPN, at du vil optræde som klient og oprette forbindelse via TLS-kryptering, mens —config peger på din konfigurationsfil:

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

Læs nøje outputtet fra kommandoen for at sikre, at du er korrekt tilsluttet. Hvis der er problemer første gang, kan det skyldes uoverensstemmelser i indstillingerne mellem serverens og klientens konfigurationsfiler eller et netværks-/firewallproblem. Her er nogle tips til fejlfinding.

  • Læs nøje outputtet fra OpenVPN-operationen på klienten. Det indeholder ofte værdifulde råd om, hvad der ikke kunne udføres, og hvorfor.
  • Tjek fejlmeddelelser i filerne openvpn.log og openvpn-status.log i kataloget /etc/openvpn/ på serveren.
  • Tjek relaterede OpenVPN-beskeder og relevante tidsstempling i systemlogfilerne på serveren og klienten. (journalctl -ce viser de nyeste poster.)
  • Sørg for, at du har en aktiv netværksforbindelse mellem serveren og klienten (mere om dette i kapitel 14).

Om forfatteren

David Clinton – systemadministrator, underviser og forfatter. Han har administreret, skrevet om dette og lavet undervisningsmateriale for mange vigtige tekniske discipliner, herunder Linux-systemer, cloud computing (specifikt AWS) og containerteknologier såsom Docker. Han har skrevet bogen Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Mange af hans undervisningsvideokurser kan findes på Pluralsight.com, og links til andre af hans bøger (om Linux-administration og servervirtualisering) er tilgængelige på bootstrap-it.com.

» Mere information om bogen kan findes på forlagets hjemmeside
» Indholdsfortegnelse
» Uddrag

For Habr-læsere er der 25% rabat med koden — Linux
Ved betaling af den fysiske version af bogen sendes e-bogen til e-mail.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster