Giới thiệu về công cụ fail2ban và ứng dụng giảm thiểu tấn công DDoS

kaitoukid

Wh------
18/07/2014
26
31 bài viết
Giới thiệu về công cụ fail2ban và ứng dụng giảm thiểu tấn công DDoS
I. Fail2Ban là gì?

Fail2ban là 1 chương trình được viết bằng python có nhiệm vụ chặn các ip kết nối đến server dựa vào các dấu hiệu nghi ngờ mà ip đó để lại trong file log của hệ thống hoặc dịch vụ. Ví dụ như có quá nhiều lần sử dụng mật khẩu không hợp lệ, truy cập không hợp lệ hoặc các dấu hiệu bất thường khác mà có thể nhận biết được.


1.png

Mỗi luật trong fail2ban (jail) bao gồm 3 thành phần: luật lọc(filter) và luật chặn(action) và file log cần lọc. Fail2ban đếm số lần 1 ip vi phạm luật lọc(filter) trong 1 khoảng thời gian xác định, nếu số lần vi phạm vượt quá 1 ngưỡng cho trước thì ip đó sẽ bị chặn kêt nối đến server bởi luật chặn(action). Các thông số khoảng thời gian quét, ngưỡng giới hạn, thời gian chặn ip hay vị trí file log sẽ được cấu hình riêng cho từng jail.

II. File cấu hình trong fail2ban

