Met Raspberry Pi port knocking de computers in je netwerk beveiligen

Wanneer iemand een computer of server aansluit op het openbare internet, worden deze al snel een doelwit voor hackers. Sommige onderzoekers beweren dat hackers gemiddeld elke drie minuten openbare IP-adressen scannen.  

Gelukkig zijn er verschillende manieren om een pc of server te beschermen. Een voorbeeld hiervan is port knocking met een Raspberry Pi, een soort digitaal verstoppertje. In deze workshop zullen we meer uitleggen over dit interessante Raspberry Pi Project en hoe je kunt beginnen met port knocking in combinatie met een Raspberry Pi.

Met Raspberry Pi port knocking de computers in je netwerk beveiligen

Raspberry Pi port knocking als alternatief voor VPN

Veel ontwikkelaars en beheerders maken gebruik van VPN’s of vergelijkbare systemen om gevoelige knooppunten te beschermen achter een beveiligde verbinding. Maar het gebruik van VPN’s is vaak complex. Bovendien zijn deze VPN-poorten een aantrekkelijk doelwit voor aanvallers.

Een alternatief is port knocking. Dit is een methode waarbij een systeem op een onopvallende poort op een verbindingspoging wacht. Als de juiste parameters worden ingevoerd, gaat het systeem ervan uit dat het een geauthenticeerde externe verbinding is en geeft toegang tot de daadwerkelijke poort. Met Knockd kan port knocking ook op een Raspberry Pi worden geïmplementeerd. De software biedt een gemakkelijke manier om diensten veilig te configureren.

De populariteit en het feit dat er een Linux-besturingssysteem op draait, spreken voor het gebruik van een Raspberry Pi. Een klassieke wifi Ethernet-router dient als hub waarop verschillende apparaten kunnen worden aangesloten. Als besturingssysteem wordt Debian Bullseye gebruikt; de releaseversie is van september 2022.

Portknocking als extra beveiliging

Het gebruik van port knocking als beveiligingsmaatregel is een voorbeeld van het concept “Security through obscurity”. Het is belangrijk om te beseffen dat deze methode slechts een extra laag van beveiliging biedt voor diensten die al op een zo veilig mogelijke manier zijn geconfigureerd. Het is ook van groot belang om te realiseren dat de implementatie van port knocking zelf geen oplossing is voor eventuele beveiligingsproblemen. Als een aanvaller bijvoorbeeld de daemon van buitenaf kan neerhalen, kan dit leiden tot offline brengen van het gehele systeem.

Een waarschuwing is op zijn plaats over het gebruik van port knocking in combinatie met “kill-lists” (lijsten van IP-adressen die moeten worden geblokkeerd), vaak toegepast op internet. Hiermee worden inkomende pakketten van niet-geautoriseerde systemen gebruikt als indicatie om de afzender-IP’s op een zwarte lijst te zetten. Dit kan echter tot gevolg hebben dat het systeem offline wordt gehaald door IP-spoofing.

Raspberry Pi klaarstomen voor Port knocking

Het is aan te raden om de Raspberry Pi in te stellen met een aangesloten monitor. Als je de Raspberry Pi later op afstand wilt bedienen, moet je zowel SSH als VNC inschakelen. Voer daarna een poortscan uit met Nmap om de poorten te beveiligen, met uitzondering van de SSH-toegang, die open moet blijven voor toegang.

Wij nemen in ieder geval de stappen met je door.

Stap 1: VNC-server verplaatsen

Om Raspberry Pi port knocking mogelijk te maken is het belangrijk om eerst te kijken naar de VNC-server. Het is namelijk noodzakelijk om de VNC-server te verplaatsen naar een andere poort dan de standaardpoort. Anders kun je namelijk geen gebruikmaken van port knocking met de Raspberry Pi.

Stap 2: Installeren van Knockd

Hoewel port knocking in theorie ook handmatig kan worden uitgevoerd, kunnen Linux-gebruikers nu terugvallen op een groot aantal kant-en-klare systemen. In de praktijk heeft Knockd zich gevestigd als een quasi-standaard: de tool is beschikbaar voor bijna alle Linux-distributies en is erg populair. Knockd kun je rechtstreeks vanuit de Raspberry Pi-pakketbronnen installeren met het volgende commando:

sudo apt-get install knockd

Stap 3: Superuser-rechten verlenen

Om het gedrag van Knockd beter te begrijpen, is het de moeite waard om het configuratiebestand onder /etc/knockd.conf te bekijken. Hiervoor zijn superuser-rechten vereist.

sudo pico /etc/knockd.conf

