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;
}