Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

Sunucu Güvenliği | Saldırı Engelleme Metodu “Fail2Ban”

3 min read



Bir çok Linux sunucu uzaktan erişim için varsayılan olarak 22 nolu port üzerinden SSH erişimi hizmeti vermektedir. Bu port oldukça yaygın olarak kullanılması sebebiyle Brute Force saldırılarına sıkça maruz kalmaktadır. Ayrıca sunucuya kısa zamanda bir çok ping atarak sunucunun kullanılamaz hale gelmesini sağlayan DDoS saldırıları da oldukça yaygındır. Bu tür saldırıları önlemek için Linux sunucularda alabileceğiniz en etkili tedbirlerden birisi Fail2Ban kurmaktır.

Fail2Ban Nasıl Çalışır?

Fail2Ban siteye erişim kayıtlarının tutulduğu logları inceleyerek saldırıları tespit etmekte ve ilgili IP adreslerinden gelen istekleri hızlı bir şekilde engellemektedir. Böylece siteniz sağlıklı bir şekilde çalışmaya devam eder, parolaların tahmin edilmesi için tüm olasılıkları denenmesinin önüne geçilir.

Fail2Ban Kurulumu

Ben sunucumda CentOS kullandığım için kurulumu buna göre anlatacağım ancak Fail2Ban’i diğer Linux dağıtımlarında da sorunsuz bir şekilde kullanabilirsiniz.

Fail2Ban için öncelikle EPEL deposunu kurmak gerekir. Ardından da Fail2Ban kurulum komutunu çalıştırabilirsiniz.

[php]yum install epel-release
yum install fail2ban fail2ban-systemd[/php]

Eğer sisteminizde SELinux kurulu ise onu da güncelleştirmeniz gerekir ki aşağıdaki komut bunun için yeterlidir.

[php]yum update -y selinux-policy*[/php]

Fail2Ban Ayarlarının Yapılması

Fail2Ban kurulduktan sonra jail.local isimli konfigürasyon dosyasını düzenleyerek yazılımın istediğimiz gibi çalışmasını sağlıyoruz. Bunun için aşağıdaki komut ile jail.conf dosyasını jail.local ismiyle değiştirerek mevcut jail.local dosyasının üzerine yazmasını sağlıyoruz.

[php]cp -pf /etc/fail2ban/jail.conf /etc/fail2ban/jail.local[/php]

Ardından bu dosyayı nano ya da vi gibi bir düzenleyici ile açarak düzenliyoruz.

[php]nano /etc/fail2ban/jail.local[/php]

Dosya içeriği şu şekildedir.

[php][DEFAULT]
# MISCELLANEOUS OPTIONS

# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1/8

# External command that will take an tagged arguments to ignore, e.g. <ip>,
# and return true if the IP is to be ignored. False otherwise.
#
# ignorecommand = /path/to/command <ip>
ignorecommand =

# "bantime" is the number of seconds that a host is banned.
bantime = 600

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 600

# "maxretry" is the number of failures before a host get banned.
maxretry = 5[/php]

Buradaki satırları şu şekilde açıklayabiliriz:
Ignoreip: Yasaklamaya düşmesini istemediğimiz, mesela kendi IP adresimizi (eğer sabit IP ise) buraya ekleyebiliriz. Birden fazla IP girilecekse arada boşluk bırakarak istediğimiz kadar girebiliriz.
Bantime: Yasaklanan IP adresinin ne kadar süre ile sunucumuza erişiminin engellenmesini istediğimizi saniye cinsinden burada belirtiyoruz.
Findtime: Bu parametre ile IP adresinin iki giriş denemesi arasındaki süreyi burada belirliyoruz.
Maxretry: Sunucuya erişmeye çalışanların maksimum giriş denemesi sayısını bu parametrede belirliyoruz.

Fail2Ban’in çalışmasını örnekle anlatmak gerekirse herhangi bir IP’den 30 saniye içinde 10 defadan fazla erişim denendiği anda bu IP’yi 10 dk yasaklayarak buradan gelecek istekleri 10 dk boyunca engelle diyoruz.

SSH’ın Fail2Ban İle Korunması

Sunucumuza bağlanmak için kullandığımız SSH erişimini korumak için öncelikle nano editör ile aşağıdaki komutu kullanarak sshd.local isimli bir dosya oluşturuyoruz.

[php]nano /etc/fail2ban/jail.d/sshd.local[/php]

Dosyamızın içeriğini de şu şekilde düzenliyoruz.

[php][sshd]
enabled = true
port = ssh
action = firewallcmd-ipset
logpath = %(sshd_log)s
maxretry = 5
bantime = 86400[/php]

enabled = true ile korumanın aktif olduğunu belirtiyoruz.
port = ssh ile SSH’ın tanım olduğu portu korumak istediğimizi belirtiyoruz. Eğer 22’den farklı bir port kullanılacaksa buraya direk port numarasını yazabilirsiniz.
action = firewallcmd-ipset ile kontrol edilecek IP adreslerinin kaynağı belirtiliyor.
logpath = %(sshd_log)s ile log dosyasının tutulacağı yer belirtiliyor.
maxretry ve bantime parametrelerini zaten yukarıda açıklamıştık.

Fail2Ban Servisinin Aktif Hale Getirilmesi

Öncelikle CentOS firewall çalışır durumda değilse onu çalışır duruma getiriyoruz.
[php]systemctl enable firewalld
systemctl start firewalld[/php]
Ardından Fail2Ban servisini aktif hale getirip başlangıçta çalışacak şekilde ayarlıyoruz.
[php]systemctl enable fail2ban
systemctl start fail2ban[/php]

Başarısız Giriş Denemelerinin Takip Edilmesi

Aşağıdaki komut ile SSH portundan başarısız giriş denemesi yapılıp yapılmadığını görebiliriz.
[php]cat /var/log/secure | grep ‘Failed password'[/php]
Yukarıdaki komutun çıktısı şuna benzeyecektir.
[php]Fer 8 12:41:12 htf sshd[5487]: Failed password for root from 110.22.37.42 port 23021 ssh2
Fer 8 12:41:15 htf sshd[1254]: Failed password for root from 110.22.37.42 port 15486 ssh2
Fer 8 12:41:16 htf sshd[1254]: Failed password for root from 110.22.37.42 port 24457 ssh2
Fer 8 12:41:18 htf sshd[1254]: Failed password for root from 110.22.37.42 port 24457 ssh2[/php]

[php]Fail2Ban Servisinin Kontrol Edilmesi[/php]
Aşağıdaki kod ile servisin çalışıp çalışmadığını, çalışıyor ise kaç IP adresini yasakladığını görebilirsiniz.

[php][root@htf ]# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd[/php]

Bir IP Adresinin Engellenmesinin Kaldırılması

Bir IP adresinin yasağının kaldırılması için aşağıdaki komutu kullanabilirsiniz.

[php]fail2ban-client set sshd unbanip IPADDRESS[/php]



Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer