Boken "Linux in Action"

Boken "Linux in Action" Hej alla Khabrobor! I boken beskriver David Clinton 12 verkliga projekt, inklusive automatisering av ditt säkerhetskopierings- och återställningssystem, konfigurering av ett personligt filmoln i Dropbox-stil och skapande av din egen MediaWiki-server. Du kommer att utforska virtualisering, katastrofåterställning, säkerhet, säkerhetskopiering, DevOps och systemfelsökning genom intressanta fallstudier. Varje kapitel avslutas med en genomgång av bästa praxis, en ordlista med nya termer och övningar.

Utdrag "10.1. Skapa en OpenVPN-tunnel"

Jag har redan pratat mycket om kryptering i den här boken. SSH och SCP kan skydda data som överförs via fjärranslutningar (kapitel 3), filkryptering kan skydda data medan den lagras på servern (kapitel 8) och TLS/SSL-certifikat kan skydda data som överförs mellan webbplatser och klientwebbläsare (kapitel 9) . Men ibland behöver dina data skyddas över ett bredare utbud av anslutningar. Till exempel kanske några av dina teammedlemmar arbetar på vägen medan de ansluter till Wi-Fi via offentliga hotspots. Du bör definitivt inte anta att alla sådana åtkomstpunkter är säkra, men dina medarbetare behöver ett sätt att ansluta till företagets resurser – och det är där en VPN kan hjälpa.

En korrekt designad VPN-tunnel ger en direkt anslutning mellan fjärrklienter och servern på ett sätt som döljer data när den färdas över ett osäkert nätverk. Än sen då? Du har redan sett många verktyg som kan göra detta med kryptering. Det verkliga värdet av ett VPN är att genom att öppna en tunnel kan du ansluta fjärrnätverk som om de alla vore lokala. På sätt och vis använder du en bypass.

Med detta utökade nätverk kan administratörer utföra sitt arbete på sina servrar var som helst. Men ännu viktigare, ett företag med resurser spridda över flera platser kan göra dem alla synliga och tillgängliga för alla grupper som behöver dem, var de än är (Figur 10.1).

Själva tunneln garanterar inte säkerheten. Men en av krypteringsstandarderna kan inkluderas i nätverksstrukturen, vilket avsevärt ökar säkerhetsnivån. Tunnlar skapade med OpenVPN-paketet med öppen källkod använder samma TLS/SSL-kryptering som du redan har läst om. OpenVPN är inte det enda tillgängliga tunnelalternativet, men det är ett av de mest kända. Det anses vara något snabbare och säkrare än det alternativa Layer 2-tunnelprotokollet som använder IPsec-kryptering.

Vill du att alla i ditt team ska kommunicera säkert med varandra när de är på väg eller arbetar i olika byggnader? För att göra detta måste du skapa en OpenVPN-server för att tillåta applikationsdelning och åtkomst till serverns lokala nätverksmiljö. För att detta ska fungera behöver du bara köra två virtuella maskiner eller två behållare: en för att fungera som server/värd och en för att fungera som klient. Att bygga ett VPN är inte en enkel process, så det är förmodligen värt att ta några minuter för att få helheten i åtanke.

Boken "Linux in Action"

10.1.1. OpenVPN-serverkonfiguration

Innan du börjar ska jag ge dig några användbara råd. Om du ska göra det själv (och jag rekommenderar starkt att du gör det), kommer du förmodligen att arbeta med flera terminalfönster öppna på skrivbordet, var och en ansluten till en annan maskin. Det finns en risk att du någon gång skriver in fel kommando i fönstret. För att undvika detta kan du använda kommandot hostname för att ändra maskinnamnet som visas på kommandoraden till något som tydligt talar om för dig var du är. När du har gjort detta måste du logga ut från servern och logga in igen för att de nya inställningarna ska träda i kraft. Så här ser det ut:

Boken "Linux in Action"
Genom att följa detta tillvägagångssätt och ge lämpliga namn till var och en av de maskiner du arbetar med kan du enkelt hålla reda på var du befinner dig.

