Fail2ban là gì?
Fail2ban là ứng dụng phân tích log có thể theo dõi logs hệ thống, để biết được các triệu chứng của một cuộc tấn công vào server của bạn. Khi thiết lập các tham số xác định trước, Fail2ban sẽ thêm một rule mới vào iptables để block địa chỉ IP của attacker trong một khoảng thời gian được định nghĩa trước hoặc là mãi mãi. Fail2ban cũng có thể gửi cảnh báo cho bạn thông qua email khi mà cuộc tấn công có thể đang xảy ra.
Xem thêm: Rootkit là gì? Có thể phát hiện được không
Fail2ban chủ yếu tập trung vào các cuộc tấn công SSH là chính, mặc dù nó có thể được cấu hình để hoạt động trên bất kỳ dịch vụ nào có sử dụng file log và có thể là đối tượng bị can thiệp.
Hướng dẫn cài đặt Fail2ban
Các bạn hãy làm theo các bước hướng dẫn dưới đây để cấu hình cơ bản Fail2ban.
Đôí với CentOS 7
1. Đảm bảo hệ thống của bạn đã được cập nhật thời gian và cài đặt EPEL repository
yum update && yum install epel-release
2. Cài đặt Fail2ban
yum install fail2ban
3. Cài đặt Sendmail nếu bạn muốn nhận cảnh báo qua email. Sendmail không phải bắt buộc đối với Fail2ban
yum install sendmail
4. Start và enable Fail2ban nếu cần thiết
systemctl start fail2ban
systemctl enable fail2ban
systemctl start sendmail
systemctl enable sendmail
Debian
1. Đảm bảo thời gian được cập nhật đúng
apt-get update && apt-get upgrade -y
2. Cài đặt Fail2ban
apt-get install fail2ban
Service sẽ tự động được start
3. (Tùy chọn) Nếu bạn muốn nhận email cảnh báo thì cài đặt Sendmail
apt-get install sendmail-bin sendmail
Ubuntu
1. Đảm bảo cập nhật đúng thời gian
apt-get update && apt-get upgrade -y
2. Cài đặt Fail2ban
apt-get install fail2ban
3. (Tùy chọn) Nếu bạn muốn nhận email cảnh báo thì cài đặt Sendmail
apt-get install sendmail
4. Cho phép SSH truy cập thông qua UFW và sau đó enable firewall
ufw allow ssh
ufw enable
Hướng dẫn cấu hình Fail2ban
Fail2ban đọc các file cấu hình có đuôi .conf đầu tiên, sau đó là các file .local sẽ có thể được sử dụng để ghi đè bất kỳ các thiết lập nào khác trước đó. Do đó, tất cả những thay đổi đối với cấu hình mặc định của Fail2ban thường được thực hiện trong file .local, tốt nhất là bạn không nên đụng chạm gì vào file .conf
Cấu hình fail2ban.local
1. fail2ban.conf chứa các thông tin cấu hình mặc định. Các thiết lập mặc định sẽ giúp cho bạn thiết lập cấu hình một cách hợp lý hơn. Nếu bạn muốn thay đổi bất kỳ thông tin nào, tốt nhất bạn nên thực hiện trong một file riêng – fail2ban.local là file mà sẽ ghi đè fail2ban.conf.
Đổi tên fail2ban.conf thành fail2ban.local.
cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
2. Từ đây, bạn có thể chỉnh sửa bất kỳ thông tin cấu hình nào trong file fail2ban.local để đáp ứng những gì bạn mong muốn. Những giá trị có thể thay đổi là:
- loglevel: mức độ chi tiết mà log của fail2ban sẽ cung cấp – có thể được thiết lập thành 1 (error), 2 (warn), 3 (info), 4 (debug)
- logtarget: hành động ghi log tới một file nào đó cụ thể. Giá trị mặc định là /var/log/fail2ban.log nên tất cả log sẽ được ghi vào trong file này.
- STDOUT: xuất ra bất kỳ kiểu dữ liệu nào
- STDERR: xuất ra bất kỳ lỗi nào
- SYSLOG: message-based logging
- FILE: output ra file
- socket: vị trí file socket
- pidfile: vị trí PID file
Cấu hình thiết lập jail.local
1. file jail.local sẽ cho phép Fail2ban hoạt động theo mặc định đối với Debian hoặc Ubuntu. Tất cả các giao thức và cấu hình khác (HTTP, FTP,..) đều bị comment lại. Nếu như bạn muốn thay đổi thông tin này, thì chỉ cần tạo ra một file jail.local mới.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
2. Nếu như bạn đang sử dụng Fedora hoặc CentOS thì bạn sẽ cần phải thay đổi một chút phần backend trong jail.local từ auto sang systemd. Việc này không cần thiết phải thực hiện trên Debian 8 hoặc Ubuntu 16.04 trở lên.
# "backend" specifies the backend used to get files modification.
# Available options are "pyinotify", "gamin", "polling", "systemd" and "auto".
# This option can be overridden in each jail as well.
. . .
backend = systemd
Để cho phép hoạt động chặn trên một ứng dụng như SSH, comment những dòng dưới đây:
[sshd]
enabled = true
Whitelist IP
Để bỏ qua một số địa chỉ IP mà ta không muốn chặn, đơn giản bạn chỉ cần thêm địa chỉ IP hoặc subnet vô trong phần ignoreip như sau:
[DEFAULT]
# "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 123.45.67.89
Thời gian chặn và số lần thử tối đa
Thiết lập bantime, findtime và maxtry để định nghĩa các trường hợp cấm và thời gian cấm cụ thể.
# "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 = 3
- bantime: thời gian bị cấm theo giây cho mỗi địa chỉ IP khi bị cấm. Nếu như bạn thiết lập con số này thành số âm, thì thời gian bị cấm sẽ là vĩnh viễn. Thời gian mặc định bị cấm là 600 – tương đương 10 phút.
- findtime: Thời gian giữa các lần thử trước khi lệnh cấm được thiết lập. Ví dụ, nếu bạn thiết lập địa chỉ IP bị cấm sau 5 lần đăng nhập không thành công, 5 lần đăng nhập này đều phải diễn ra trong thời gian 10 phút đã được thiết lập.
- maxretry: số lượng tôí đa lượt truy cập được thực hiện từ một địa chỉ IP trước khi bị cấm.
Nhận cảnh báo Email
Để nhận cảnh báo email khi Fail2ban được kích hoạt, đơn giản chỉ cần chỉnh sửa một số thông tin cơ bản sau:
- destemail: địa chỉ email bạn muốn nhận
- sendername: tên được sử dụng trong email
- sender: địa chỉ email được gửi từ Fail2ban
Bạn cũng cần phải chỉnh sửa thiết lập action – định nghĩa các hành động xảy ra khi đáp ứng ngưỡng cấm. Mặc định, %(action_)s chỉ cấm user, còn %(action_mw)s sẽ cấm và gửi email.
Một số thông tin cấu hình cấm khác
Ngoài các thiết lập cơ bản bên trên ra, jail.local còn chứa các cấu hình cấm một số dịch vụ khác nữa như SSH và iptables. Theo mặc định, chỉ có SSH được kích hoạt và hành động cấm dựa trên iptables rule.
# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
banaction = iptables-multiport
banaction_allports = iptables-allports
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
- banaction: Xác định hành động khi đạt tới ngưỡng. Nếu bạn đã cấu hình firewall để sử dụng, thì để giá trị này là firewallcmd-ipset và nếu bạn đã cấu hình firewall để sử dụng UFW thì set giá trị này thành ufw.
- banaction_allports: Block tất cả các port đối với một địa chỉ IP. Nếu bạn đã cấu hình firewall để sử dụng firewall thì set giá trị này thành firewallcmd-ipset.
- enabled: Xác định bộ lọc có được cho phép hoạt động không
- port: Port mà Fail2ban sử dụng để sử dụng bộ lọc. Theo mặc định, tên dịch vụ có thể được dùng ở đây đối với các dịch vuj sử dụng port mặc định, nếu như bạn thay đổi port mặc định của các dịch vụ này thì sẽ không thể sử dụng tên dịch vụ được nữa. Ví dụ: port mặc định của SSH là 22, bạn có thể sử dụng tên dịch vụ là ssh, nhưng nếu bạn đổi port SSH thành 234 – thì tên dịch vụ sẽ không sử dụng được nữa.
- filter: tên file nằm ở vị trí /etc/fail2ban/filter.d lưu thông tin failregex được sử dụng để parse file log tương ứng – có hậu tố là .conf.
- maxretry: Sẽ ghi đè giá trị maxretry global đã được định nghĩa cho các dịch vụ trước. findtime và bantime cũng có thể được thêm vào.
- action: các hành động thiết lập bổ sung trong trường hợp các hành động mặc định không phù hợp với các quy tắc áp dụng cho dịch vụ cụ thể.
FailregexsPermalink
Mặc dù Fail2ban đem đến rất nhiều bộ lọc khác nhau, nhưng bạn đôi khi vẫn phải tùy chỉnh những bộ lọc này để đáp ứng theo nhu cầu riêng. Fail2ban sử dụng reguler expressions (regex) để parse file log, tìm kiếm các trường hợp bất thường. Fail2ban sử dụng extention regex của python.
Cách tốt nhất để hiểu cách failregex hoạt động ra sao là bạn nên viết thử một đoạn regex xem thế nào.
Hướng dẫn viết Regex cho Fail2ban đơn giản
1. Gỉa sử bạn truy cập đến file access.log của website được /var/www/example.com/logs/access.log và thấy trong log có một số trường hợp đăng nhập thất bại.
123.45.67.89 - - [02/Oct/2019:12:46:34 -0400] "POST /wp-login.php HTTP/1.1" 200
2. Địa chỉ IP từ trường hợp cố đăng nhập fail nhiều lần thường có dạng <HOST>. Một số ký tự khác đi kèm đằng sau đó gần như không thay đổi.
<HOST> - - \[
Dấu \ đằng trước [ xác định phần tiếp sau đó sẽ được đọc trực tiếp
3. Phần tiếp theo, là thời gian đăng nhập fail – có thể được viết dưới dạng regex expressions. Vị trí đầu tiên, 01 trong ví dụ này có thể được viết thành (\d{2}) : trong đó dấu ngoặc đơn nhóm biểu thức, \d đằng trước đại diện là một chữ số. {2} mang ý nghĩa là sẽ có 2 chữ số liên tiếp.
Do đó 01 sẽ được viết như sau:
<HOST> - - \[(\d{2})
Dấu gạch chéo phía sau đó sẽ đọc chuỗi regex tiếp theo để xác định tháng, theo sau là \w{3} nghĩa là sẽ tìm kiếm một chuỗi 3 ký tự (A-Z, 0-9,…)
<HOST> - - \[(\d{2})/\w{3}/
Phần tiếp theo là năm, về cách viết tương tự như ngày mình đã trình bày ở trên, nhưng không cần phải nhóm lại – sẽ bao gồm 4 chữ số.
<HOST> - - \[(\d{2})/\w{3}/\d{4}:
4. Chuỗi tiếp theo sẽ là chuỗi 2 chữ số tạo nên thời gian. Bởi mình đã định nghĩa ngày của tháng bao gồm 2 chữ số như bên trên trong một nhóm (dấu ngoặc đơn), chúng ta có thể thay thể dấu ngoặc đó bằng cách sử dụng \1, do đó 2 chữ số sẽ được biểu diễn như sau:
<HOST> - - \[(\d{2})/\w{3}/\d{4}:::
Nếu như bạn không muốn viết regex một cách rời rạc, bạn có thể sử dụng tương tự như cách ban đầu bằng cách gộp nhóm
<HOST> - - \[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}
5. Đoạn -0004 sẽ được viết tương tự như cách bạn viết regex theo năm, chỉ có điều sẽ có thêm dấu – đằng trước. Khi đó regex sẽ được viết như sau: -\d{4}
<HOST> - - \[(\d{2})/\w{3}/\d{4}::: -\d{4}\] "POST /wp-login.php HTTP/1.1" 200
Hoặc
<HOST> - - \[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} -\d{4}\] "POST /wp-login.php HTTP/1.1" 200
Cách áp dụng FailregexPermalink
Với chuỗi failregex mình đã tạo ở trên, lúc này mình sẽ thêm vào bộ lọc
1. Di chuyển đến thư mục filter.d của Fail2ban
cd /etc/fail2ban/filter.d
2. Tạo file wordpress.conf và thêm failregex của bạn vào
# Fail2Ban filter for WordPress
#
#
[Definition]
failregex = <HOST> - - \[(\d{2})/\w{3}/\d{4}::: -\d{4}\] "POST /wp-login.php HTTP/1.1" 200
ignoreregex =
3. Thêm bộ lọc wordpress ở trên vào jail.local
[wordpress]
enabled = true
filter = wordpress
logpath = /var/www/html/andromeda/logs/access.log
port = 80,443
Bộ lọc wordpress này sẽ sử dụng cấu hình ban và alert email mặc định. Các hành động khác bạn muốn thêm vào thì chỉ cần thêm dòng action = vào.
Lưu lại và thoát ra, sau đó restart Fail2ban