Boken Linux in Action

Boken Linux in Action Hei Khabro-beboere! I boken beskriver David Clinton 12 virkelige prosjekter, inkludert automatisering av sikkerhetskopierings- og gjenopprettingssystemet, konfigurering av en personlig filsky i Dropbox-stil og opprettelse av din egen MediaWiki-server. Du vil utforske virtualisering, katastrofegjenoppretting, sikkerhet, sikkerhetskopiering, DevOps og systemfeilsøking gjennom interessante casestudier. Hvert kapittel avsluttes med en gjennomgang av beste praksis, en ordliste med nye termer og øvelser.

Utdrag "10.1. Opprette en OpenVPN-tunnel"

Jeg har allerede snakket mye om kryptering i denne boken. SSH og SCP kan beskytte data som overføres over eksterne tilkoblinger (kapittel 3), filkryptering kan beskytte data mens de er lagret på serveren (kapittel 8), og TLS/SSL-sertifikater kan beskytte data som overføres mellom nettsteder og klientnettlesere (kapittel 9). . Men noen ganger må dataene dine beskyttes over et bredere spekter av tilkoblinger. For eksempel, kanskje noen av teammedlemmene dine jobber på veien mens de kobler til Wi-Fi via offentlige hotspots. Du bør definitivt ikke anta at alle slike tilgangspunkter er sikre, men folkene dine trenger en måte å koble seg til selskapets ressurser på – og det er der en VPN kan hjelpe.

En riktig utformet VPN-tunnel gir en direkte forbindelse mellom eksterne klienter og serveren på en måte som skjuler data når de går over et usikkert nettverk. Hva så? Du har allerede sett mange verktøy som kan gjøre dette med kryptering. Den virkelige verdien av en VPN er at ved å åpne en tunnel kan du koble til eksterne nettverk som om de alle var lokale. På en måte bruker du en bypass.

Ved å bruke dette utvidede nettverket kan administratorer utføre arbeidet sitt på serverne sine fra hvor som helst. Men enda viktigere, et selskap med ressurser spredt over flere lokasjoner kan gjøre dem alle synlige og tilgjengelige for alle gruppene som trenger dem, uansett hvor de er (Figur 10.1).

Selve tunnelen garanterer ikke sikkerhet. Men en av krypteringsstandardene kan inkluderes i nettverksstrukturen, noe som øker sikkerhetsnivået betydelig. Tunneler opprettet med åpen kildekode OpenVPN-pakken bruker den samme TLS/SSL-krypteringen du allerede har lest om. OpenVPN er ikke det eneste tilgjengelige tunnelalternativet, men det er et av de mest kjente. Den anses å være litt raskere og sikrere enn den alternative Layer 2-tunnelprotokollen som bruker IPsec-kryptering.

Vil du at alle i teamet ditt skal kommunisere sikkert med hverandre mens du er på veien eller jobber i forskjellige bygninger? For å gjøre dette må du opprette en OpenVPN-server for å tillate applikasjonsdeling og tilgang til serverens lokale nettverksmiljø. For at dette skal fungere, er alt du trenger å gjøre å kjøre to virtuelle maskiner eller to containere: en for å fungere som server/vert og en for å fungere som klient. Å bygge en VPN er ikke en enkel prosess, så det er sannsynligvis verdt å ta noen minutter for å få det store bildet i tankene.

Boken Linux in Action

10.1.1. OpenVPN-serverkonfigurasjon

Før du begynner, skal jeg gi deg noen nyttige råd. Hvis du skal gjøre det selv (og jeg anbefaler at du gjør det), vil du sannsynligvis finne deg selv å jobbe med flere terminalvinduer åpne på skrivebordet ditt, hver koblet til en annen maskin. Det er en risiko for at du på et tidspunkt skriver inn feil kommando i vinduet. For å unngå dette kan du bruke hostname-kommandoen til å endre maskinnavnet som vises på kommandolinjen til noe som tydelig forteller deg hvor du er. Når du har gjort dette, må du logge ut av serveren og logge på igjen for at de nye innstillingene skal tre i kraft. Slik ser det ut:

