Hur man använder portknackning på Linux (och varför du inte borde)

Portknackning är ett sätt att säkra en server genom att stänga brandväggsportar – även de du vet kommer att användas. Dessa portar öppnas på begäran om – och endast om – anslutningsbegäran ger den hemliga knackningen.

Hamnknackning är en ”hemlig knackning”

På 1920-talet, när förbud var i full gång, om du ville komma in i en lönnkrog, du var tvungen att känna till den hemliga knackningen och knacka ut den korrekt för att komma in.

Babordsknackning är en modern motsvarighet. Om du vill att folk ska ha tillgång till tjänster på din dator men inte vill öppna din brandvägg mot internet kan du använda portknackning. Det låter dig stänga portarna på din brandvägg som tillåter inkommande anslutningar och få dem att öppna automatiskt när ett förutbestämt mönster av anslutningsförsök görs. Sekvensen av anslutningsförsök fungerar som den hemliga knackningen. Ytterligare en hemlig knackning stänger hamnen.

Babord knackning är något av en nyhet, men det är viktigt att veta att det är ett exempel på säkerhet genom dunkel, och det konceptet är i grunden felaktigt. Hemligheten med hur man kommer åt ett system är säker eftersom bara de i en specifik grupp känner till det. Men när den hemligheten väl är klar – antingen för att den har avslöjats, observerats, gissat eller utarbetats – är din säkerhet ogiltig. Du är bättre att säkra din server på andra, starkare sätt, som att kräva nyckelbaserade inloggningar för en SSH-server.

De mest robusta tillvägagångssätten för cybersäkerhet är flerskiktiga, så kanske hamnknackning borde vara ett av dessa lager. Ju fler lager, desto bättre, eller hur? Du kan dock hävda att portknackning inte tillför mycket (om något) till ett ordentligt härdat, säkert system.

Cybersäkerhet är ett stort och komplicerat ämne, men du bör inte använda hamnknackning som din enda form av försvar.

Installerar knockd

För att demonstrera portknackning kommer vi att använda den för att styra port 22, som är SSH-porten. Vi använder ett verktyg som kallas knockd. Använd apt-get för att installera det här paketet på ditt system om du använder Ubuntu eller en annan Debian-baserad distribution. På andra Linux-distributioner, använd din Linux-distributions pakethanteringsverktyg istället.

Skriv följande:

sudo apt-get install knockd

Du har förmodligen redan iptables brandvägg installerat på ditt system, men du kan behöva installera paketet iptables-persistent. Den hanterar den automatiska laddningen av sparade iptable-regler.

Skriv följande för att installera det:

sudo apt-get install iptables-persistent

När IPV4-konfigurationsskärmen visas trycker du på mellanslagstangenten för att acceptera alternativet ”Ja”.

Tryck på mellanslagstangenten för att acceptera

Tryck på mellanslagstangenten igen på IPv6-konfigurationsskärmen för att acceptera alternativet ”Ja” och gå vidare.

Tryck på mellanslagstangenten för att acceptera

Följande kommando säger åt iptables att tillåta etablerade och pågående anslutningar att fortsätta. Vi kommer nu att utfärda ett annat kommando för att stänga SSH-porten.

Om någon är ansluten av SSH när vi utfärdar detta kommando, vill vi inte att de ska skäras av:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Detta kommando lägger till en regel till brandväggen, som säger:

-S: Lägg till regeln i brandväggsregeltabellen. Det vill säga lägg till den längst ner.
INPUT: Detta är en regel om inkommande anslutningar.
-m conntrack: Brandväggsregler verkar på nätverkstrafik (paket) som matchar kriterierna i regeln. Parametern -m gör att iptables använder extra paketmatchningsmoduler – i det här fallet fungerar den som kallas conntrack med kärnans spårningsfunktioner för nätverksanslutning.
–cstate ESTABLISHED,RELATED: Detta anger vilken typ av anslutning som regeln ska gälla för, nämligen ETABLISHED och RELATED anslutningar. En etablerad anslutning är en som redan pågår. En relaterad anslutning är en som skapas på grund av en åtgärd från en etablerad anslutning. Kanske någon som är uppkopplad vill ladda ner en fil; som kan hända över en ny anslutning initierad av värden.
-j ACCEPT: Om trafiken matchar regeln, hoppa till ACCEPT-målet i brandväggen. Med andra ord, trafiken accepteras och tillåts passera genom brandväggen.

Nu kan vi utfärda kommandot för att stänga porten:

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Detta kommando lägger till en regel till brandväggen, som säger:

