Disariya acik bir SSH sunucu calistiriyorsaniz buyuk risk altindasiniz demektir. Son birkac yildir SSH sunuculara yapilan saldirilarda oldukca fazla artis gozlemleniyor(Oyle ya SSH sunucusu bir sisteme dalmanin en saglam yolu?). Bunun icin genelde bruteforce tarzi yontemler kullaniliyor.
Genelde sinir bozucu loglardan baska bir ise yaramasa da bazen sansli birileri parolayi bulmayi basarabiliyor. Ornek: Dunyanin en guvenli sistemlerinden biri sayilacabilecek OS’lardan birinde(FreeBSD) bir arkadasin baglantisini test etmek icin parolasini cok basit birsey vermistim. Ben problem ile ugrasirken o arada sistemde benden baskalarinin da oldugunu hissettim:) -eve cok kotu bir his bu!- hemen loglara ve calisan/gizli prosesleri detaylica kontrol ettikten sonra biraz once degistirdigim parolayi sansli birinin buldugunu gordum.(Tum bu olanlar 30 dakika surmedi)velhasil davetsiz misafiri kovduk, bir daha gelmesini engelledik ama bu bir daha ayni duruma dusmeyecegimizi garanti etmez.
Bunun icin sistemlere yapilan bruteforce saldirilarina bir cozum bulmam gerekti. Kullanabilecegim tek arguman bir OpenBSD Firewall oldugu icin ben de onun uzerinde cozumler dusunmeye basladim…
Aslinda SSH servislerine yapilan brute force saldirilarini engellemenin en mantikli ve guvenli cozumu SSH default portunu degistirmek, mumkunse public-private key kullanmak ve
sisteme erisim yapabilecek kullanicilari (AllowUsers ile)belirlemek. Ama bazen bu cozumleri uygulamayacak duruda olabiliriz ya da SSH sunucu bizim kontrolumuzde olmayabilir.
Bu gibi durumlarda ise network seviyesinde cozum uretmemiz gerekecek. Kullandiginiz guvenlik duvari/IPS sistemine gore cozum degisecektir ama mantik ayni:
belirli zaman icerisinde belirli sayidan fazla istek yapan hostlari blokla! ve bunu ek programlar gerektirmeden aktif olarak (loglari analiz edip is isten gectikten sonra bloklama gibi degil)yap:)
Gelelim bunu Open/FreeBSD PF’de nasil yapacagimiza.
vi /etc/pf.conf
table <ssh_yasaklilar> persist
pass in on $ext_if proto tcp from any to ($ext_if) port ssh \
flags S/SA keep state (max-src-conn-rate 2/30, overload <ssh_yasaklilar> flush global)
block log (all) quick from <ssh_yasaklilar
max-src-conn-rate 2/30 = Eger 30 saniye icerisinde herhangi bir IP adresinden 2 den fazla SSH
istegi gelirse o IP adresini ssh_yasaklilar tablosuna aktar, ve sonraki block kurali ile ssh_yasaklilar tablosundaki tum IP adreslerini blokla.
*OpenBSD 4.1 ve sonrasi icin keep state ontanimli geldigi icin yazilmasina gerek yoktur.
Yasaklanan IP adreslerinin belirli bir zaman icerisinde silinmesini istersek bunu cron’a yazacagimiz bir satirla halledebiliriz. (4.1 oncesi surumler icin
http://expiretable.fnord.se/ adresinden detayli bilgi edinebileceginiz expiretable, OpenBSD 4.1 ile birlikte pfctl -T expire komutunu kullanabilirsiniz.)
Ben 4.1 surumu kullandigim icin crontab’a asagidaki komutu calistirmasini soyluyorum.
pfctl -t ssh_yasaklilar -T expire saniye_cinsinden_deger.
paylaştiginiz için teşşekürler