1. Filter : /etc/fail2ban/filter.d/*

Như đã nói ở trên filter là điều kiện để xác định 1 ip có vi phạm luật hay không. Mỗi file filter chứa 1 đoạn mã regex có nhiệm vụ lọc ra các ip vị phạm luật trong file log hệ thống.

failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from ( via \S+)?\s*$
ignoreregex =


Vi dụ đoạn regex trong file sshd.conf lọc ra các ip ssh đến server với xác thực không hợp lệ trong file log hệ thống: auth.log.

2. Action: /etc/fail2ban/action.d/*

Mỗi luật acction được cấu hình bao gồm những lệnh iptables sau:

  • actionstart : Gọi ra khi khởi chạy dịch vụ fail2ban có nhiệm vụ tạo mới 1 bảng trong iptable để dễ quản lý các ip đã chặn theo từng luật jail.
  • actionstop: Gọi ra khi kết thúc dịch vụ fail2ban nhằm xóa bỏ những luật iptables được thêm vào trong qua trình fail2ban chạy.
  • actioncheck: kiểm tra xem 1 ip đã bị chặn với luât jail hay chưa. Tức là kiểm tra trong bảng chain của luật jạil đã có ip đó hay chưa.
  • actionban: lệnh iptables để chặn 1 ip
  • actionunban: lệnh iptables xóa bỏ luật chặn 1 ip sau khi hết thời gian chặn.
3. Jail: /etc/fail2ban/jail.conf

File jail.conf là file cấu hình tất cả các luật jail trong fail2ban. Thông số cấu hình cho 1 jail bao gồm:

  • Bantime: thời gian ip bị chặn nếu vi phạm luật jail
  • Findtime: khoảng thời gian quét cho 1 luật jail
  • Maxretry: ngưỡng vị phạm trong khoảng thời gian findtime
  • Banaction: Luật action (tên file action.conf)
  • Port: cổng chặn kết nối đến server
  • Filter: tên file cấu hình luật filter
  • Logpath: đường dẫn đến file log hệ thống,ứng dụng
  • Action: lựa chọn 1 trong 3 chế độ: chỉ chặn ip, chặn ip và gửi mail thông báo, chăn ip, gửi mail thông báo và ghi ra log
III. Giới thiệu luật mặc định trong fail2ban

Fail2ban chặn ip dựa vào dấu hiệu để lại trong file log dịch vụ hoặc hệ thống, do fail2ban có thể quản lý việc xác thực, truy cập không hợp lệ của rất nhiều dịch vụ trên hệ thống, miễn là dịch vụ đó có ghi log các ip kết nối đến và có thể nhận biết mối nguy hại từ những dòng log đó là được.

Fail2ban được cấu hình mặc định hỗ trợ 1 số dịch vụ như: SSH, Các dịch vụ webserver, Apache, Nginx, Lighttpd, Roundcube, SOGo, FTP, Proftpd, Postfix SMTP, Courier SMTP, Dovecot pop3/imap server, MySQL, Bind9, Asterisk, Fail2ban.
Có thể tăng thời gian bị chặn đối với những ip vi phạm quá nhiều luật của Fai2lban bằng cách đọc chính file log của fail2ban.

Dưới đây tôi sẽ giới thiệu 1 luật mặc định cơ bản của fail2ban để mọi người dễ hình dung: ssh

1. SSH: luật ssh được xây dựng nhằm mục đích hạn chế tấn công brute force đến server SSH trên hệ thống.

a. Filter: sshd.conf


failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from ( via \S+)?\s*$
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from \s*$
^%(__prefix_line)sFailed \S+ for .*? from (?: port \d*)?(?: ssh\d*)?:) (ruser .*|(\S+ ID \S+ [imath]serial \d+[/imath] CA )?\S+ %(__md5hex)s(, client user ".*", client host ".*")?))?\s*$
^%(__prefix_line)sROOT LOGIN REFUSED.* FROM \s*$
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from \s*$
^%(__prefix_line)sUser .+ from not allowed because not listed in AllowUsers\s*$
^%(__prefix_line)sUser .+ from not allowed because listed in DenyUsers\s*$
^%(__prefix_line)sUser .+ from not allowed because not in any group\s*$
^%(__prefix_line)srefused connect from \S+ \(\)\s*$
^%(__prefix_line)sUser .+ from not allowed because a group is listed in DenyGroups\s*$
^%(__prefix_line)sUser .+ from not allowed because none of user's groups are listed in AllowGroups\s*$

ignoreregex =

Với luật filter ở trên sẽ lọc ra những hoạt động không hợp lệ trên dịch vụ SSH từ file log.

b. Acction : iptables-multiport.conf

actionstart = iptables -N fail2ban-
iptables -A fail2ban- -j RETURN
iptables -I -p -m multiport --dports -j fail2ban-
actionstop = iptables -D -p -m multiport --dports -j fail2ban-
iptables -F fail2ban-
iptables -X fail2ban-
actioncheck = iptables -n -L | grep -q 'fail2ban-[ \t]'
actionban = iptables -I fail2ban- 1 -s -j
actionunban = iptables -D fail2ban- -s -j
blocktype = REJECT --reject-with icmp-port-unreachable

c. Jail: jail.conf

[ssh] # tên luật

enabled = true # luật đang được bật
port = ssh # cổng chặn : ssh (22) có thể cấu hình các cổng khác thêm vào
filter = sshd # file cấu hình filter sshd.conf
logpath = /var/log/auth.log # file log hệ thống
maxretry = 6 # 6 lần thao tác không hợp lệ
Những tham số không được khai báo sẽ được sử dụng giá trị mặc định:
bantime = 600 # khoảng thời gian chặn ip
findtime = 600 # ngưỡng thời gian
banaction = iptables-multiport # luật action
protocol = tcp # giao thức

Và nhiều tham số mặc định khác nữa, các bạn có thể đọc thêm trong file cấu hình jail.conf

IV. Sử dụng Fail2ban chặn ip có số request đến server vượt quá ngưỡng nhất định

Bên cạnh việc kiểm soát những truy cập không hợp lệ fail2ban còn được sử dụng để chặn 1 số kiểu tấn công http ddos. Sau đây tôi xin giới thiệu cách cấu hình đơn giản cho fail2ban để chặn ip có số request http đến server vượt quá ngưỡng nhất định, sử dụng file log của webserver.

Tùy vào tính chất của mỗi website và cấu hình vật lý của server mà có các ngưỡng khác nhau, ở đây tôi sẽ xây dựng luật chặn những ip có số lượng request đến server trong 30 giây lớn hơn 15000 request.

  • Đầu tiên là luật filter, tạo mới 1 file cấu hình /etc/fail2ban/filter.d/http.conf với nội dung:
[Definition]
failregex = ^ - -.*$ # mã regex càng đơn giản thì chương trình chạy càng nhanh, cần tối ưu hóa đoạn mã regex để fail2ban hoạt động hiệu quả nhất, cần sửa lại đoạn regex
ignoreregex = # thêm những trường hợp không kiểm tra luật để hạn chế công việc của fail2ban

  • Action ở đây tôi sử dụng file action mặc định: iptables-multiport.conf
  • Thêm luật jail bằng cách ghi chèn nội dung sau vào file jail.conf:
[http] # tên của luật

enabled = true # bật hay tắt luật
port = http,https,8008 # cổng sẽ bị chặn trong iptables
filter = http # file cấu hình filter
logpath = /var/log/nginx/access.log # file log của webserver
bantime = 2000 # thời gian chặn ip theo giây.
findtime = 30 # khoảng thời gian quét 30 giây
maxretry = 15000 # 15000 request /30 giây
banaction = iptables-multiport # file cấu hình action

Thực nghiệm trên máy ảo có cấu hình cpu Intel(R) Xeon(R) CPU E5520 2 core - 2.27GHz, ram 4GB, sử dụng tool ddos hping3, cho thấy fail2ban hoạt động bình thường, có thể chặn cùng lúc 2 ip ở ngưỡng 15000request/30s.

Trên đây là bài giới thiệu của tôi về công cụ fail2ban và ứng dụng trong việc chặn tấn công http ddos. Mọi thắc mắc về bài viết xin vui lòng để lại ở comment bên dưới. Tôi rất vui lòng giải đáp các bạn. Xin cảm ơn.
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Thẻ
ddos fail2ban
Bên trên