-S: Lägg till regeln i brandväggsregeltabellen, dvs lägg till den längst ner.
INPUT: Denna regel handlar om inkommande anslutningar.
-p tcp: Denna regel gäller för trafik som använder Transmission Control Protocol.
–dport 22: Denna regel gäller specifikt för TCP-trafik som är inriktad på port 22 (SSH-porten).
-j AVVISA: Om trafiken matchar regeln, hoppa till REJECT-målet i brandväggen. Så om trafiken avvisas är den inte tillåten genom brandväggen.

Vi måste starta den netfilter-beständiga demonen. Vi kan göra det med detta kommando:

sudo systemctl start netfilter-persistent

Vi vill att nätfilterbeständiga ska gå igenom en cykel för att spara och ladda om, så den laddar och kontrollerar iptable-reglerna.

Skriv följande kommandon:

sudo netfilter-persistent save

sudo netfilter-persistent reload

Du har nu installerat verktygen och SSH-porten är stängd (förhoppningsvis utan att avsluta någons anslutning). Nu är det dags att konfigurera den hemliga knackningen.

Konfigurerar knockd

Det finns två filer du redigerar för att konfigurera knockd. Den första är följande knockd-konfigurationsfil:

sudo gedit /etc/knockd.conf

Gedit-redigeraren öppnas med knockd-konfigurationsfilen laddad.

Vi kommer att redigera den här filen så att den passar våra behov. De sektioner vi är intresserade av är ”openSSH” och ”closeSSH.” Följande fyra poster finns i varje avsnitt:

sekvens: Sekvensen av portar som någon måste komma åt för att öppna eller stänga port 22. Standardportarna är 7000, 8000 och 9000 för att öppna den, och 9000, 8000 och 7000 för att stänga den. Du kan ändra dessa eller lägga till fler portar i listan. För våra syften kommer vi att hålla fast vid standardinställningarna.
seq_timeout: Tidsperioden inom vilken någon måste komma åt portarna för att utlösa den att öppna eller stänga.
kommando: Kommandot som skickas till iptables brandvägg när åtgärden öppna eller stänga utlöses. Dessa kommandon lägger antingen till en regel till brandväggen (för att öppna porten) eller ta bort den (för att stänga porten).
tcpflags: Typen av paket varje port måste ta emot i den hemliga sekvensen. Ett SYN (synkronisera) paket är det första i en TCP anslutningsbegäran, kallad en trevägshandslag.

Avsnittet ”openSSH” kan läsas som ”en TCP-anslutningsbegäran måste göras till portarna 7000, 8000 och 9000 – i den ordningen och inom 5 sekunder – för att kommandot för att öppna port 22 ska skickas till brandväggen.”

Avsnittet ”closeSSH” kan läsas som ”en TCP-anslutningsbegäran måste göras till portarna 9000, 8000 och 7000 – i den ordningen och inom 5 sekunder – för att kommandot för att stänga port 22 ska skickas till brandväggen.”

Brandväggsreglerna

”Kommando”-posterna i sektionerna openSSH och closeSSH förblir desamma, förutom en parameter. Så här är de sammansatta:

-A: Lägg till regeln längst ned i brandväggsregellistan (för openSSH-kommandot).
-D: Ta bort kommandot från brandväggsregellistan (för kommandot closeSSH).
INPUT: Denna regel avser inkommande nätverkstrafik.
-s %IP%: IP-adressen för enheten som begär en anslutning.
-p: Nätverksprotokoll; i det här fallet är det TCP.
–dport: Destinationsporten; i vårt exempel är det port 22.
-j ACCEPTERA: Hoppa till det accepterade målet inom brandväggen. Med andra ord, låt paketet gå igenom resten av reglerna utan att agera på det.

The knockd konfigurationsfilredigeringar

Redigeringarna vi gör i filen är markerade i rött nedan:

Vi förlänger ”seq_timeout” till 15 sekunder. Detta är generöst, men om någon manuellt skjuter i anslutningsförfrågningar kan han behöva så mycket tid.

I avsnittet ”openSSH” ändrar vi alternativet -A (lägg till) i kommandot till -I (infoga). Detta kommando infogar en ny brandväggsregel högst upp i brandväggsregellistan. Om du lämnar alternativet -A, lägger det till brandväggsregellistan och placerar den längst ner.