Boken Linux in Action
Ved å følge denne tilnærmingen og gi passende navn til hver av maskinene du jobber med, kan du enkelt holde oversikt over hvor du er.

Etter å ha brukt vertsnavn, kan du støte på irriterende Unable to Resolve Host OpenVPN-Server-meldinger når du utfører påfølgende kommandoer. Oppdatering av /etc/hosts-filen med riktig nytt vertsnavn bør løse problemet.

Klargjør serveren din for OpenVPN

For å installere OpenVPN på serveren din trenger du to pakker: openvpn og easy-rsa (for å administrere krypteringsnøkkelgenereringsprosessen). CentOS-brukere bør først installere epel-release-depotet om nødvendig, slik du gjorde i kapittel 2. For å kunne teste tilgangen til serverapplikasjonen kan du også installere Apache-nettserveren (apache2 på Ubuntu og httpd på CentOS).

Mens du setter opp serveren din, anbefaler jeg å aktivere en brannmur som blokkerer alle porter unntatt 22 (SSH) og 1194 (OpenVPNs standardport). Dette eksemplet illustrerer hvordan ufw ville fungere på Ubuntu, men jeg er sikker på at du fortsatt husker CentOS-brannmurprogrammet fra kapittel 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

For å aktivere intern ruting mellom nettverksgrensesnitt på serveren, må du fjerne kommentarer fra én linje (net.ipv4.ip_forward = 1) i filen /etc/sysctl.conf. Dette vil tillate eksterne klienter å bli omdirigert etter behov når de er tilkoblet. For å få det nye alternativet til å fungere, kjør sysctl -p:

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

Servermiljøet ditt er nå fullt konfigurert, men det er fortsatt en ting til før du er klar: du må fullføre følgende trinn (vi vil dekke dem i detalj neste gang).

  1. Lag et sett med PKI-krypteringsnøkler (public key infrastructure) på serveren ved å bruke skriptene som følger med easy-rsa-pakken. I hovedsak fungerer OpenVPN-serveren også som sin egen sertifiseringsinstans (CA).
  2. Forbered passende nøkler for klienten
  3. Konfigurer server.conf-filen for serveren
  4. Sett opp din OpenVPN-klient
  5. Sjekk VPN-en din

Genererer krypteringsnøkler

For å gjøre ting enkelt kan du sette opp nøkkelinfrastrukturen din på samme maskin som OpenVPN-serveren kjører. Beste praksis for sikkerhet foreslår imidlertid vanligvis å bruke en separat CA-server for produksjonsdistribusjoner. Prosessen med å generere og distribuere krypteringsnøkkelressurser for bruk i OpenVPN er illustrert i fig. 10.2.

Boken Linux in Action
Når du installerte OpenVPN, ble /etc/openvpn/-katalogen automatisk opprettet, men det er ingenting i den ennå. Openvpn- og easy-rsa-pakkene kommer med eksempelmalfiler som du kan bruke som grunnlag for konfigurasjonen. For å starte sertifiseringsprosessen, kopier easy-rsa-malkatalogen fra /usr/share/ til /etc/openvpn og bytt til easy-rsa/-katalogen:

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

Easy-rsa-katalogen vil nå inneholde ganske mange skript. I tabellen 10.1 viser verktøyene du vil bruke til å lage nøkler.

Boken Linux in Action

Operasjonene ovenfor krever root-privilegier, så du må bli root via sudo su.

Den første filen du skal jobbe med heter vars og inneholder miljøvariablene som easy-rsa bruker når de genererer nøkler. Du må redigere filen for å bruke dine egne verdier i stedet for standardverdiene som allerede er der. Slik vil filen min se ut (oppføring 10.1).

Oppføring 10.1. Hovedfragmenter av 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="[email protected]"
export KEY_OU="IT"

Å kjøre vars-filen vil sende verdiene til shell-miljøet, hvor de vil bli inkludert i innholdet i de nye nøklene dine. Hvorfor fungerer ikke sudo-kommandoen i seg selv? For i det første trinnet redigerer vi skriptet som heter vars og bruker det deretter. Bruker og betyr at vars-filen overfører verdiene sine til shell-miljøet, hvor de vil bli inkludert i innholdet i de nye nøklene dine.