Voor een eerste test is het zinvol om de twee command-parameters toe te voegen bij aanroepen van het commando logger:

[openSSH]
command = logger “activeer status openSSH”

[closeSSH]
command = logger “activeer status closeSSH”

De opdracht logger schrijft de string die als parameter is doorgegeven naar het systeemlogboek van de Linux-computer, waar het bijvoorbeeld met dmesg kan worden gelezen. Voor inbedrijfstelling is ook een aanpassing van een configuratiebestand nodig. Dat doe je als volgt:

sudo pico /etc/default/knockd

De daar opgeslagen parameter START_KNOCKD bepaalt of Knockd deel uitmaakt van de basisconfiguratie van de host. Standaard is deze ingesteld op 0 om onbedoelde activeringen te voorkomen. Onze tests vereisen de volgende aanpassing:

# control if we start knockd at init or not
# 1 = start
# anything else = don’t start
# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD=1

Herstart daarna de daemon met het commando hieronder of start de Raspberry Pi volledig opnieuw op.

sudo service knockd restart

Stap 4: de instellingen van Knockd

De instellingen in het configuratiebestand bij [options] bepalen het algemene gedrag van de daemon. Bijvoorbeeld, als het attribuut UseSyslog is ingeschakeld, schrijft Knockd de logboekinformatie naar het syslog. Je kunt ook andere logbestanden maken, zoals een specifiek bestand voor port knocking-gebeurtenissen, voor gemakkelijkere controle.

Het configuratiebestand definieert ook de statussen [openSSH] en [closeSSH]. Als binnen een tijdsduur van 5 seconden pakketten worden ontvangen op poorten 7000, 8000 en 9000, wordt de status [openSSH] geactiveerd. Het attribuut tcpflags kan ook gebruikt worden om aan te geven dat alleen pakketten met een ingestelde ‘syn’ vlag in de TCP-header geaccepteerd worden.

De wijziging van de toestand[closeSSH] kan op een vergelijkbare manier worden uitgevoerd, waarbij de juiste volgorde van de ontvangen poorten 9000, 8000, 7000 is. Knockd richt zich op het beheren van de statuswijzigingen. Als een van de veranderingen van status plaatsvindt, verwerkt Knockd het bijbehorende commando. Vaak worden hier oproepen naar iptables gebruikt om direct het firewallpakket te beïnvloeden door de betreffende poort in of uit te schakelen, maar er is niets mis met het uitvoeren van andere scripts. Aangezien het doorgegeven commando direct wordt uitgevoerd, zijn er geen limieten aan de creativiteit van de beheerder.

Stap 5: systeemstatus controleren

Een van de redenen waarom Knockd populair is, is dat het alleen luistert naar inkomende TCP-pakketten en je geen bijbehorende client hoeft te gebruiken voor de deamon. De ontwikkelaars van het programma geven in de man-pagina van het programma aan dat het proces van portknocking zelfs met Telnet-verbindingen kan worden geactiveerd.

Gemakshalve willen we Knockd echter ook op ons werkstation gebruiken: bij het serverpakket wordt een Knockd-client geleverd, die zorgt voor het verzenden van de door de server verwachte port knocking-pakketten.  Knockd is populair en bijvoorbeeld beschikbaar in de officiële pakketbronnen van Ubuntu 20.04 LTS. Die installeer je met:

sudo apt-get install knockd

Normaal gesproken worden port knocking pakketten geactiveerd volgens dit schema:

knock 192.168.1.69 7000 8000 9000
knock 192.168.1.69 9000 8000 7000

De twee aanroepen van het knockcommando sturen de pakketsequenties die correleren met hierboven gedefinieerde statussen [openSSH] en [closeSSH]. Het is een goed idee om de inhoud van de syslog te controleren door het volgende commando in te voeren:

sudo tail -f /var/log/syslog

Als er op dit moment niets verschijnt, moet je beginnen met het oplossen van de problemen. Als eerste stap kun je kijken of de informatie verschijnt in de uitvoer van logger met het commando:

sudo tail -f /var/log/syslog

Stap 6: Knockd handmatig starten

Met de volgende stap kun je Knockd handmatig starten:

sudo service knockd stop
sudo knockd -D -v

De beloning voor de moeite is een nieuw exemplaar van Knockd in een terminalvenster. Dat is verantwoordelijk voor de activering en geeft daar ook statusinformatie door. Het afvuren van Knockd-commando’s op het werkstation levert nu het gewenste resultaat op.

Voor foutanalyse kun je ook kijken naar de inhoud van het systemd-logboek met het commando:

