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.
apt-get install fail2ban
jail config basit bir şekilde yapılandıralım
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 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 =
# 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 [url]http://www.something.com/[/url] # [Definition] failregex = ^<HOST> -.*GET http.* ignoreregex =
# 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 =
# # 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 =
# # 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 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.
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-client tarafından kullanılan yapılandırmaları görmek için aşağıdaki komutu çalıştırın:
fail2ban-client -d
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; }
Yorumlar