Sørg for å kjøre filen på nytt med et nytt skall for å fullføre den uferdige prosessen. Når dette er gjort, vil skriptet be deg om å kjøre et annet skript, clean-all, for å fjerne alt innhold i katalogen /etc/openvpn/easy-rsa/keys/:

Boken Linux in Action
Naturligvis er neste trinn å kjøre clean-all-skriptet, etterfulgt av build-ca, som bruker pkitool-skriptet til å lage rotsertifikatet. Du vil bli bedt om å bekrefte identitetsinnstillingene gitt av vars:

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

Deretter kommer build-key-server-skriptet. Siden det bruker det samme pkitool-skriptet sammen med det nye rotsertifikatet, vil du se de samme spørsmålene for å bekrefte opprettelsen av nøkkelparet. Nøklene vil bli navngitt basert på argumentene du sender, som, med mindre du kjører flere VPN-er på denne maskinen, vanligvis vil være server, som i eksemplet:

# ./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 bruker parametere generert av Diffie-Hellman-algoritmen (ved hjelp av build-dh) for å forhandle om autentisering for nye tilkoblinger. Filen som er opprettet her trenger ikke å være hemmelig, men må genereres ved hjelp av build-dh-skriptet for RSA-nøklene som for øyeblikket er aktive. Hvis du oppretter nye RSA-nøkler i fremtiden, må du også oppdatere Diffie-Hellman-filen:

# ./build-dh

Dine serversidenøkler vil nå ende opp i katalogen /etc/openvpn/easy-rsa/keys/, men OpenVPN vet ikke dette. Som standard vil OpenVPN se etter nøkler 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

Klargjøring av klientkrypteringsnøkler

Som du allerede har sett, bruker TLS-kryptering par med samsvarende nøkler: en installert på serveren og en installert på den eksterne klienten. Dette betyr at du trenger klientnøkler. Vår gamle venn pkitool er akkurat det du trenger for dette. I dette eksemplet, når vi kjører programmet i katalogen /etc/openvpn/easy-rsa/, sender vi det et klientargument for å generere filer kalt client.crt og client.key:

# ./pkitool client

De to klientfilene, sammen med den originale ca.crt-filen som fortsatt er i keys/-katalogen, skal nå være sikkert overført til klienten din. På grunn av deres eierskap og tilgangsrettigheter er dette kanskje ikke så lett. Den enkleste tilnærmingen er å manuelt kopiere innholdet i kildefilen (og ingenting annet enn det innholdet) til en terminal som kjører på PC-ens skrivebord (velg teksten, høyreklikk på den og velg Kopier fra menyen). Deretter limer du dette inn i en ny fil med samme navn som du oppretter i en annen terminal koblet til klienten din.

Men hvem som helst kan klippe og lime. Tenk i stedet som en administrator fordi du ikke alltid vil ha tilgang til GUI der klipp/lim inn operasjoner er mulig. Kopier filene til brukerens hjemmekatalog (slik at den eksterne scp-operasjonen kan få tilgang til dem), og bruk deretter chown for å endre eierskapet til filene fra root til en vanlig ikke-root-bruker slik at den eksterne scp-handlingen kan utføres. Sørg for at alle filene dine er installert og tilgjengelig for øyeblikket. Du vil flytte dem til klienten litt 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 komplett sett med krypteringsnøkler klar til bruk, må du fortelle serveren hvordan du vil opprette VPN. Dette gjøres ved å bruke filen server.conf.

Redusere antall tastetrykk

Er det for mye å skrive? Utvidelse med parenteser vil bidra til å redusere disse seks kommandoene til to. Jeg er sikker på at du kan studere disse to eksemplene og forstå hva som skjer. Enda viktigere, vil du være i stand til å forstå hvordan du bruker disse prinsippene på operasjoner som involverer titalls eller til og med hundrevis av elementer:

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

Sette opp server.conf-filen

Hvordan kan du vite hvordan server.conf-filen skal se ut? Husker du easy-rsa-katalogmalen du kopierte fra /usr/share/? Da du installerte OpenVPN, satt du igjen med en komprimert konfigurasjonsmalfil som du kan kopiere til /etc/openvpn/. Jeg skal bygge på det faktum at malen er arkivert og introdusere deg for et nyttig verktøy: zcat.

