Pythontr

husonet | Tarih: 13.03.2015

fail2ban nedir? fail2ban kurulumu ve yapılandırılması

Linux sistemleri fail2ban ile koruma yöntemleri detaylı olarak anlatmaya çalıştık

Teknoloji ilerledikçe saldırı yöntemleri ve bunun yanında da koruma yöntemleri gelişiyor. fail2ban nedir? sorusuna işte burada cevap verebiliriz fail2ban özellikle ddos ataklarında ısrarlı olarak tekrarlayan istekleri ve bunun yanında oluşturduğumuz şartlarla eşleşen istekleri tespit etmemize ve bunların yanında bu istek yapan ipleri banlamıza kolaylık sağlar.


fail2ban kurulumu

apt-get install fail2ban


fail2ban konfigürasyon

jail config basit bir şekilde yapılandıralım


cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local


fail2ban Nginx konfigürasyon
vim /etc/fail2ban/filter.d/nginx-req-limit.conf
# Fail2Ban configuration file
#
# supports: ngx_http_limit_req_module module

[Definition]

failregex = limiting requests, excess:.* by zone.*client: <HOST>

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

vim /etc/fail2ban/filter.d/nginx-proxy.conf
# Proxy filter /etc/fail2ban/filter.d/nginx-proxy.conf:
#
# Block IPs trying to use server as proxy.
#
# Matches e.g.
# 192.168.1.1 - - "GET http://www.something.com/
#
[Definition]
failregex = ^<HOST> -.*GET http.*
ignoreregex =

vim /etc/fail2ban/filter.d/nginx-noscript.conf
# Noscript filter /etc/fail2ban/filter.d/nginx-noscript.conf:
#
# Block IPs trying to execute scripts such as .php, .pl, .exe and other funny scripts.
#
# Matches e.g.
# 192.168.1.1 - - "GET /something.php
#
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =

vim /etc/fail2ban/filter.d/nginx-auth.conf
#
# Auth filter /etc/fail2ban/filter.d/nginx-auth.conf:
#
# Blocks IPs that fail to authenticate using basic authentication
#
[Definition]

failregex = no user/password was provided for basic authentication.*client: <HOST>
user .* was not found in.*client: <HOST>
user .* password mismatch.*client: <HOST>

ignoreregex =

vim /etc/fail2ban/filter.d/nginx-login.conf
#
# Login filter /etc/fail2ban/filter.d/nginx-login.conf:
#
# Blocks IPs that fail to authenticate using web application's log in page
#
# Scan access log for HTTP 200 + POST /sessions => failed log in
[Definition]
failregex = ^<HOST> -.*POST /sessions HTTP/1\.." 200
ignoreregex =

jail.local dosyasına aşağıdaki satırları dosyanın en altına ekleyelim


[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/*error.log
findtime = 600
bantime = 7200 # zaman
maxretry = 10

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx*/*error*.log
bantime = 600 # 10 dakika
maxretry = 6

[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 600 # 10 dakika
maxretry = 6

[nginx-badbots]
enabled = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 gun
maxretry = 1

[nginx-noscript]
enabled = true
action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript
logpath = /var/log/nginx*/*access*.log
maxretry = 6
bantime = 86400 # 1 gun

[nginx-proxy]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"]
filter = nginx-proxy
logpath = /var/log/nginx*/*access*.log
maxretry = 0
bantime = 86400 # 1 gun

fail2ban servisini restart yapalım


fail2ban Test İşlemleri

fail2ban loglarını monitor olarak izleyelim


tail -f /var/log/fail2ban.log
2014-04-28 14:16:02,840 fail2ban.actions: WARNING [nginx-req-limit] Ban 11.11.117.202
2014-04-28 14:16:02,848 fail2ban.actions: WARNING [nginx-req-limit] Ban 11.111.45.204
2014-04-28 14:16:03,857 fail2ban.actions: WARNING [nginx-req-limit] 11.11.45.204 already banned
2014-04-28 14:17:36,952 fail2ban.actions: WARNING [nginx-req-limit] Ban 11.11.201.114

Eğer hatalı yapılanma yaptığınız veya hiç endişelenecek bir log görmüyorsanız ve endişelenecek bir şey olduğunu düşünüyorsanız, aşağıdaki bölüme hata ayıklama kısmına göz atabilirsiniz.


fail2ban-client

Ayrıca aşağıdaki komutu kullanarak belirli bir banlanma durumunu öğrenmek için fail2ban-client konsol komutunu kullanabilirsiniz:


fail2ban-client status nginx-req-limit

Aşağıdaki gibi bir çıktı alacaksınız


Status for the jail: nginx-req-limit
|- filter
| |- File list: /var/log/nginx/xxx.com.error.log /var/log/nginx/xxx.com.error.log
| |- Currently failed: 6
| `- Total failed: 389
`- action
|- Currently banned: 3
| `- IP list: 111.211.117.202 111.187.45.204 111.216.201.114
`- Total banned: 3

3 adet ip adresinin banlandığı gözükmektedir.


Eğer bazı şeyler yapılandırıldığı gibi çalışmıyor ise


fail2ban Debug

fail2ban-client tarafından kullanılan yapılandırmaları görmek için aşağıdaki komutu çalıştırın:


fail2ban-client -d

fail2ban Debug filtre

fail2ban filtre, günlük log dosyasında çalıştığını görmek için aşağıdaki komutu çalıştırın:


fail2ban-regex /var/log/nginx/test.com.error.log  /etc/fail2ban/filter.d/nginx-req-limit.conf

Çıktı sonuna doğru aşağıdaki şekilde gibi bir mesaj verecektir


Success, the total number of match is 861

Hiç eşleşme yoksa filtre kısmında sorun olabilir.


Nginx ddos ataklarını kesmek için aşağıdaki yapılandırmayı kullanabilirsiniz.



vim /etc/nginx/nginx.conf
# Tek IP başına bağlantı sayısını sınırlamak
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
# Belirli bir oturum için istek sayısını sınırlamak
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;

# bütün sunucuyu üst değerler ile sınırlamak için
server {
limit_conn conn_limit_per_ip 10;
# Geciktirme bir patlama sırasında güncel olarak istenmiyorsa, Nodelay bayrak ekleyin.
limit_req zone=req_limit_per_ip burst=10 nodelay;
}