Efter att ha använt värdnamnet kan du stöta på irriterande meddelanden om att det inte går att lösa Host OpenVPN-Server när du utför efterföljande kommandon. Uppdatering av filen /etc/hosts med lämpligt nytt värdnamn bör lösa problemet.

Förbereder din server för OpenVPN

För att installera OpenVPN på din server behöver du två paket: openvpn och easy-rsa (för att hantera processen för generering av krypteringsnyckel). CentOS-användare bör först installera epel-release-förvaret om det behövs, som du gjorde i kapitel 2. För att kunna testa åtkomsten till serverapplikationen kan du även installera Apache-webbservern (apache2 på Ubuntu och httpd på CentOS).

Medan du ställer in din server rekommenderar jag att du aktiverar en brandvägg som blockerar alla portar utom 22 (SSH) och 1194 (OpenVPNs standardport). Det här exemplet illustrerar hur ufw skulle fungera på Ubuntu, men jag är säker på att du fortfarande kommer ihåg CentOS-brandväggsprogrammet från kapitel 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

För att aktivera intern routing mellan nätverksgränssnitt på servern måste du avkommentera en rad (net.ipv4.ip_forward = 1) i filen /etc/sysctl.conf. Detta gör att fjärrklienter kan omdirigeras efter behov när de är anslutna. För att få det nya alternativet att fungera, kör sysctl -p:

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

Din servermiljö är nu helt konfigurerad, men det finns fortfarande en sak att göra innan du är redo: du måste slutföra följande steg (vi kommer att täcka dem i detalj härnäst).

  1. Skapa en uppsättning krypteringsnycklar för offentlig nyckelinfrastruktur (PKI) på servern med hjälp av skripten som medföljer easy-rsa-paketet. I huvudsak fungerar OpenVPN-servern också som sin egen certifikatutfärdare (CA).
  2. Förbered lämpliga nycklar för kunden
  3. Konfigurera server.conf-filen för servern
  4. Konfigurera din OpenVPN-klient
  5. Kontrollera ditt VPN

Genererar krypteringsnycklar

För att göra det enkelt kan du ställa in din nyckelinfrastruktur på samma maskin där OpenVPN-servern körs. Men bästa metoder för säkerhet föreslår vanligtvis att du använder en separat CA-server för produktionsinstallationer. Processen att generera och distribuera krypteringsnyckelresurser för användning i OpenVPN illustreras i Fig. 10.2.

Boken "Linux in Action"
När du installerade OpenVPN skapades katalogen /etc/openvpn/ automatiskt, men det finns inget i den ännu. Openvpn och easy-rsa-paketen kommer med exempel mallfiler som du kan använda som grund för din konfiguration. För att starta certifieringsprocessen, kopiera easy-rsa-mallkatalogen från /usr/share/ till /etc/openvpn och byt till easy-rsa/-katalogen:

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

Easy-rsa-katalogen kommer nu att innehålla en hel del skript. I tabell 10.1 listar de verktyg du kommer att använda för att skapa nycklar.

Boken "Linux in Action"

Ovanstående operationer kräver root-privilegier, så du måste bli root via sudo su.

Den första filen du kommer att arbeta med kallas vars och innehåller de miljövariabler som easy-rsa använder när nycklar genereras. Du måste redigera filen för att använda dina egna värden istället för standardvärdena som redan finns där. Så här kommer min fil att se ut (lista 10.1).

Notering 10.1. Huvudfragmenten 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"

Att köra vars-filen kommer att skicka dess värden till skalmiljön, där de kommer att inkluderas i innehållet i dina nya nycklar. Varför fungerar inte sudo-kommandot i sig? För i det första steget redigerar vi skriptet som heter vars och tillämpar det sedan. Att tillämpa och innebär att vars-filen skickar sina värden till skalmiljön, där de kommer att inkluderas i innehållet i dina nya nycklar.