Du vet allerede om å skrive ut tekstinnholdet i en fil til skjermen ved å bruke cat-kommandoen, men hva om filen er komprimert med gzip? Du kan alltid pakke ut filen og så vil cat gjerne sende den ut, men det er ett eller to flere trinn enn nødvendig. I stedet, som du kanskje har gjettet, kan du gi zcat-kommandoen for å laste den utpakkede teksten inn i minnet i ett trinn. I det følgende eksempelet, i stedet for å skrive ut tekst til skjermen, vil du omdirigere den til en ny fil kalt server.conf:

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

La oss legge til side den omfattende og nyttige dokumentasjonen som følger med filen og se hvordan den kan se ut når du er ferdig med å redigere. Merk at semikolon (;) forteller OpenVPN å ikke lese eller kjøre neste linje (Listing 10.2).

Boken Linux in Action
La oss gå gjennom noen av disse innstillingene.

  • Som standard kjører OpenVPN på port 1194. Du kan endre dette for eksempel for å skjule aktivitetene dine ytterligere eller unngå konflikter med andre aktive tunneler. Siden 1194 krever minimal koordinering med klienter, er det best å gjøre det på denne måten.
  • OpenVPN bruker enten Transmission Control Protocol (TCP) eller User Datagram Protocol (UDP) for å overføre data. TCP kan være litt tregere, men det er mer pålitelig og mer sannsynlig å bli forstått av applikasjoner som kjører i begge ender av tunnelen.
  • Du kan spesifisere dev tun når du vil lage en enklere, mer effektiv IP-tunnel som bærer datainnhold og ingenting annet. Hvis du derimot trenger å koble til flere nettverksgrensesnitt (og nettverkene de representerer), og opprette en Ethernet-bro, må du velge dev tap. Hvis du ikke forstår hva dette betyr, bruk tun-argumentet.
  • De neste fire linjene gir OpenVPN navnene på de tre autentiseringsfilene på serveren og dh2048-alternativfilen du opprettet tidligere.
  • Serverlinjen angir rekkevidden og subnettmasken som skal brukes til å tildele IP-adresser til klienter ved pålogging.
  • Den valgfrie push-parameteren "rute 10.0.3.0 255.255.255.0" lar eksterne klienter få tilgang til private undernett bak serveren. For å få dette til å fungere krever det også å sette opp nettverket på selve serveren slik at det private subnettet vet om OpenVPN-subnettet (10.8.0.0).
  • Port-share localhost 80-linjen lar deg omdirigere klienttrafikk som kommer på port 1194 til en lokal webserver som lytter på port 80. (Dette vil være nyttig hvis du skal bruke webserveren til å teste VPN-en din.) Dette fungerer bare deretter når tcp-protokollen er valgt.
  • Brukeren ingen og gruppe-noggruppelinjene må aktiveres ved å fjerne semikolonene (;). Å tvinge eksterne klienter til å kjøre som ingen og ingen gruppe sikrer at økter på serveren er uprivilegerte.
  • log spesifiserer at gjeldende loggoppføringer vil overskrive gamle oppføringer hver gang OpenVPN startes, mens log-append legger til nye oppføringer til den eksisterende loggfilen. Selve openvpn.log-filen skrives til /etc/openvpn/-katalogen.

I tillegg legges en klient-til-klient-verdi også ofte til i konfigurasjonsfilen slik at flere klienter kan se hverandre i tillegg til OpenVPN-serveren. Hvis du er fornøyd med konfigurasjonen din, kan du starte OpenVPN-serveren:

# systemctl start openvpn

På grunn av den skiftende karakteren av forholdet mellom OpenVPN og systemd, kan følgende syntaks noen ganger være nødvendig for å starte en tjeneste: systemctl start openvpn@server.

Å kjøre ip-adr for å vise serverens nettverksgrensesnitt skal nå sende ut en kobling til et nytt grensesnitt kalt tun0. OpenVPN vil lage den for å betjene innkommende kunder:

