Raspberry Pi port knocking: computers in je netwerk beveiligen met Pi

Elwin Hodžić
0

Inhoudsopgave

    Iedereen die een computer of server met het openbare internet verbindt, wordt al snel het doelwit van hackers. Sommige wetenschappers gaan ervan uit dat openbare IP-adressen gemiddeld elke drie minuten worden gescand.

    Gelukkig zijn er genoeg manieren om jezelf te beschermen. Denk bijvoorbeeld aan port knocking met een Raspberry Pi, wat eigenlijk een soort digitaal verstoppertje is. In deze workshop vertellen we je meer over dit interessante Raspberry Pi Project en hoe jij kunt beginnen met port knocking in combinatie met een Raspberry Pi.

    Raspberry Pi port knocking: 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.


    Wil je meer van dit soort Raspberry Pi Projects? Schrijf je in voor de nieuwsbrief:

    Ontvang elke week het laatste IT-nieuws, de handigste tips en speciale aanbiedingen.

    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.

    Lees meer over cybersecurity in c't magazine 3/2023

    Elwin Hodžić
    Elwin HodžićWebredacteur bij c't. Ondanks de studie geschiedenis, altijd al een passie gehad voor alles wat met IT te maken heeft. Sleutelt in zijn vrije graag aan pc’s, van de hardware tot het uitpluizen van de BIOS-instellingen om een pc zo optimaal mogelijk te laten werken.

    Lees ook

    Donkere modus Word uitschakelen of inschakelen? Zo doe je het!

    Microsoft Word volgt automatisch de donkere modus van Windows. Je kunt ook afzonderlijk de donkere modus van Word uitschakelen of inschakelen. Zo doe ...

    Raspberry Pi als Chromecast alternatief gebruiken & zo doe je het

    De Google Chromecast is erg handig om media van je telefoon op je tv af te spelen. Helaas werkt het in sommige gevallen niet ideaal. Zo werken bepaald...

    0 Praat mee
    avatar
      Abonneer  
    Laat het mij weten wanneer er