Weekend Prosjekt: Sikre System med Port Knocking

Port banke er et autentiseringssystem som gjør at en server for å holde portene lukket som standard, og åpne dem opp bare når klienter sende en forhåndsbestemt sekvens av tilkoblingsforespørsler rettet mot bestemte TCP eller UDP-porter. som et resultat, kan du for eksempel holde SSH både usynlig og utilgjengelig for forbipasserende, men fortsatt tillate kunder bevæpnet med hemmeligheten knock å koble til. sette opp port banke på Linux-systemet er enkelt, men sørg for at du setter av tid til å bli kjent med sikkerheten og praktiske risiko.

Server-side oppsett

Det mest populære havnen banke pakken på Linux-systemet er knockd. Det fungerer på konsert med Linux iptables brannmur, kjører som en daemon som lytter på et nettverksgrensesnitt for en pre-konfigurerte sekvensen av tilkoblingsforespørsler. Når en matchende sekvens oppdages, utfører knockd en tilhørende kommando fra sin konfigurasjonsfil – kanonisk, en iptables kommandoen som enten åpner eller lukker en bestemt port på som en tjeneste kjører allerede.

I den vanligste eksempelet konfigurasjon, er OpenSSH (eller annen like securable tjeneste) kjører på en standard port ( slik som TCP port 22), men iptables er konfigurert til å blokkere tilgang til det ved å slippe pakker. Knockd lytter på eth0 for TCP SYN pakker som sendes til en bestemt sekvens av porter (for eksempel port 9000, port 6501, port 1234, så port 4321). Når en matchende knock oppdages, utfører knockd en iptables kommandoen som forteller brannmuren til å begynne å akseptere pakker på TCP port 22, og kunden kan begynne en SSH-økt som normalt.

Du kan laste knockd fra prosjektets Web nettsted; kildekode samt Debian, RPM, og Slackware pakker tilbys. Knockd er ofte distribuert av de store Linux-distribusjonene, skjønt, så sjekk pakkebehandleren først. Når programmet er installert, du konfigurere knockd oppførsel i filen /etc/knockd.conf.

På toppen av knockd.conf er en global [alternativer] strofe. Her kan du sette hele systemet direktiver, den vanligste av disse ville være å angi nettverksgrensesnittet på multi-grensesnitt systemer. For eksempel legge en linje som inneholder Interface = eth1 å binde knockd til eth1 i stedet for standard eth0

Under dette hver knockd ". Event " får sin egen strofe, og starter med en brakett lukkede navn. Standardfilen inneholder to:

 [OpenSSH] sekvens = 7000,8000,9000 seq_timeout = 5 kommandoen = /sbin /iptables -A INPUT -s% IP% -p tcp --dport 22 -j ACCEPT tcp-flagg = SYN [closeSSH] sekvens = 9000,8000,7000 seq_timeout = 5 command = /sbin /iptables -D INPUT -s% IP% -p tcp --dport 22 -j ACCEPT tcp-flagg = syn 

I hvert tilfelle, sekvens direktivet viser rekkefølgen på TCP-portene som utgjør hemmelige banker. Tallene i seg selv er tatt for å bety TCP-porter, men du kan angi TCP eller UDP-porter ved å føye til: tcp eller: udp. En kombinert knock kan spesifisere begge, f.eks . sekvens = 3333: tcp, 9999: UDP, 1010: UDP, 8675: tcp

seq_timeout angir en maksimal tid for knock å ta – start til slutt – for at det skal bli akseptert, og kommandoen direktivet viser kommandoen som utløses av banker. I eksempelet, ser du at du åpner og lukker porten 22 krever to forskjellige slag. Et alternativ konfigurasjon lar deg kjøre en start_command når banker blir hørt, og deretter vente en viss mengde tid, og deretter kjøre en STOP_COMMAND. Dette vil åpne opp port 22 for nøyaktig ett minutt før du lukker det igjen:

 start_command = /usr /sbin /iptables -A INPUT -s% IP% -p tcp --syn --dport 22 -j AKSEPTERER cmd_timeout = 60 STOP_COMMAND = /usr /sbin /iptables -D INPUT -s% IP% -p tcp --syn --dport 22 -j ACCEPT 

tcp-flagg direktivet forteller knockd bare å lytte etter pakker som samsvarer med spesifiserte TCP flagg (i eksempelet, bare SYN). Du kan legge til flere flagg, for eksempel syn, urg, fin eller negere flagg med utropstegn karakter, for eksempel! Ack. Fordelen med å bruke TCP flagg som en del av banker er at under normale omstendigheter, ignorerer knockd misdannede pakker (som sannsynligvis er hva du vil).

Du kan starte knockd manuelt ved å kjøre /etc/init.d/knockd starte, eller konfigurere den til å kjøre på init tid ved redigering /etc /default /knockd og sette START_KNOCKD = 1.

Selvfølgelig under absolutt ingen omstendigheter bør du distribuerer knockd med standard Anmeldelser knock av 7000,8000,9000. Tilsvarende fordi all port banket gir er et lag med sikkerhet når den underliggende tjenesten i inaktiv, må du sørge for at SSH-serveren er sikker i sin egen rett – bare bruke SSH versjon 2, bruke DSA offentlig nøkkel-autentisering, og så videre.

Client oppsett

Du kan teste din grunnleggende port banke oppsett fra en annen maskin med en enkel telnet klient. Med serveren kjører, for å kjøre telnet 192.168.1.100 3333 sende en tilkoblingsforespørsel til 192.168.1.100 på TCP port 3333, etterfulgt av en på hver av de andre porter i hemmelighet knock.

For vanlig bruk, men , vil du ønsker en port banket klient. Knockd kommer med et kommandolinjeklienten heter banker som bruker samme syntaks som knockd.conf, så banke 192.168.1.100 3333: tcp 9999: udp 1 010: udp 8675: tcp vil utstede knock beskrevet et par avsnitt ovenfor. Med knock inn, sette i gang en SSH-tilkobling på vanlig måte.

Hvis ditt hemmelige knock avhenger TCP flagg, men du må se på en mer avansert verktøy, for eksempel SendIP eller packit, som kan send vilkårlig utformede pakker.

Hvis du bruker port banke på rutinemessig basis, kan du være interessert i å finne en klient for dine mobile enheter i tillegg til fullverdige Linux-systemer. Det er minst to knockd-kompatible klienter skrevet for iPhone-plattformen: Port Knock Lite og KnockOnD, og ​​en for Android: knock-android. Det ser ikke ut til å være en aktiv klient for Maemo eller MeeGo på det nåværende, selv om disse plattformene likheten til desktop og server Linux bør bety at standarden banker vil kompilere uten for mye ekstra trøbbel. Det er også en PHP-klient som er knockd-kompatibel.

praktiske gjennomføringen bekymringer

En av grunnene til at du ikke ser mange spesielle formål port banket kunder som lagrer og husker de hemmelige slag for deg er at det ville være beslektet til å lagre innloggingspassordet – hemmeligheten knock må være noe som du huske og vet utenat for å være effektive.

Selvfølgelig en av port banket viktigste kritikk er at en angriper sniffing nettverket kan oppdage din hemmelige banker og replay det senere. Naturligvis, jo hyppigere du bruker banker, jo større er risikoen. En løsning på dette er å sende dummy støt sammen med den virkelige banker, men egentlig bare viser betydningen av å sikre SSH eller den andre tjenesten i tillegg til å skjule den. Hvis ditt hemmelige knock er kompromittert, endre det er minst en enkel affære.

En langt mer sofistikert beskyttelse mot dette angrepet er å kombinere port banke med engangspassord, lage engangs-støt. Knockd støtter dette gjennom one_time_sequences direktivet i knockd.conf. Snarere enn eksplisitt beskriver en banker, one_time_sequences brukes til å angi en fil plassering, hvor lagres en liste over knock sekvenser, én per linje. Hver gang en klient kobler du bruker en banker, knockd kommentarer ut at knock fra filen og lytter etter den neste.

Du må også være klar over at porten banker har sine ulemper. Først, hvis knockd dør, er du låst ut av ekstern tilgang til skjulte service (med mindre, selvfølgelig, klarer du å knekke brannmur senere). Like viktig, fordi IP-pakker kan bli rutet på uforutsigbare måter, hvis du ikke er i nærheten av server maskin på nettverket er det alltid en sjanse for at dine knock pakker kommer ut av sekvens; på grunn av dette er det en god idé å ikke sende dem for raskt, og for å sette en rimelig verdi for seq_timeout.

I full forståelse for port banket, er det også viktig å forstå at på ingen måte er knockd begrenset å endre brannmurregler som en hendelse respons. Du kan bruke en hemmelig knock til eksternt utløse noen slags hendelse, fra en rsync backup hele veien til et script som sletter hjemmekatalogen og sender en resignasjon e-post til sjefen din, alt uten å åpne opp en eneste port til omverdenen.

Extra credit: mer avanserte servere

Det er andre porten banket (og konseptuelt beslektet) servere tilgjengelig foruten knockd. Noen kan det være lurt å sjekke ut inkludere sig2knock, som bygger på ideen om ikke-faste knock sekvenser og legger til port randomisering, portkey, som strammer ned porten banke idé å jobbe utelukkende med Linux iptables, og omvendt fjern shell (RRS) , som er en SSL-sikret skall som bygger på port banke som sin ekstern tilgang metoden. Hvis du ikke vil at brukere kjører vilkårlige kommandoer på serveren du adminster, kan du finne portkey eller RRS en bedre passform enn knockd. På den annen side, hvis sikkerhet er din største bekymring, sig2knock tilbyr noen overbevisende forbedringer.

Flere prosjekter forsøke å overvinne replay angrep problemet ved hulene mer inn standard kryptografisk nøkkel-basert autentisering. Eksempler er cryptknock, COK, og Tariq. Ulempen med disse systemene er at du ikke kan stole utelukkende på din evne til å huske den hemmelige banker til å gi deg tilgang. Men de mer avanserte systemer gjør introdusere andre gunstige sikkerhetsfaktorer som svartelister og hvitelister for å begrense hvilke IP-adresser kan koble til. Flere prosjekter knyttet til port banke er notert på portknocking.org stedet, sammen med forskningsartikler og andre ressurser for videre studier.

Når alvorlige sikkerhets fagfolk vil fortelle deg at port banke legger bare ett relativt tynt lag av sikkerhet til et system, er de riktige. Du må fortsatt ha sterke tilgangskontroll og multi-faktor autentisering for å sikre maskinen for fjerntilgang. Men gjør porten banke tjeneste usynlig for tilskuere, som er en verdifull ressurs i mange datamiljøer, og hvis du tar vare å endre banker, kan det hindre brute-force " ordboken " angrep mot SSH-brukerne. Tross alt, kan du aldri være for
sikker, kan du? Anmeldelser