$ 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 må kanskje starte serveren på nytt før alt begynner å fungere fullt ut. Neste stopp er klientdatamaskinen.

10.1.2. Konfigurering av OpenVPN-klienten

Tradisjonelt bygges tunneler med minst to utganger (ellers ville vi kalt dem grotter). En riktig konfigurert OpenVPN på serveren leder trafikk inn og ut av tunnelen på den ene siden. Men du trenger også noe programvare som kjører på klientsiden, det vil si i den andre enden av tunnelen.

I denne delen skal jeg fokusere på å manuelt sette opp en type Linux-datamaskin for å fungere som en OpenVPN-klient. Men dette er ikke den eneste måten denne muligheten er tilgjengelig på. OpenVPN støtter klientapplikasjoner som kan installeres og brukes på stasjonære og bærbare datamaskiner som kjører Windows eller macOS, samt Android og iOS smarttelefoner og nettbrett. Se openvpn.net for detaljer.

OpenVPN-pakken må installeres på klientmaskinen slik den ble installert på serveren, selv om det ikke er behov for easy-rsa her siden nøklene du bruker allerede eksisterer. Du må kopiere client.conf-malfilen til /etc/openvpn/-katalogen som du nettopp opprettet. Denne gangen vil ikke filen bli zippet, så den vanlige cp-kommandoen vil gjøre jobben helt fint:

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

De fleste innstillingene i client.conf-filen din vil være ganske selvforklarende: de skal samsvare med verdiene på serveren. Som du kan se fra følgende eksempelfil, er den unike parameteren ekstern 192.168.1.23 1194, som forteller klienten IP-adressen til serveren. Igjen, sørg for at dette er serveradressen din. Du bør også tvinge klientdatamaskinen til å bekrefte autentisiteten til serversertifikatet for å forhindre et mulig man-in-the-middle-angrep. En måte å gjøre dette på er å legge til linjen remote-cert-tls server (Listing 10.3).

Boken Linux in Action
Du kan nå gå til /etc/openvpn/-katalogen og trekke ut sertifiseringsnøklene fra serveren. Erstatt serverens IP-adresse eller domenenavn i eksemplet med verdiene dine:

Boken Linux in Action
Ingenting spennende vil sannsynligvis skje før du kjører OpenVPN på klienten. Siden du må sende et par argumenter, gjør du det fra kommandolinjen. --tls-client-argumentet forteller OpenVPN at du vil fungere som en klient og koble til via TLS-kryptering, og --config peker på konfigurasjonsfilen din:

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

Les kommandoutgangen nøye for å sikre at du er riktig tilkoblet. Hvis noe går galt første gang, kan det skyldes feil i innstillingene mellom server- og klientkonfigurasjonsfilene eller et problem med nettverkstilkobling/brannmur. Her er noen feilsøkingstips.

  • Les nøye utdataene fra OpenVPN-operasjonen på klienten. Den inneholder ofte verdifulle råd om nøyaktig hva som ikke kan gjøres og hvorfor.
  • Sjekk feilmeldingene i filene openvpn.log og openvpn-status.log i /etc/openvpn/-katalogen på serveren.
  • Sjekk systemloggene på serveren og klienten for OpenVPN-relaterte og tidsbestemte meldinger. (journalctl -ce vil vise de siste oppføringene.)
  • Sørg for at du har en aktiv nettverksforbindelse mellom serveren og klienten (mer om dette i kapittel 14).

Om forfatteren

David Clinton - systemadministrator, lærer og skribent. Han har administrert, skrevet om og laget undervisningsmateriell for mange viktige tekniske disipliner, inkludert Linux-systemer, cloud computing (spesielt AWS) og containerteknologier som Docker. Han skrev boken Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Mange av videoopplæringskursene hans finnes på Pluralsight.com, og lenker til hans andre bøker (om Linux-administrasjon og servervirtualisering) er tilgjengelig på bootstrap-it.com.

» For mer informasjon om boken, vennligst besøk forlagets nettside
» innholdsfortegnelsen
» Utdrag

For Khabrozhiteli 25% rabatt på kupongen - Linux
Ved betaling av papirutgaven av boken sendes en e-bok til e-post.

Kilde: www.habr.com

Legg til en kommentar