Sikre serveren din: Portbanking – fungerer det, og hvorfor ikke stole på det?

Portbanking er en metode for å beskytte en server ved å holde brannmurporter stengt – også de du forventer å bruke. Disse portene åpnes kun etter en spesifikk forespørsel, hvor tilkoblingsforsøket inneholder en hemmelig sekvens, en slags «banke-kode».

Portbanking: En «hemmelig banke-kode» for tilgang

Tenk deg tilbake til 1920-tallet, under forbudstiden. For å komme inn i en hemmelig bar, måtte du kjenne den rette banke-sekvensen. Portbanking fungerer på samme måte, men for digitale systemer.

Hvis du ønsker å gi noen tilgang til tjenester på datamaskinen din, men samtidig vil unngå å åpne brannmuren for hele internett, kan du benytte deg av portbanking. Dette innebærer å holde alle porter i brannmuren stengt for innkommende tilkoblinger. Portene åpnes kun når et forhåndsdefinert mønster av tilkoblingsforsøk gjennomføres. Denne sekvensen av forsøk fungerer som den hemmelige banke-koden. Og en ny banke-sekvens kan lukke porten igjen.

Portbanking er en relativt ny tilnærming, men det er viktig å være klar over at den i bunn og grunn er et eksempel på sikkerhet gjennom hemmelighold, et konsept som er fundamentalt problematisk. Tanken er at sikkerheten baseres på at bare en utvalgt gruppe kjenner til fremgangsmåten for tilgang. Men så snart denne hemmeligheten blir kjent – enten ved avsløring, observasjon, gjetning eller løsning – er sikkerheten kompromittert. Det er mer fornuftig å beskytte serveren din med andre, sterkere metoder, for eksempel å kreve nøkkelbasert innlogging for en SSH-server.

De mest effektive strategiene for cybersikkerhet er lagdelte. Portbanking kan kanskje utgjøre et av disse lagene. Flere lag gir i prinsippet bedre beskyttelse. Det kan imidlertid diskuteres om portbanking faktisk gir noen vesentlig forbedring av et allerede godt sikret system.

Cybersikkerhet er et omfattende og komplisert område, men du bør ikke stole på portbanking som din eneste forsvarslinje.

Installasjon av Knockd

For å demonstrere portbanking, skal vi bruke det til å kontrollere port 22, som er SSH-porten. Vi vil benytte oss av et verktøy kalt knockd. Hvis du bruker Ubuntu eller en annen Debian-basert distribusjon, kan du installere denne pakken via apt-get. For andre Linux-distribusjoner bruker du den aktuelle pakkebehandleren.

Skriv inn følgende kommando:

sudo apt-get install knockd

Det er sannsynlig at du allerede har iptables brannmur installert. Men du kan trenge å installere iptables-persistent-pakken. Denne pakken håndterer automatisk innlasting av lagrede iptables-regler.

Bruk denne kommandoen for å installere den:

sudo apt-get install iptables-persistent

Når IPV4-konfigurasjonsskjermen dukker opp, trykk på mellomromstasten for å bekrefte «Ja»-valget.

Gjør det samme i IPv6-konfigurasjonsskjermen.

Følgende kommando sørger for at eksisterende og pågående tilkoblinger ikke blir avbrutt. Deretter skal vi stenge SSH-porten.

Vi vil ikke at noen skal miste SSH-tilkoblingen sin når vi stenger porten:

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

Denne kommandoen legger til en regel i brannmuren. Den spesifiserer følgende:

-A: Legg til regelen i brannmurens regelsett, dvs. legg den til nederst.
INPUT: Dette er en regel som gjelder for innkommende tilkoblinger.
-m conntrack: Brannmurregler gjelder for nettverkstrafikk (pakker) som oppfyller kriteriene i regelen. Parameteren -m gjør at iptables bruker ekstra moduler for pakketilpasning. I dette tilfellet brukes conntrack, som gir kjernen mulighet for å spore nettverkstilkoblinger.
–ctstate ESTABLISHED,RELATED: Dette spesifiserer hvilke typer tilkoblinger regelen gjelder for, nemlig ETABLERTE og RELATERTE tilkoblinger. En etablert tilkobling er en som allerede er i gang. En relatert tilkobling er en som opprettes på grunnlag av en handling fra en etablert tilkobling. For eksempel, hvis noen som er tilkoblet ønsker å laste ned en fil, kan dette skje via en ny tilkobling som initieres av serveren.
-j ACCEPT: Hvis trafikken samsvarer med regelen, skal brannmuren hoppe til ACCEPT-målet. Det betyr at trafikken blir godkjent og får passere gjennom brannmuren.

Nå kan vi stenge porten:

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

Denne kommandoen legger til en regel i brannmuren som sier:

-A: Legg til regelen i brannmurens regelsett, dvs. legg den til nederst.
INPUT: Denne regelen gjelder innkommende tilkoblinger.
-p tcp: Denne regelen gjelder for trafikk som bruker Transmission Control Protocol.
–dport 22: Denne regelen gjelder spesifikt TCP-trafikk som er rettet mot port 22 (SSH-porten).
-j REJECT: Hvis trafikken samsvarer med regelen, skal brannmuren hoppe til REJECT-målet. Dette betyr at trafikken blir avvist og ikke slipper gjennom brannmuren.

Vi må nå starte den netfilter-vedvarende demontjenesten, slik:

sudo systemctl start netfilter-persistent

Vi vil at netfilter-persistent skal gjennomføre en lagrings- og omlastingssyklus, slik at den laster inn og kontrollerer iptables-reglene.

Bruk følgende kommandoer:

sudo netfilter-persistent save

sudo netfilter-persistent reload

Nå har du installert verktøyene, og SSH-porten er stengt (forhåpentligvis uten å ha avbrutt noen tilkoblinger). Nå er det på tide å konfigurere den hemmelige banke-koden.

Konfigurering av knockd

Det er to filer du må endre for å konfigurere knockd. Den første er konfigurasjonsfilen for knockd:

sudo gedit /etc/knockd.conf

Gedit-editoren åpnes med knockd-konfigurasjonsfilen.

Vi skal redigere denne filen slik at den passer våre behov. Vi er mest interessert i seksjonene «openSSH» og «closeSSH». Hver av disse seksjonene har fire oppføringer:

sekvens: Rekkefølgen av porter som må nås for å åpne eller lukke port 22. Standardportene er 7000, 8000 og 9000 for å åpne porten, og 9000, 8000 og 7000 for å lukke den. Du kan endre disse portene eller legge til flere i listen. For vårt formål holder vi oss til standardinnstillingene.
seq_timeout: Tidsperioden som portene må nås innenfor for å utløse åpne- eller lukkehandlingen.
kommando: Kommandoen som sendes til iptables-brannmuren når åpne- eller lukkehandlingen utløses. Disse kommandoene legger enten til en regel i brannmuren (for å åpne porten) eller fjerner den (for å lukke porten).
tcpflags: Typen pakke som hver port må motta i den hemmelige sekvensen. En SYN (synkroniserings) pakke er den første i en TCP tilkoblingsforespørsel, også kalt en treveis håndtrykk.

«openSSH»-seksjonen kan tolkes som: «En TCP-tilkoblingsforespørsel må sendes til portene 7000, 8000 og 9000 – i denne rekkefølgen og innen 5 sekunder – for at kommandoen for å åpne port 22 skal sendes til brannmuren.»

«closeSSH»-seksjonen kan tolkes som: «En TCP-tilkoblingsforespørsel må sendes til portene 9000, 8000 og 7000 – i denne rekkefølgen og innen 5 sekunder – for at kommandoen for å lukke port 22 skal sendes til brannmuren.»

Brannmurreglene

«kommando»-oppføringene i «openSSH»- og «closeSSH»-seksjonene er i hovedsak like, med unntak av en enkelt parameter. Slik er de sammensatt:

-A: Legg til regelen nederst i listen over brannmurregler (for openSSH-kommandoen).
-D: Slett kommandoen fra listen over brannmurregler (for closeSSH-kommandoen).
INPUT: Denne regelen gjelder for innkommende nettverkstrafikk.
-s %IP%: IP-adressen til enheten som ber om tilkobling.
-p: Nettverksprotokoll; i dette tilfellet TCP.
–dport: Destinasjonsporten; i vårt eksempel port 22.
-j ACCEPT: Hopp til aksept-målet i brannmuren. Med andre ord, la pakken passere gjennom resten av reglene uten å bli behandlet videre.

Endringer i knockd konfigurasjonsfilen

Endringene vi gjør i filen, er uthevet med rødt nedenfor:

Vi utvider «seq_timeout» til 15 sekunder. Dette er ganske sjenerøst, men kan være nødvendig hvis noen manuelt sender ut tilkoblingsforespørslene.

I «openSSH»-seksjonen endrer vi -A (legg til) i kommandoen til -I (sett inn). Denne kommandoen setter inn en ny brannmurregel øverst i listen over brannmurregler. Hvis du lar -A stå, vil regelen legges til nederst i brannmurregellisten.

