Ca Pham

~ I'm DaD ~
Ca Pham

Ca Pham Created 12 Posts

May 5, 2021

Use Fail2ban to secure server

Fail2ban là gì?
Trang chủ của Fail2ban: https://www.fail2ban.org
Fail2ban là 1 chương trình 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.

Fail2ban được viết bằng ngôn ngữ lập trình python.

Fail2ban sẽ thêm những quy tắc mới vào trong iptables để chặn địa chỉ IP của kẻ tấn công trong thời gian nhất định hoặc vĩnh viễn.

Fail2ban có thể cảnh báo qua email cho admin biết rằng đang có một cuộc tấn công vào máy chủ.

Cài đặt Fail2ban
Trên Centos7
Cập nhật EPEL lên mới nhất
yum update && yum install epel-release
Cài Fail2ban
yum install fail2ban
Cài đặt Sendmail để Fail2ban có thể gửi mail cảnh báo. Đây chỉ là option.
yum install sendmail
Start and enable Fail2ban and Sendmail
systemctl start fail2ban
systemctl enable fail2ban
systemctl start sendmail
systemctl enable sendmail
Note: có thể sẽ gặp lỗi “no directory /var/run/fail2ban to contain the socket file /var/run/fail2ban/fail2ban.sock“. Mình phải tạo thư mục bằng lệnh sau:

mkdir /var/run/fail2ban
Trên Ubuntu
Cập nhật server lên mới nhất
apt-get update && apt-get upgrade -y
Cài đặt Fail2ban
apt-get install fail2ban
Cài đặt xong thì service sẽ tự động start.

Cài đặt thêm Sendmail nếu muốn
apt-get install sendmail
Cho phép ssh access qua UFW và enable firewall
ufw allow ssh
ufw enable
Tìm hiểu các thành phần có trong Fail2ban
Thành phần chính trong Fail2ban chính là luật (jail). Mỗi luật bao gồm 3 thành phần:

Luật lọc (filter)
Luật chặn (action)
File log cần lọc
Fail2ban đếm số lần 1 ip vi phạm luật lọc (filter) trong một khoảng thời gian xác định, nếu số lần vi phạm vượt quá một 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 loại jail.