sudo systemctl status knockd

Een foutmelding daarbij laat zien dat het doel network-online.target op de Raspberry Pi niet betrouwbaar werkt. Systemd gebruikt dat meestal om programma’s of daemons te activeren die afhankelijk zijn van de netwerkstack. Een handige oplossing is eenvoudig de servicedefinitie aanpassen met het commando:

sudo nano /lib/systemd/system/knockd.service

[Unit]
Description=Port-Knock Daemon
After=network-online.target
Wants=network-online.target
Requires=network-online.target
Before=sshd.service
Documentation=man:knockd(1)
[Service]
Restart=on-failure
RestartSec=5s
EnvironmentFile=-/etc/default/knockd
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.target
Alias=knockd.service

De attributen Restart en RestartSec geven aan systemd aan dat de service altijd opnieuw moet worden gestart in geval van een fout. Dit is ook logisch als het om de een of andere reden mogelijk zou zijn om Knockd te misleiden. Last but not least is dan een update van de Knockd-status vereist die je kunt uitvoeren met het commando:

sudo systemctl enable knockd.service
sudo service knockd start

Vanaf dit moment kun je de Raspberry Pi opnieuw starten zoals je wilt. Knockd zal nu zichtbaar zijn in de uitvoer van het commando “ps aux” met een filter.

Stap 7: Statussen automatisch deactiveren

In theorie hebben we de activering van de statussen[openSSH] en [closeSSH] nu getest. In de praktijk veronderstelt dit echter dat de client meewerkt en  – vooral bij mobiel gebruik – ook een goed werkende internettoegang heeft. Aangezien dit niet altijd gegarandeerd is, kan dit problematisch zijn bij het werken met Knockd.

Gelukkig is het ontwikkelingsteam van Knockd op de hoogte van deze situatie. Als tegenmaatregel vertrouwt men op statussen die automatisch weer worden gedeactiveerd. Om deze handige functie in ons voorbeeld te integreren, volstaat het om het bestand /etc/knockd.conf aan te passen:

[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
start_command = logger “activeer status openSSH”
stop_command = logger “deactiveer status openSSH automatisch”
cmd_timeout = 10
tcpflags = syn

Na een herstart kun je op de client het volgende commando geven en daarna de vliegtuigmodus activeren:

knock 192.168.1.69 7000 8000 9000

Op de server kun je dan zien dat Knockd zoals gewenst werkt. De stop_command uitvoer ‘deactiveer status openSSH automatisch’ verschijnt pas nadat de bij cmd_timeout opgegeven tijd is verstreken.

Stap 8: Replay-aanvallen afslaan

In de praktijk komen regelmatig aanvallen voor waarbij eerder opgenomen gegevens opnieuw worden verstuurd (replay-aanvallen). Dat maakt port knocking weinig doeltreffend, als de aanvaller altijd dezelfde statische poortsequentie kan gebruiken om toegang te krijgen tot de aanvalsdoelen.

Om te beschermen tegen replay-aanvallen, maakt het ontwikkelteam van Knockd gebruik van een methode genaamd One-Time-Pad (OTP). Deze methode is veelgebruikt in de inlichtingenwereld. Om OTP te gebruiken, moet deze in de configuratie worden geplaatst in plaats van de standaard poortreeks.

[opencloseSMTP]
one_time_sequences = /etc/knockd/smtp_sequences
seq_timeout = 15

De eigenlijke structuur van het sequentiebestand is dan een bestand dat als volgt is opgebouwd:

7000,8000,9000
9000,8000,7000

Hierbij is het van belang dat er voor elke individuele poortcombinatie een spatie moet staan.

Conclusie

Knockd monitort alle verkeer op een Ethernet-interface voor specifieke poortreeksen bij inkomende packets. Als de server zo’n specifieke poortreeks detecteert, voert hij een opdracht uit die is gedefinieerd in het configuratiebestand. Het werkt als een soort deurwachter, waarbij de deur (de firewall) alleen wordt geopend als de juiste klopsequentie wordt gedetecteerd. Op die manier kunnen alle SSH-poorten efficiënt worden bewaakt en indien nodig worden geopend. Firewallregels kunnen dynamisch worden gewijzigd om verbinding via specifieke poorten toe te staan.

Al met al is Port knocking met de Raspberry Pi een techniek waarmee de toegang tot een poort wordt gecontroleerd door alleen geautoriseerde gebruikers toegang te geven tot de dienst. De bedoeling van port knocking is het beschermen van een systeem tegen geautomatiseerde poortscanners die op zoek zijn naar open poorten.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *