Brannmur + Anti SSH Flooding, samt litt sikkerhet ved SSH

Har du noe lurt å dele med oss? NB. Dette er ikke et support forum.

Brannmur + Anti SSH Flooding, samt litt sikkerhet ved SSH

Innleggav nc » ons 01.02.2006 23:12

Selv når man bruker GNU/Linux bør man aboslutt ha en brannmur, spesielt hvis man kjører diverse servicer lokalt som ikke bør finne veien ut!

I nyere versjoner av Linux-kjernen så er det "netfilter" som blir brukt som brannmur og router, og programmet "iptables" som blir brukt til å sette reglene her.

Det kan derimot være litt vanskelig å sette seg inn i "iptables" da dette er meget avansert og fleksibelt. Det fungerer på den måten at kommandoen "iptables" kjøres èn eller flere ganger med spesielle parametere med regler om hvordan brannmuren og/eller routeren skal oppføre seg.

Det finnes dog enkelte grafiske brukergrensesnitt som er laget for å kunne sette opp dette forholdsvis enkelt.

Jeg har ikke hatt tid eller krefter til å sette meg skikkelig inn i hvordan man bruker "iptables", og siden jeg ikke kjører X på serveren min tenkte jeg det hadde vært fint med et ferdiglaget script eller lignende for å få satt det opp.

Etter et raskt Google søk så fant jeg Arno's iptables Firewall. Dette virket meget kurrant til mitt bruk. Det burde fungere på allt GNU/Linux distribusjoner, og hvis man ønsker å benytte seg av egen logg for brannmur (f.eks. /var/log/firewall), så følger det med eksempeloppsett av syslogd.conf til blant annet Debian, Red Hat og Slackware.

Arno sitt iptables brannmurscript settes opp ved å bruke eksempelkonfigurasjonen iptables-firewall.conf, som kopieres over til /etc-katalogen. Her kan man spesifisere meget mye, inkludert nettverksoppsett som DMZ (demilitarized zone) og slikt. Dette scriptet støtter også NAT, port-forwarding og mye mer! Les mer om hvordan du tar i bruk Arno's Iptables Firewall ved å lese README filen som følger med!

Jeg har port 22 åpen inn på maskinen min slik at jeg kan koble meg til via SSH. Jeg fant derimot ut at dette var ymse tilkoblingsforsøk på maskinen min ganske ofte.. ved å skrive "cat /var/log/messages|grep "Failed password" | wc -l" fikk jeg opp at i løpet av èn uke var det nesten 5 000 forsøk på å komme seg inn på maskinen! Så etter å ha snakket litt om dette på IRC-kanalen #slackware på EFnet, så fikk jeg et meget kurrant Anti SSH-Flooding script av en behjelpelig person der. Jeg modifiserte det selv til å lett kunne kombineres med Arno's iptables brannmur, og la det i filen /etc/iptables-custom-rules.

Dette er Anti SSH-Flooding scriptet som fungerer sammen med Arno's iptables brannmur:
Kode: Merk alt
root:~# cat /etc/iptables-custom-rules

#
# SSH FLOOD PROTECTION
#
# create our new limiting chain where we can send everything to be limited.
$IPTABLES -N mylimit

# demand 60 minutes of silence from a host that has been flagged as flooding.
$IPTABLES -A mylimit -m recent --update --seconds 3600 -j DROP

# if the host is not flagged for flooding, and has not started to flood in the last minute,
# bounce their connection back where it came from for further rule matching.
$IPTABLES -A mylimit -m limit --limit 2/m --limit-burst 3 -j RETURN

# They have started to flood, drop their ass and flag them.
$IPTABLES -A mylimit -m recent --set -j DROP

# shunt NEW ssh connections over to MyLimit to be limited
$IPTABLES -A INPUT -i $EXT_IF -p tcp --dport ssh -m state --state NEW -j mylimit

Dette fungerer ved at hvis noen prøver feiler i å logge seg på 3 ganger i løpet av en kort periode (2min..?) så blir de sperret ute i 1 time (3600 sekunder).

Jeg har nå brukt Arno's Iptables Firewall i over ett år, og Anti SSH Flooding scriptet i litt over en måned, og det fungerer meget bra! Jeg har fremdeles ofte forsøk på å logge seg inn på maskinen min, men de får bare tre forsøk, og så er det ut. Dette gjør at det er meget usannsynlig at noen greier å knekke passordet til en av brukerene på maskinen

Eksempel på logg hos meg nå med Anti SSH flood:
Kode: Merk alt
root:~# cat /var/log/messages|grep "Failed password"
Jan 29 12:27:11 www sshd[27507]: Failed password for invalid user root from 24.57.37.45 port 37525 ssh2
Jan 29 12:27:13 www sshd[27510]: Failed password for invalid user test from 24.57.37.45 port 37613 ssh2
Jan 29 12:27:14 www sshd[27513]: Failed password for invalid user test from 24.57.37.45 port 37662 ssh2
Jan 29 22:51:56 www sshd[28750]: Failed password for invalid user deutch from 66.163.1.130 port 45877 ssh2
Jan 29 22:51:59 www sshd[28753]: Failed password for invalid user german from 66.163.1.130 port 46037 ssh2
Jan 29 22:52:03 www sshd[28756]: Failed password for invalid user hitler from 66.163.1.130 port 46209 ssh2
Jan 30 08:32:01 www sshd[29576]: Failed password for invalid user charlotte from 219.135.191.21 port 40993 ssh2
Jan 30 08:32:05 www sshd[29579]: Failed password for invalid user charlotte from 219.135.191.21 port 41159 ssh2
Jan 30 08:32:09 www sshd[29582]: Failed password for invalid user charlotte from 219.135.191.21 port 41388 ssh2
Jan 30 12:02:25 www sshd[29875]: Failed password for invalid user root from 218.249.222.135 port 7564 ssh2
Jan 30 12:02:29 www sshd[29878]: Failed password for invalid user admin from 218.249.222.135 port 7636 ssh2
Jan 30 12:02:33 www sshd[29881]: Failed password for invalid user test from 218.249.222.135 port 7700 ssh2
#


OBS: Det er jo meget viktig at brukerene på datamaskinen har gode passord!

I tillegg er et sikkerhetstips å konfigurere SSHD (/etc/ssh/sshd_config) for eksempel at de brukerene som skal få lov å logge seg inn via SSH er bare personer som finnes i gruppen "ssh".
Dette kan gjøres slik:
Kode: Merk alt
root:~# groupadd ssh
root:~# gpasswd -a anders,truls,stine,geir ssh

Brukerene anders, truls, stine og geir er nå i den nylagede gruppen "ssh". Legg merke til at "root"-brukeren ikke er i denne gruppen. Dette pga at det ikke skal være lov å logge seg inn som "root" direkte via SSH, noe som gjør at store deler av passord-knekkingsforsøkene uansett feiler siden de fleste pleier å gå mot nettopp brukeren "root".

Så for at SSH Daemonen skal forstå at det bare skal være brukere som er medlem av gruppen "ssh" som skal få logge seg inn, så redigerer man /etc/ssh/sshd_config (obs, legg merke bokstaven "d" i sshd_config, ssh_config, uten "d", finnes nemlig også), og legger til følgende tekst:
Kode: Merk alt
AllowGroups ssh

En kjapp restart av SSHD ("/etc/rc.d/rc.sshd restart" i Slackware, "service sshd restart" i Red Hat) gjør at den nye konfigurasjonen tas i bruk.

Du kan fremdeles fjernadministrere maskinen som root ved først å logge inn som en vanlig bruker som er medlem av gruppen ssh, for eksempel anders. For deretter å logge inn som root, ved "su -" eller bruke "sudo <kommando>".

Ved å bruke dette har du iallefall en litt sikrere maskin, enn en som står rett-på-nett uten brannmur og med tilgang til SSHD for alle brukere på maskinen! ;)
Håper dette skrivet er behjelpelig for noen :-P