Se till att köra filen igen med ett nytt skal för att slutföra den oavslutade processen. När detta är gjort kommer skriptet att uppmana dig att köra ett annat skript, clean-all, för att ta bort allt innehåll i katalogen /etc/openvpn/easy-rsa/keys/:

Boken "Linux in Action"
Naturligtvis är nästa steg att köra clean-all-skriptet, följt av build-ca, som använder pkitool-skriptet för att skapa rotcertifikatet. Du kommer att bli ombedd att bekräfta identitetsinställningarna som tillhandahålls av vars:

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

Därefter kommer build-key-server-skriptet. Eftersom det använder samma pkitool-skript tillsammans med ett nytt rotcertifikat, kommer du att se samma frågor för att bekräfta skapandet av nyckelparet. Nycklarna kommer att namnges baserat på argumenten du skickar, som, om du inte kör flera VPN på den här maskinen, vanligtvis kommer att vara server, som i exemplet:

# ./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 använder parametrar som genereras av Diffie-Hellman-algoritmen (med build-dh) för att förhandla om autentisering för nya anslutningar. Filen som skapas här behöver inte vara hemlig, utan måste genereras med skriptet build-dh för de RSA-nycklar som för närvarande är aktiva. Om du skapar nya RSA-nycklar i framtiden måste du också uppdatera Diffie-Hellman-filen:

# ./build-dh

Dina servernycklar kommer nu att hamna i katalogen /etc/openvpn/easy-rsa/keys/, men OpenVPN vet inte detta. Som standard kommer OpenVPN att leta efter nycklar i /etc/openvpn/, så kopiera 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

Förbereder klientkrypteringsnycklar

Som du redan har sett använder TLS-kryptering par av matchande nycklar: en installerad på servern och en installerad på fjärrklienten. Det betyder att du behöver klientnycklar. Vår gamla vän pkitool är precis vad du behöver för detta. I det här exemplet, när vi kör programmet i katalogen /etc/openvpn/easy-rsa/, skickar vi det klientargumentet för att generera filer som heter client.crt och client.key:

# ./pkitool client

De två klientfilerna, tillsammans med den ursprungliga ca.crt-filen som fortfarande finns i katalogen keys/, bör nu säkert överföras till din klient. På grund av deras ägande och åtkomsträttigheter är det kanske inte så lätt. Det enklaste tillvägagångssättet är att manuellt kopiera innehållet i källfilen (och inget annat än det innehållet) till en terminal som körs på din PC:s skrivbord (välj texten, högerklicka på den och välj Kopiera från menyn). Klistra sedan in detta i en ny fil med samma namn som du skapar i en andra terminal ansluten till din klient.

Men vem som helst kan klippa och klistra. Tänk istället som en administratör eftersom du inte alltid har tillgång till det grafiska användargränssnittet där det är möjligt att klippa/klistra in. Kopiera filerna till din användares hemkatalog (så att fjärr-scp-operationen kan komma åt dem) och använd sedan chown för att ändra ägandet av filerna från root till en vanlig icke-root-användare så att fjärr-scp-åtgärden kan utföras. Se till att alla dina filer för närvarande är installerade och tillgängliga. Du kommer att flytta dem till klienten lite senare:

# 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 en komplett uppsättning krypteringsnycklar redo att använda, måste du berätta för servern hur du vill skapa VPN. Detta görs med hjälp av filen server.conf.

Minska antalet tangenttryckningar

Är det för mycket att skriva? Expansion med parenteser hjälper till att reducera dessa sex kommandon till två. Jag är säker på att du kan studera dessa två exempel och förstå vad som händer. Ännu viktigare är att du kommer att kunna förstå hur man tillämpar dessa principer på operationer som involverar tiotals eller till och med hundratals element:

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

Konfigurera filen server.conf

Hur kan du veta hur server.conf-filen ska se ut? Kommer du ihåg easy-rsa-katalogmallen som du kopierade från /usr/share/? När du installerade OpenVPN stod du kvar med en komprimerad konfigurationsmallfil som du kan kopiera till /etc/openvpn/. Jag bygger vidare på det faktum att mallen är arkiverad och introducerar dig för ett användbart verktyg: zcat.

