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

  1. Cập nhật EPEL lên mới nhất
    yum update && yum install epel-release
  2. Cài Fail2ban
    yum install fail2ban
  3. Cài đặt Sendmail để Fail2ban có thể gửi mail cảnh báo. Đây chỉ là option.
    yum install sendmail
  4. 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

  1. Cập nhật server lên mới nhất
    apt-get update && apt-get upgrade -y
  2. Cài đặt Fail2ban
    apt-get install fail2ban

    Cài đặt xong thì service sẽ tự động start.

  3. Cài đặt thêm Sendmail nếu muốn
    apt-get install sendmail
  4. 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.

# "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:

[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:

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:

<HOST> - - \[(\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:

<HOST> - - \[\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:

# Fail2Ban filter for WordPress
#
#

[Definition]

failregex = <HOST> - - \[(\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.

[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.

Leave a Reply

Your email address will not be published. Required fields are marked *