Erfaren
Brukerens avatar
medlem i 231 måneder
 

Innleggav KloA » ons 01.02.2006 23:38

et annet litt enkelt knep for ssh-sikkerhet er å kjøre det på en uvanlig port, gjør det på en server jeg har stående en plass, og siden oktober har det vært 0 failed password =)

men ellers en knakende bra guide =)
medlem i 221 måneder
 

Innleggav nc » ons 01.02.2006 23:45

ah, stemmer. Selvsagt. Glemte å nevne det :-)
Men jeg har endel brukere på min maskin som forventer at det kjører på port 22, så får meg blir det uaktuelt å bytte port. Men for alle andre som egentlig ikke bryr seg om hvilken port det kjører på, så er det meget lurt å sette det til en obskur port som f.eks. 32748 eller noe. hehe :-D

Erfaren
Brukerens avatar
medlem i 231 måneder
 

Innleggav Lemen » tor 02.02.2006 19:58

Bra guide :) Sikkert mange som kan få brukt for den.
medlem i 235 måneder
 

Innleggav lahgoon » fre 03.02.2006 7:23

Man burde også ta en titt på firestarter brannmuren.. http://www.fs-security.com/

Den er genial;) Men krever GUI så vidt jeg vet...

Brukerens avatar
medlem i 232 måneder
 

Re: Brannmur + Anti SSH Flooding, samt litt sikkerhet ved SS

Innleggav gab » fre 03.02.2006 11:08

Først vil jeg si at dette er et meget bra innlegg :)

nc skrev:Dette er Anti SSH-Flooding scriptet som fungerer sammen med Arno's iptables brannmur:
Kode: Merk alt
root:~# cat /etc/iptables-custom-rules

#
# SSH FLOOD PROTECTION
#
# create our new limiting chain where we can send everything to be limited.
$IPTABLES -N mylimit

# demand 60 minutes of silence from a host that has been flagged as flooding.
$IPTABLES -A mylimit -m recent --update --seconds 3600 -j DROP

# if the host is not flagged for flooding, and has not started to flood in the last minute,
# bounce their connection back where it came from for further rule matching.
$IPTABLES -A mylimit -m limit --limit 2/m --limit-burst 3 -j RETURN

# They have started to flood, drop their ass and flag them.
$IPTABLES -A mylimit -m recent --set -j DROP

# shunt NEW ssh connections over to MyLimit to be limited
$IPTABLES -A INPUT -i $EXT_IF -p tcp --dport ssh -m state --state NEW -j mylimit

Dette fungerer ved at hvis noen prøver feiler i å logge seg på 3 ganger i løpet av en kort periode (2min..?) så blir de sperret ute i 1 time (3600 sekunder).
Men jeg forstår ikke helt hvordan dette vikre (ikke guru på IPTables, men ønsker å lære)
Kode: Merk alt
$IPTABLES -N mylimit
Den er grei, lager kjeden mylimit som man kan bruke til "noe".
Kode: Merk alt
$IPTABLES -A mylimit -m recent --update --seconds 3600 -j DROP
Denne skjønner jeg litt av ... Har man blitt kastet inn i kjeden mylimit er dette første testen man må bestå (ikke trigge i dette tilfellet). Hvis man matcher "recent", som jeg regner med er et flagg som blir satt av regler 2 linjer under, så oppdateres noe med 3600 sec før man droppes. Eller er det sånn at man sjekker om "recent" er satt for under 3600 sec?
Kode: Merk alt
$IPTABLES -A mylimit -m limit --limit 2/m --limit-burst 3 -j RETURN
Er man kastet inn i kjeden mylimit sjekker man for flagget "limit" om man i løpet av de to siste minuttene har hatt 3 feilaktige innlogginger, før man blir høfflig avvist.
Kode: Merk alt
$IPTABLES -A mylimit -m recent --set -j DROP
Hvis man er kastet inn i kjeden mylimit, og ikke blitt kastet ut av 1. regel og regel nr 2 ikke har avvist deg på en høfflig måte er det garantert at du er en flooder og flagget "recent" settes. Før man blir kastet ut.
Kode: Merk alt
$IPTABLES -A INPUT -i $EXT_IF -p tcp --dport ssh -m state --state NEW -j mylimit
Det er vel her magien ligger ... tror jeg ... Hvis noen prøver å logge inn med ssh fra externt nett og dette er ny sorespørsel, så kastes dette inn i kjeden mylimit og testet med de 3 reglene over. Er det slik å forstå at hvis man blir avvist høflig (RETURN) så regnes det ikke som en ny forespørsel? Hvis ikke så klarer vel ikke scriptet å skille på det er noen som prøver å logge inn 4 ganger fra en(eller flere) host(er) og har rett passord, eller om noen bare prøver seg.