Du vet redan om att skriva ut textinnehållet i en fil på skärmen med kommandot cat, men vad händer om filen komprimeras med gzip? Du kan alltid packa upp filen och sedan matar cat gärna ut den, men det är ett eller två steg till än nödvändigt. Istället, som du kanske har gissat, kan du utfärda zcat-kommandot för att ladda den uppackade texten i minnet i ett steg. I följande exempel, istället för att skriva ut text till skärmen, kommer du att omdirigera den till en ny fil som heter server.conf:

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

Låt oss lägga undan den omfattande och användbara dokumentationen som följer med filen och se hur den kan se ut när du är klar med redigeringen. Observera att semikolon (;) talar om för OpenVPN att inte läsa eller köra nästa rad (listning 10.2).

Boken "Linux in Action"
Låt oss gå igenom några av dessa inställningar.

  • Som standard körs OpenVPN på port 1194. Du kan ändra detta, till exempel för att ytterligare dölja dina aktiviteter eller undvika konflikter med andra aktiva tunnlar. Eftersom 1194 kräver minimal samordning med kunder är det bäst att göra det på detta sätt.
  • OpenVPN använder antingen Transmission Control Protocol (TCP) eller User Datagram Protocol (UDP) för att överföra data. TCP kan vara lite långsammare, men det är mer tillförlitligt och mer sannolikt att det förstås av program som körs i båda ändar av tunneln.
  • Du kan ange dev tun när du vill skapa en enklare, effektivare IP-tunnel som bär datainnehåll och inget annat. Om du å andra sidan behöver ansluta flera nätverksgränssnitt (och de nätverk de representerar), skapa en Ethernet-brygga, måste du välja dev tap. Om du inte förstår vad allt detta betyder, använd tun-argumentet.
  • De nästa fyra raderna ger OpenVPN namnen på de tre autentiseringsfilerna på servern och dh2048-alternativfilen som du skapade tidigare.
  • Serverraden ställer in intervallet och subnätmasken som kommer att användas för att tilldela IP-adresser till klienter vid inloggning.
  • Den valfria push-parametern "route 10.0.3.0 255.255.255.0" tillåter fjärrklienter att komma åt privata subnät bakom servern. För att få detta att fungera krävs också att nätverket ställs in på själva servern så att det privata subnätet känner till OpenVPN-subnätet (10.8.0.0).
  • Port-share localhost 80-linjen låter dig omdirigera klienttrafik som kommer på port 1194 till en lokal webbserver som lyssnar på port 80. (Detta kommer att vara användbart om du ska använda webbservern för att testa ditt VPN.) Detta fungerar bara sedan när tcp-protokollet är valt.
  • Användaren ingen och grupp-noggruppraderna måste aktiveras genom att ta bort semikolon (;). Att tvinga fjärrklienter att köra som ingen och ingen grupp säkerställer att sessioner på servern är oprivilegierade.
  • log anger att nuvarande loggposter kommer att skriva över gamla poster varje gång OpenVPN startas, medan log-append lägger till nya poster till den befintliga loggfilen. Själva filen openvpn.log skrivs till katalogen /etc/openvpn/.

Dessutom läggs ofta ett klient-till-klient-värde till i konfigurationsfilen så att flera klienter kan se varandra förutom OpenVPN-servern. Om du är nöjd med din konfiguration kan du starta OpenVPN-servern:

# systemctl start openvpn

På grund av att förhållandet mellan OpenVPN och systemd förändras, kan följande syntax ibland krävas för att starta en tjänst: systemctl start openvpn@server.

Att köra ip-addr för att lista din servers nätverksgränssnitt bör nu mata ut en länk till ett nytt gränssnitt som heter tun0. OpenVPN kommer att skapa det för att betjäna inkommande 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 kan behöva starta om servern innan allt börjar fungera fullt ut. Nästa stopp är klientdatorn.

