Förstärk säkerheten för SSH-anslutningen till ditt Linux-system för att skydda både systemet och din data. Både systemadministratörer och hemanvändare behöver skydda datorer som är uppkopplade mot internet. Att konfigurera SSH kan dock vara invecklat. Här är tio lättimplementerade åtgärder för att öka säkerheten för din SSH-server.
Grundläggande SSH-säkerhet
SSH står för Secure Shell. Termen ”SSH” används ofta för att beteckna antingen själva SSH-protokollet eller de programvaruverktyg som gör det möjligt för systemadministratörer och användare att etablera säkra anslutningar till fjärrdatorer via detta protokoll.
SSH-protokollet är ett krypterat protokoll utformat för att skapa en säker anslutning över osäkra nätverk, såsom internet. I Linux är SSH baserat på en portabel version av OpenSSH-projektet. Det är implementerat i en klassisk klient-servermodell, där en SSH-server accepterar anslutningar från SSH-klienter. Klienten används för att koppla upp sig mot servern och presentera sessionen för fjärranvändaren. Servern accepterar anslutningen och hanterar sessionen.
Som standard lyssnar en SSH-server efter inkommande anslutningar på port 22 via TCP. Eftersom detta är en standardiserad och välkänd port, blir den ofta ett mål för hotaktörer och skadliga botar.
Hotaktörer skickar ut botar som skannar ett antal IP-adresser och söker efter öppna portar. Dessa portar undersöks sedan för att upptäcka eventuella sårbarheter som kan utnyttjas. Att tänka ”Jag är säker, det finns större och bättre mål än mig för de onda att rikta in sig på” är felaktigt. Botar väljer inte mål baserat på meriter; de letar systematiskt efter system som de kan kompromettera.
Du gör dig själv till ett potentiellt offer om du inte har säkrat ditt system.
Säkerhetsfriktion
Säkerhetsfriktion avser den irritation – oavsett omfattning – som användare och andra kan uppleva när säkerhetsåtgärder implementeras. Vi minns hur nya användare av ett datorsystem frågade, med förskräckelse i rösten, om de verkligen var tvungna att ange ett lösenord varje gång de loggade in på stordatorn. Det – för dem – var säkerhetsfriktion.
(Förresten, uppfinningen av lösenordet tillskrivs Fernando J. Corbató, en framstående datavetare vars arbete bidrog till de omständigheter som ledde till skapandet av Unix.)
Att införa säkerhetsåtgärder innebär i regel någon form av friktion för någon. Företagsledare måste betala för det. Datoranvändare kan behöva anpassa sina vanliga metoder, memorera ytterligare autentiseringsuppgifter eller vidta extra åtgärder för att ansluta framgångsrikt. Systemadministratörer får extra arbete med att implementera och underhålla de nya säkerhetsåtgärderna.
Att härda och skydda ett Linux- eller Unix-liknande operativsystem kan snabbt bli mycket komplicerat. Det vi presenterar här är en uppsättning enkla steg som förbättrar din dators säkerhet utan att använda programvara från tredje part och utan att gräva djupt i din brandvägg.
Dessa steg är inte den slutgiltiga lösningen för SSH-säkerhet, men de tar dig långt från standardinställningarna och utan alltför stor friktion.
Använd SSH protokoll version 2
År 2006 uppdaterades SSH-protokollet från version 1 till version 2. Detta var en betydande uppgradering, med så många ändringar och förbättringar, särskilt inom kryptering och säkerhet, att version 2 inte är bakåtkompatibel med version 1. För att förhindra anslutningar från version 1-klienter kan du konfigurera din dator att endast acceptera anslutningar från version 2-klienter.
För att göra det, redigera filen `/etc/ssh/sshd_config`. Vi kommer att göra detta flera gånger i den här artikeln. När du behöver redigera den här filen, använd följande kommando:
sudo gedit /etc/ssh/sshd_config
Lägg till raden:
Protocol 2
Spara filen. Vi kommer nu att starta om SSH-demontjänsten. Återigen kommer vi att göra detta flera gånger i den här artikeln. Använd följande kommando:
sudo systemctl restart sshd
Låt oss kontrollera att vår nya inställning har trätt i kraft. Vi byter till en annan dator och försöker ansluta till vår testdator via SSH. Vi använder alternativet `-1` (protokoll 1) för att tvinga SSH-kommandot att använda protokollversion 1.
ssh -1 [email protected]
Bra, vår anslutningsförfrågan avvisas. Låt oss se till att vi fortfarande kan ansluta med protokoll 2. Vi använder alternativet `-2` (protokoll 2) för att verifiera detta.
ssh -2 [email protected]
Det faktum att SSH-servern begär vårt lösenord indikerar att anslutningen har upprättats och att du interagerar med servern. Eftersom moderna SSH-klienter som standard använder protokoll 2, behöver vi inte ange protokoll 2 så länge vår klient är uppdaterad.
ssh [email protected]
Och vår anslutning accepteras. Endast de svagare och mindre säkra protokoll 1-anslutningarna avvisas.
Undvik port 22
Port 22 är standardporten för SSH-anslutningar. Att använda en annan port ger lite extra säkerhet genom otydlighet till ditt system. Säkerhet genom otydlighet anses sällan vara en riktig säkerhetsåtgärd, och jag har kritiserat det i andra artiklar. Faktum är att vissa mer sofistikerade attackbotar skannar alla öppna portar och identifierar deras tjänst, istället för att förlita sig på en enkel uppslagslista över portar och anta att de tillhandahåller de vanliga tjänsterna. Att använda en icke-standardport kan dock hjälpa till att minska onödig trafik på port 22.
För att konfigurera en icke-standardport, redigera din SSH-konfigurationsfil:
sudo gedit /etc/ssh/sshd_config
Ta bort hash-tecknet `#` i början av ”Port”-raden och ersätt ”22” med det portnummer du väljer. Spara din konfigurationsfil och starta om SSH-demonen:
sudo systemctl restart sshd
Låt oss se vilken effekt detta har haft. På vår andra dator använder vi SSH-kommandot för att ansluta till vår server. SSH-kommandot använder som standard port 22:
ssh [email protected]
Vår anslutning avvisas. Låt oss försöka igen och ange port 479 med alternativet `-p` (port):
ssh -p 479 [email protected]
Vår anslutning accepteras.
Filtrera anslutningar med TCP Wrappers
TCP Wrappers är en lättförståelig åtkomstkontrollista. Med den kan du blockera och tillåta anslutningar baserat på anslutningsförfrågans egenskaper, som IP-adress eller värdnamn. TCP Wrappers bör användas tillsammans med, och inte istället för, en korrekt konfigurerad brandvägg. I vårt specifika fall kan vi strama åt säkerheten betydligt med TCP Wrappers.
TCP Wrappers var redan installerat på Ubuntu 18.04 LTS-maskinen som användes vid framtagningen av den här artikeln. Det måste installeras på Manjaro 18.10 och Fedora 30.
För att installera på Fedora, använd följande kommando:
sudo yum install tcp_wrappers
För att installera på Manjaro, använd följande kommando:
sudo pacman -Syu tcp-wrappers
Det är två filer som är inblandade. Den ena har en lista över tillåtna anslutningar och den andra har en lista över nekade anslutningar. Redigera den nekade listan med följande kommando:
sudo gedit /etc/hosts.deny
Detta öppnar gedit-redigeraren med deny-filen.
Du behöver lägga till raden:
ALL : ALL
Och spara filen. Detta blockerar all åtkomst som inte har godkänts. Nu måste vi godkänna de anslutningar du vill acceptera. För att göra det måste du redigera filen `allow`:
sudo gedit /etc/hosts.allow
Detta öppnar gedit-redigeraren med allow-filen.
Vi har lagt till namnet på SSH-demonen, sshd, och IP-adressen för den dator vi vill tillåta att ansluta. Spara filen och låt oss se om begränsningarna och tillåtelserna har trätt i kraft.
Först försöker vi ansluta från en dator som inte finns med i filen hosts.allow:
Anslutningen avvisas. Nu ska vi försöka ansluta från maskinen med IP-adress 192.168.4.23:
Vår anslutning accepteras.
Vårt exempel här är ganska strängt – endast en enda dator kan ansluta. TCP Wrappers är ganska mångsidig och mer flexibel än så här. Den stöder värdnamn, jokertecken och subnätmasker för att acceptera anslutningar från olika IP-adresser. Vi uppmanar dig att kolla in man-sidan.
Avvisa anslutningsförfrågningar utan lösenord
Även om det är en dålig vana kan en Linux-systemadministratör skapa ett användarkonto utan lösenord. Det innebär att fjärranslutningsförfrågningar från det kontot inte har något lösenord att kontrolleras mot. Dessa anslutningar kommer att accepteras, men utan autentisering.
Standardinställningarna för SSH accepterar anslutningsförfrågningar utan lösenord. Vi kan enkelt ändra detta och säkerställa att alla anslutningar autentiseras.
Vi måste redigera din SSH-konfigurationsfil:
sudo gedit /etc/ssh/sshd_config
Bläddra igenom filen tills du ser raden med texten ”#PermitEmptyPasswords no.” Ta bort hash-tecknet `#` i början av raden och spara filen. Starta om SSH-demonen:
sudo systemctl restart sshd
Använd SSH-nycklar istället för lösenord
SSH-nycklar erbjuder ett säkert sätt att logga in på en SSH-server. Lösenord kan gissas, knäckas eller utsättas för brute-force-attacker. SSH-nycklar är inte lika sårbara för sådana angrepp.
När du genererar SSH-nycklar skapar du ett nyckelpar. Den ena är den publika nyckeln och den andra är den privata nyckeln. Den publika nyckeln installeras på de servrar du vill ansluta till. Den privata nyckeln, som namnet antyder, förvaras säkert på din egen dator.
SSH-nycklar gör det möjligt att upprätta anslutningar utan lösenord som – kontraintuitivt – är säkrare än anslutningar som använder lösenordsautentisering.
När du skickar en anslutningsförfrågan använder fjärrdatorn sin kopia av din publika nyckel för att skapa ett krypterat meddelande som skickas tillbaka till din dator. Eftersom det krypterades med din publika nyckel kan din dator dekryptera det med din privata nyckel.
Din dator extraherar sedan information från meddelandet, särskilt sessions-ID, krypterar det och skickar det tillbaka till servern. Om servern kan dekryptera det med sin kopia av din publika nyckel, och om informationen i meddelandet matchar den som servern skickade till dig, bekräftas att din anslutning kommer från dig.
Här visas en anslutning till servern på 192.168.4.11, av en användare som använder SSH-nycklar. Observera att användaren inte ombeds att ange ett lösenord.
ssh [email protected]
SSH-nycklar är ett ämne för en helt egen artikel. Praktiskt nog har vi en sådan artikel. Läs den för att lära dig hur du skapar och installerar SSH-nycklar.
Inaktivera lösenordsautentisering helt
En logisk förlängning av att använda SSH-nycklar är att, om alla fjärranvändare tvingas använda dem, kan du stänga av lösenordsautentiseringen helt och hållet.
Vi måste redigera din SSH-konfigurationsfil:
sudo gedit /etc/ssh/sshd_config
Bläddra igenom filen tills du ser raden som börjar med ”#PasswordAuthentication yes.” Ta bort hash-tecknet `#` i början av raden, ändra ”yes” till ”no” och spara filen. Starta om SSH-demonen:
sudo systemctl restart sshd
Inaktivera X11-vidarebefordran
Med X11-vidarebefordran kan fjärranvändare köra grafiska applikationer från din server via en SSH-session. Om det används av en hotaktör eller en illvillig användare kan ett grafiskt användargränssnitt underlätta deras skadliga avsikter.
En standardregel inom cybersäkerhet är att om du inte har en god anledning att ha den påslagen, stäng av den. Vi gör det genom att redigera din SSH-konfigurationsfil:
sudo gedit /etc/ssh/sshd_config
Bläddra igenom filen tills du ser raden som börjar med ”#X11Forwarding no.” Ta bort hash-tecknet `#` i början av raden och spara filen. Starta om SSH-demonen:
sudo systemctl restart sshd
Ange en inaktiv timeout
Om det finns en etablerad SSH-anslutning till din dator, och det inte har varit någon aktivitet under en viss tid, kan det utgöra en säkerhetsrisk. Det finns en risk att användaren har lämnat sitt skrivbord och är upptagen någon annanstans. Andra som går förbi kan sätta sig vid datorn och börja använda den och, via SSH, din dator.
Det är mycket säkrare att ange en tidsgräns. SSH-anslutningen kommer att stängas om den inaktiva perioden motsvarar tidsgränsen. Återigen redigerar vi din SSH-konfigurationsfil:
sudo gedit /etc/ssh/sshd_config
Bläddra igenom filen tills du ser raden som börjar med ”#ClientAliveInterval 0”. Ta bort hash-tecknet `#` i början av raden, ändra siffran 0 till det önskade värdet. Vi har använt 300 sekunder, vilket är 5 minuter. Spara filen och starta om SSH-demonen:
sudo systemctl restart sshd
Ange en gräns för antalet lösenordsförsök
Att ange en gräns för antalet autentiseringsförsök kan hjälpa till att motverka lösenordsgissning och brute-force-attacker. Efter det angivna antalet autentiseringsförsök kopplas användaren bort från SSH-servern. Som standard finns det ingen gräns. Men det är lätt att åtgärda.
Återigen måste vi redigera din SSH-konfigurationsfil:
sudo gedit /etc/ssh/sshd_config
Bläddra igenom filen tills du ser raden som börjar med ”#MaxAuthTries 0”. Ta bort hash-tecknet `#` i början av raden, ändra siffran 0 till det önskade värdet. Vi har använt 3 här. Spara filen när du har gjort dina ändringar och starta om SSH-demonen:
sudo systemctl restart sshd
Vi kan testa det här genom att försöka ansluta och avsiktligt ange fel lösenord.
Observera att MaxAuthTries-numret verkar vara ett mer än antalet försök som användaren tillåts. Efter två felaktiga försök kopplas vår testanvändare bort. Detta gjordes med MaxAuthTries inställt på tre.
Inaktivera root-inloggningar
Det är dålig vana att logga in som root på din Linux-dator. Du bör logga in som en vanlig användare och använda sudo för att utföra åtgärder som kräver root-behörighet. Du bör inte heller tillåta root att logga in på din SSH-server. Endast vanliga användare ska tillåtas ansluta. Om de behöver utföra en administrativ uppgift bör de också använda sudo. Om du tvingas tillåta en root-användare att logga in kan du åtminstone tvinga dem att använda SSH-nycklar.
För sista gången kommer vi att behöva redigera din SSH-konfigurationsfil:
sudo gedit /etc/ssh/sshd_config
Bläddra igenom filen tills du ser raden som börjar med ”#PermitRootLogin prohibit-password”. Ta bort hash-tecknet `#` i början av raden.
Om du helt vill hindra root från att logga in, ersätt ”prohibit-password” med ”no”.
Om du ska tillåta root att logga in, men tvinga dem att använda SSH-nycklar, låt ”prohibit-password” vara kvar.
Spara dina ändringar och starta om SSH-demonen:
sudo systemctl restart sshd
Det slutgiltiga steget
Om du inte behöver SSH på din dator överhuvudtaget, se till att den är inaktiverad.
sudo systemctl stop sshd
sudo systemctl disable sshd
Om du inte öppnar fönstret kan ingen klättra in.