Som dere skjønner så er jeg noe usikker på dette, men bær over med meg :) Og all oppklaring av min uforstand er gledelig.
medlem i 235 måneder
 

Innleggav buskmann » tir 07.02.2006 0:53

lahgoon skrev:Man burde også ta en titt på firestarter brannmuren.
Men krever GUI så vidt jeg vet...


Den krever ikke GUI.
medlem i 226 måneder
 

Innleggav nc » fre 10.02.2006 19:37

gab: Ærlig talt så har jeg ikke satt meg så fryktelig inn i dette Anti SSH Flooding-scriptet selv. Er en bekjent som har laget det, og jeg fikk det av han.

root:~# cat /etc/iptables-custom-rules

#
# SSH FLOOD PROTECTION
#
# create our new limiting chain where we can send everything to be limited.
$IPTABLES -N mylimit

# demand 60 minutes of silence from a host that has been flagged as flooding.
$IPTABLES -A mylimit -m recent --update --seconds 3600 -j DROP

# if the host is not flagged for flooding, and has not started to flood in the last minute,
# bounce their connection back where it came from for further rule matching.
$IPTABLES -A mylimit -m limit --limit 2/m --limit-burst 3 -j RETURN

# They have started to flood, drop their ass and flag them.
$IPTABLES -A mylimit -m recent --set -j DROP

# shunt NEW ssh connections over to MyLimit to be limited
$IPTABLES -A INPUT -i $EXT_IF -p tcp --dport ssh -m state --state NEW -j mylimit


Ut ifra det jeg kan se nå raskt ut ifra denne koden er følgende:
- Hvis en host er merket som flooder, så blir alle pakkene mottat av denen hosten droppet helt i èn time (3600sekund).
$IPTABLES -A mylimit -m recent --update --seconds 3600 -j DROP


- Hvis en host ikke har startet å floode det siste minuttet, så returner dem for videre sjekk mot eventuelle andre regler (altså, slipp dem igjennom)
$IPTABLES -A mylimit -m limit --limit 2/m --limit-burst 3 -j RETURN


- Hvis en host begynner å floode, drop alle pakkene fra den
$IPTABLES -A mylimit -m recent --set -j DROP


- Før nye SSH forespørsler via "mylimit" for å bli sjekket om de er merket som floodere eller ikke:
$IPTABLES -A INPUT -i $EXT_IF -p tcp --dport ssh -m state --state NEW -j mylimit



Vet ikke om dette hjalp noe, men det er slik jeg forstår det iallefall.
Hvis du er interessert i IPTables bør du kjøpe denne boken: http://www.oreilly.com/catalog/lnxiptablespr/index.html :-D

Erfaren
Brukerens avatar
medlem i 231 måneder
 

Innleggav gab » tir 14.02.2006 13:32

Dette svarte ikke på alt, men noe :) Fikk i alle fall klarhet i det med RETURN ... og går da ut i fra at
Kode: Merk alt
$IPTABLES -A mylimit -m recent --set -j DROP
først merker avsenderhost som en flooder og så dropper.

Har bestilt boka du anbefalte :)

Takker
medlem i 235 måneder
 


Returner til Tips og triks / Favoritter



Hvem er i Forumene

Registrerte brukere: Google [Bot]



cron