Filter: /etc/fail2ban/filter.d/*
Như đã nói ở trên thì filter là điều kiện để xác định một IP có vi phạm luật hay không. Mỗi file filter chứa một đoạn mã regex có nhiệm vụ lọc ra các IP vi phạm luật trong file log hệ thống (do đó yêu cầu bạn phải có hiểu biết ít nhất là mức cơ bản về regex).

failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from ( via \S+)?\s*$
ignoreregex =
Ví dụ trên là một đoạn regex trong file sshd.conf dùng để 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

Action: /etc/fail2ban/action.d/*
Mỗi luật action được cấu hình bao gồm những lệnh iptables sau:

actionstart: Được gọi ra khi khởi chạy dịch vụ fail2ban, có nhiệm vụ tạo mới một bảng trong iptable để dễ quản lý các IP đã chặn theo từng luật jail
actionstop: Được gọi ra khi kết thúc dịch vụ fail2ban nhằm xoá bỏ những luật iptables được thêm vào trong quá trình fail2ban chạy
actioncheck: kiểm tra xem một IP đã bị chặn với luật jail hay chưa. Có nghĩa là kiểm tra trong bảng chain của luật jail đã có IP đó hay chưa
actionban: Lệnh iptables để chặn một IP
actionunban: Lệnh iptables xoá bỏ luật chặn một IP sau khi hết thời gian chặn.
Jail: /etc/fail2ban/jail.conf

File này là cấu hình tất cả các luật jail trong fail2ban. Thông số cấu hình cho một jail bao gồm các thành phần chính sau:

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 một luật jail
Maxretry: ngưỡng vi 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
Tìm hiểu file cấu hình mặc định của Fail2ban
File cấu hình fail2ban.conf
fail2ban.conf là file cấu hình mặc định của Fail2ban. Nếu muốn thay đổi bất cứ thứ gì, tốt nhất là hãy copy nó ra một file riêng biệt và thay đổi trên đó. Mình hay làm như sau:

cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
Các thông số cơ bản trong file fail2ban.local mà mình cần tìm hiểu:

loglevel: các mức độ mặc định của log trong Fail2ban theo thứ tự sau: 1 (error), 2 (warn), 3 (info), or 4 (debug).
logtarget: Ghi log của Fail2ban vào file đặc biệt. Mặc định mọi gía trị sẽ được ghi vào file /var/log/fail2ban.log . Tuy nhiên cũng có thể ghi theo từng loại như sau:
STDOUT: xuất ra dữ liệu bất kì
STDERR: xuất ra lỗi bất kì
SYSLOG: log của hệ thống
FILE: ghi vào một file cụ thể
socket: vị trí của file socket
pidfile: vị trí của file PID
File cấu hình jail. conf
File fail2ban.conf mặc định sẽ apply cho SSH trên hệ điều hành Debian và Ubuntu, tuy nhiên không cho Centos. Do đó để cấu hình cho Centos ta cần phải copy ra 1 file khác và sửa lại một ít các thông số. Cụ thể mình làm như sau:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Để sử dụng được file này cho hệ điều hành Centos hoặc Fedora ta cần phải thay đổi giá trị của tham số backend từ auto sang systemd. Việc này tất nhiên là ko cần thiết cho hệ điều hành Debian8 và Ubuntu 16.04 mặc dù cả 2 đều sử dụng systemd.

/etc/fail2ban/jail.local

“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
Mặc định Centos7 sẽ không có jails nào được bật. Do đó mình phải bật lên bằng cách thêm vào giá trị trong file jail.local. Ví dụ mình sẽ bật jail cho SSH:

/etc/fail2ban/jail.local
[sshd]
enabled=true
Sử dụng Fail2ban chặn IP có số request vượt ngưỡng nhất định
Đây chính là cách chặn kiểu tấn công http ddos. Ví dụ cụ thể: Chặn những IP có số lượng request đến server trong 30 giây lớn hơn 15000 request. Tất nhiên là tuỳ thuộc vào tính chất của mỗi server và cấu hình vật lý để ra những ngưỡng khác nhau.

Luật filter: Tạo mới 1 file cấu hình: /etc/fail2ban/filter.d/http.conf với nội dung như sau:

[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
Luật Action: Sử dụng file cấu hình mặc định iptables-multiport.conf

Luật jail: Thêm nội dung dưới đây 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 # tên file cấu hình filter (file được tạo ở luật filter trên: /etc/fail2ban/filter.d/http.conf)
logpath = /var/log/nginx/access.log # file log của webserver (ở đây mình dùng nginx làm web server)
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
Vậy là xong rồi đấy.

Tìm hiểu cách viết Regex cho Fail2ban
Viết Regex dựa vào cấu trúc trong file log.
Giả định ta có file log của website như sau:

/var/www/example.com/logs/access.log
123.45.67.89 - - [01/Oct/2015:12:46:34 -0400] “POST /wp-login.php HTTP/1.1” 200 1906 “http://example.com/wp-login.php” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0”
Lưu ý rằng ta chỉ track up tới đoạn 200 do đó đoạn tex thật sự ta cần viết Regex sẽ là:

123.45.67.89 - - [01/Oct/2015:12:46:34 -0400] “POST /wp-login.php HTTP/1.1” 200
IP luôn được định nghĩa là
Các ký tự đặc biệt khi dùng trong Regex luôn có dấu “\” ở trước.
Giá trị ngày “01” là số với 2 chữ số: Regex sẽ viết là: “\d{2}”
Giá trị tháng “Oct” là ký tự chữ có 3 ký tự: Regex sẽ viết là “\w{3}”
Giá trị năm “2015” là số có 4 chữ số do đó Regex sẽ viết là: “\d{4}”
3 giá trị giờ, phút, giây là số có 2 chữ số do đó Regex sẽ viết là: “\d{2}”. Ngoài ra ta có thể sử dụng lại Regex đã viết cho giá trị ngày (ở vị trí số 1) nên viết như sau: “\1”
Giá trị “0400” tương tự như giá trị của năm.

Cuối cùng ta được chuỗi Regex như sau:

- - [(\d{2})/\w{3}/\d{4}:\1:\1:\1 -\d{4}] “POST /wp-login.php HTTP/1.1” 200
Dấu ngoặc đơn dùng trong “(\d{2})” để nhóm các ký tự lại.
Hoặc cũng có thể viết như sau:

- - [\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} -\d{4}] “POST /wp-login.php HTTP/1.1” 200
Apply FailRegex
Công việc tiếp theo ta ứng dụng regex đã viết ở trên vào cho Fail2ban. Cụ thể là dùng cho luật filter. Tao file wordpress.conf như sau:

touch /etc/fail2ban/filter.d/wordpress.conf
Nội dung của file sẽ như sau:

/etc/fail2ban/filter.d/wordpress.conf

Fail2Ban filter for WordPress

[Definition]

failregex = - - [(\d{2})/\w{3}/\d{4}:\1:\1:\1 -\d{4}] “POST /wp-login.php HTTP/1.1” 200
ignoreregex =
Tiếp theo cần khai báo trong jail.local để active luật filter ở trên.

/etc/fail2ban/jail.local
[wordpress]
enabled = true
filter = wordpress
logpath = /var/www/html/xxx/logs/access.log
port = 80,443
Cuối cùng ta restart lại Fail2ban.