Met Raspberry Pi port knocking de computers in je netwerk beveiligen

Elwin Hodžić
0

Inhoudsopgave

    Wanneer iemand een computer of server verbindt met het openbare internet, richten hackers al snel hun pijlen op dit doelwit. Volgens sommige wetenschappers scannen ze gemiddeld elke drie minuten openbare IP-adressen.

    Gelukkig kun je jezelf op verschillende manieren 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.

    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.


    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.

    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


    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.

    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.


    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.

    Elwin Hodžić
    Elwin Hodžić(Web)redacteur bij c't. Ondanks de studie geschiedenis, altijd al een passie gehad voor alles wat met IT te maken heeft. Sleutelt in zijn vrije tijd 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

    Raspberry Pi als NAS-systeem gebruiken? Dit moet je weten!

    Wist je dat je een Raspberry Pi als Network Attached Storage (NAS) kunt gebruiken? Zo voldoet de Raspberry Pi 4 aan de belangrijkste eisen om dit te k...

    Je Raspberry Pi op afstand bedienen? Zo krijg je het voor elkaar met SSH!

    De Raspberry Pi op afstand bedienen is handig en kan op verschillende manieren. Via SSH is het makkelijkste op te zetten, we laten zien hoe.

    0 Praat mee
    avatar
      Abonneer  
    Laat het mij weten wanneer er