10.1.2. Konfigurera OpenVPN-klienten

Traditionellt byggs tunnlar med minst två utgångar (annars skulle vi kalla dem grottor). En korrekt konfigurerad OpenVPN på servern leder trafik in och ut ur tunneln på ena sidan. Men du kommer också att behöva lite mjukvara som körs på klientsidan, det vill säga i andra änden av tunneln.

I det här avsnittet kommer jag att fokusera på att manuellt ställa in någon typ av Linux-dator för att fungera som en OpenVPN-klient. Men detta är inte det enda sättet på vilket denna möjlighet finns. OpenVPN stöder klientapplikationer som kan installeras och användas på stationära och bärbara datorer som kör Windows eller macOS, samt Android och iOS smartphones och surfplattor. Se openvpn.net för detaljer.

OpenVPN-paketet kommer att behöva installeras på klientdatorn eftersom det installerades på servern, även om det inte finns något behov av easy-rsa här eftersom nycklarna du använder redan finns. Du måste kopiera mallfilen client.conf till katalogen /etc/openvpn/ som du just skapade. Den här gången kommer filen inte att zippas, så det vanliga cp-kommandot kommer att göra jobbet bra:

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

De flesta av inställningarna i din client.conf-fil kommer att vara ganska självförklarande: de bör matcha värdena på servern. Som du kan se från följande exempelfil är den unika parametern fjärr 192.168.1.23 1194, som talar om för klienten serverns IP-adress. Återigen, se till att detta är din serveradress. Du bör också tvinga klientdatorn att verifiera servercertifikatets äkthet för att förhindra en möjlig man-in-the-middle-attack. Ett sätt att göra detta är att lägga till raden remote-cert-tls-servern (Listing 10.3).

Boken "Linux in Action"
Du kan nu gå till katalogen /etc/openvpn/ och extrahera certifieringsnycklarna från servern. Ersätt serverns IP-adress eller domännamn i exemplet med dina värden:

Boken "Linux in Action"
Inget spännande kommer sannolikt att hända förrän du kör OpenVPN på klienten. Eftersom du behöver skicka ett par argument, gör du det från kommandoraden. Argumentet --tls-client talar om för OpenVPN att du kommer att agera som en klient och ansluta via TLS-kryptering, och --config pekar på din konfigurationsfil:

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

Läs kommandot noggrant för att se till att du är korrekt ansluten. Om något går fel första gången kan det bero på att inställningarna inte överensstämmer mellan serverns och klientens konfigurationsfiler eller ett problem med nätverksanslutning/brandvägg. Här är några felsökningstips.

  • Läs noggrant utdata från OpenVPN-operationen på klienten. Den innehåller ofta värdefulla råd om vad som inte går att göra och varför.
  • Kontrollera felmeddelandena i filerna openvpn.log och openvpn-status.log i katalogen /etc/openvpn/ på servern.
  • Kontrollera systemloggarna på servern och klienten för OpenVPN-relaterade och tidsinställda meddelanden. (journalctl -ce visar de senaste posterna.)
  • Se till att du har en aktiv nätverksanslutning mellan servern och klienten (mer om detta i kapitel 14).

Om författaren

David Clinton - systemadministratör, lärare och skribent. Han har administrerat, skrivit om och skapat utbildningsmaterial för många viktiga tekniska discipliner, inklusive Linux-system, cloud computing (särskilt AWS) och containerteknologier som Docker. Han skrev boken Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Många av hans videokurser finns på Pluralsight.com, och länkar till hans andra böcker (om Linux-administration och servervirtualisering) finns på bootstrap-it.com.

» Mer information om boken finns på förlagets webbplats
» innehållsförteckning
» Utdrag

För Khabrozhiteley 25% rabatt med kupong - Linux
Vid betalning av pappersversionen av boken skickas en elektronisk bok via e-post.

Källa: will.com

Lägg en kommentar