Innkommende trafikk testes mot hver brannmurregel i listen, ovenfra og ned. Vi har allerede en regel som stenger port 22. Hvis innkommende trafikk testes mot denne regelen før den når regelen som tillater trafikken, vil tilkoblingen bli avvist. Men hvis den nye regelen testes først, vil tilkoblingen tillates.

Lukke-kommandoen fjerner regelen som ble lagt til av openSSH fra brannmurreglene. Dermed håndteres SSH-trafikk igjen av den eksisterende «port 22 er stengt»-regelen.

Etter at du har gjort disse endringene, lagrer du konfigurasjonsfilen.

Endringer i knockd kontrollfilen

Knockd-kontrollfilen er enklere. Før vi begynner å endre den, må vi imidlertid finne ut det interne navnet på vår nettverkstilkobling. Dette gjør du med følgende kommando:

ip addr

Tilkoblingen som brukes i denne artikkelen er enp0s3. Noter deg navnet på din tilkobling.

Denne kommandoen redigerer knockd-kontrollfilen:

sudo gedit /etc/default/knockd

Her ser du knockd-filen i gedit.

De få endringene vi skal gjøre, er uthevet med rødt:

Vi endret «START_KNOCKD=» fra 0 til 1.

Vi fjernet også hash # fra starten av «KNOCKD_OPTS=», og erstattet «eth1» med navnet på vår nettverkstilkobling, enp0s3. Hvis din nettverkstilkobling er eth1, trenger du selvsagt ikke endre det.

Beviset ligger i puddingen

Nå er det tid for å se om dette fungerer. Vi starter knockd-demontjenesten med denne kommandoen:

sudo systemctrl start knockd

Deretter skal vi prøve å koble til fra en annen maskin. Vi installerte knockd-verktøyet på den maskinen også, ikke for å sette opp portbanking, men fordi knockd-pakken også inneholder et annet verktøy kalt knock. Vi bruker denne maskinen for å sende vår hemmelige banke-sekvens.

Bruk følgende kommando for å sende den hemmelige sekvensen av tilkoblingsforespørsler til portene på maskinen med IP-adressen 192.168.4.24:

knock 192.168.4.24 7000 8000 9000 -d 500

Dette forteller knock om å målrette maskinen med IP-adressen 192.168.4.24 og sende en tilkoblingsforespørsel til portene 7000, 8000 og 9000, i tur og orden, med en forsinkelse (-d) på 500 millisekunder mellom hver.

En bruker kalt «dave» sender deretter en SSH-forespørsel til 192.168.4.24:

ssh [email protected]

Tilkoblingen godkjennes, han skriver inn passordet, og fjernøkten starter. Kommando-prompten endres fra [email protected] til [email protected]. For å logge ut av den eksterne maskinen, skriver han:

exit

Kommando-prompten går tilbake til hans lokale maskin. Han bruker knock enda en gang, og denne gangen målrettes portene i motsatt rekkefølge for å lukke SSH-porten på den eksterne datamaskinen.

knock 192.168.4.24 9000 8000 7000 -d 500

Dette var riktignok ikke en spesielt langvarig fjernøkt, men det demonstrerer åpningen og lukkingen av porten via portbanking.

Hvordan ser dette ut fra den andre siden? Systemadministratoren på portbank-tjeneren bruker følgende kommando for å se nye oppføringer som kommer inn i systemloggen:

tail -f /var/log/syslog

Du ser tre openSSH-oppføringer. Disse vises etter hvert som hver port blir målrettet av det eksterne banke-verktøyet.
Når alle tre trinnene i sekvensen er fullført, vises en oppføring som sier «ÅPNE SESAM,» i loggen.
Kommandoen for å sette inn regelen i iptables-regellisten sendes. Dette tillater tilgang via SSH på port 22 fra den spesifikke IP-adressen til PC-en som sendte den korrekte banke-sekvensen (192.168.4.23).
Brukeren «dave» kobler til i noen få sekunder og logger ut igjen.
Du ser tre closeSSH-oppføringer. Disse vises etter hvert som hver port blir målrettet av det eksterne banke-verktøyet – dette ber portbanking-tjeneren om å lukke port 22.
Etter at alle tre trinnene er fullført, får vi meldingen «ÅPNE SESAM» igjen. Kommandoen sendes til brannmuren for å fjerne regelen. (Hvorfor ikke «LUKK SESAM» når den stenger porten? Hvem vet?)

Nå er den eneste regelen i iptables-regellisten angående port 22, den vi skrev inn i begynnelsen for å lukke porten. Dermed er port 22 stengt igjen.

Bank den ut av hodet

Dette er portbanking i et nøtteskall. Betrakt det som en avledning, og unngå å bruke det i den virkelige verden. Eller, hvis du må, ikke stol på det som din eneste form for sikkerhet.