Inkommande trafik testas mot varje brandväggsregel i listan uppifrån och ner. Vi har redan en regel som stänger port 22. Så om inkommande trafik testas mot den regeln innan den ser regeln som tillåter trafiken, nekas anslutningen; om den ser den här nya regeln först är anslutningen tillåten.

Close-kommandot tar bort regeln som lagts till av openSSH från brandväggsreglerna. SSH-trafik hanteras återigen av den redan existerande regeln ”port 22 är stängd”.

När du har gjort dessa ändringar sparar du konfigurationsfilen.

The knockd Control File Edits

Knockd-kontrollfilen är helt enklare. Innan vi dyker in och redigerar det måste vi dock veta det interna namnet för vår nätverksanslutning; för att hitta det, skriv detta kommando:

ip addr

De

Anslutningen som den här maskinen använder för att undersöka den här artikeln kallas enp0s3. Anteckna namnet på din anslutning.

Följande kommando redigerar knockd-kontrollfilen:

sudo gedit /etc/default/knockd

Här är knockd-filen i gedit.

De få redigeringar vi behöver göra är markerade i rött:

Vi ändrade ”START_KNOCKD=”-posten till från 0 till 1.

Vi tog också bort hash # från början av ”KNOCKD_OPTS=”-posten och ersatte ”eth1” med namnet på vår nätverksanslutning, enp0s3. Om din nätverksanslutning är eth1 kommer du naturligtvis inte att ändra den.

Beviset finns i puddingen

Det är dags att se om detta fungerar. Vi startar knockd-demonen med detta kommando:

sudo systemctrl start knockd

Nu ska vi hoppa på en annan maskin och försöka ansluta. Vi installerade knockd-verktyget på den datorn också, inte för att vi vill ställa in portknackning, utan för att knockd-paketet tillhandahåller ett annat verktyg som kallas knock. Vi kommer att använda den här maskinen för att skjuta i vår hemliga sekvens och göra knackningen åt oss.

Använd följande kommando för att skicka din hemliga sekvens av anslutningsförfrågningar till portarna på den portknackade värddatorn med IP-adressen 192.168.4.24:

knock 192.168.4.24 7000 8000 9000 -d 500

Detta säger till knock att rikta in datorn på IP-adress 192.168.4.24 och skicka en anslutningsbegäran till portarna 7000, 8000 och 9000, i sin tur, med en -d (fördröjning) på 500 millisekunder mellan dem.

En användare som heter ”dave” gör sedan en SSH-begäran till 192.168.4.24:

ssh [email protected]

Hans anslutning accepteras, han anger sitt lösenord och hans fjärrsession börjar. Hans kommandoprompt ändras från [email protected] till [email protected] För att logga ut från fjärrdatorn skriver han:

exit

Hans kommandoprompt återgår till hans lokala dator. Han använder knackning en gång till, och den här gången riktar den sig mot portarna i omvänd ordning för att stänga SSH-porten på fjärrdatorn.

knock 192.168.4.24 9000 8000 7000 -d 500

Visserligen var det här inte en särskilt fruktbar fjärrsession, men den demonstrerar öppning och stängning av porten via portknackning och passar i en enda skärmdump.

Så, hur såg det här ut från andra sidan? Systemadministratören på portknackningsvärden använder följande kommando för att se nya poster som kommer in i systemloggen:

tail -f /var/log/syslog

Du ser tre openSSH-poster. Dessa höjs när varje port riktas mot fjärrknackverktyget.
När alla tre stegen i triggersekvensen är uppfyllda visas en post som säger ”SESAM ÖPPNA DIG,” loggas
Kommandot för att infoga regeln i iptables-regellistan skickas. Den tillåter åtkomst via SSH på port 22 från den specifika IP-adressen för datorn som gav rätt hemlig knackning (192.168.4.23).
Användaren ”dave” ansluter bara i några sekunder och kopplar sedan från.
Du ser tre closeSSH-poster. Dessa höjs när varje port riktas mot av fjärrknackningsverktyget – det säger åt portknackvärden att stänga port 22.
Efter att alla tre stegen har utlösts får vi meddelandet ”OPEN SESAME” igen. Kommandot skickas till brandväggen för att ta bort regeln. (Varför inte ”STÄNG SESAME” när den stänger hamnen? Vem vet?)

Nu är den enda regeln i iptables-regellistan angående port 22 den vi skrev i början för att stänga den porten. Så, port 22 är nu stängd igen.

Slå det på huvudet

Det är hamnknackningens salongstrick. Behandla det som en avledning och gör det inte i den verkliga världen. Eller, om du måste, lita inte på det som din enda form av säkerhet.