Table of Contents

No table of contents

Cách Fail2Ban hoạt động để bảo vệ dịch vụ trên máy chủ Linux

Posted on: 29 tháng 9 năm 2023

Giới thiệu

SSH thực tế là phương thức kết nối với máy chủ đám mây. Nó bền và có thể mở rộng — khi các tiêu chuẩn mã hóa mới được phát triển, chúng có thể được sử dụng để tạo SSH keys mới, đảm bảo rằng giao thức cốt lõi vẫn được an toàn. Tuy nhiên, không có giao thức hoặc software stack nào là hoàn toàn an toàn, và SSH được triển khai rộng rãi trên internet có nghĩa là nó đại diện cho một attack surface hoặc attack vector có thể dự đoán được mà qua đó mọi người có thể cố gắng truy cập.

Bất kỳ dịch vụ nào tiếp xúc với mạng đều là mục tiêu tiềm năng theo cách này. Nếu bạn xem lại nhật ký cho dịch vụ SSH chạy trên bất kỳ máy chủ nào được quản lý rộng rãi, bạn sẽ thường thấy các nỗ lực đăng nhập có hệ thống, lặp đi lặp lại thể hiện các cuộc tấn công brute force của người dùng cũng như bot. Mặc dù bạn có thể thực hiện một số tối ưu hóa cho dịch vụ SSH của mình để giảm khả năng thành công của các cuộc tấn công này xuống gần như bằng 0, chẳng hạn như vô hiệu hóa xác thực mật khẩu thay vì SSH keys, nhưng chúng vẫn có thể gây ra một số trách nhiệm pháp lý nhỏ liên tục.

Việc triển khai sản xuất quy mô lớn, mà trách nhiệm pháp lý này hoàn toàn không được chấp nhận, sẽ thường triển khai VPN như WireGuard trước dịch vụ SSH của họ, do đó không thể kết nối trực tiếp với cổng SSH mặc định 22 từ internet bên ngoài mà không có sự trừu tượng hóa phần mềm bổ sung hoặc cổng. Các giải pháp VPN này được nhiều người tin cậy nhưng sẽ tăng thêm độ phức tạp, và có thể phá vỡ một số quy trình tự động hóa hoặc các mối liên kết phần mềm nhỏ khác.

Trước hoặc ngoài việc cam kết thiết lập VPN đầy đủ, bạn có thể triển khai một công cụ có tên Fail2ban. Fail2ban có thể giảm thiểu đáng kể các cuộc tấn công brute force bằng cách tạo các quy tắc tự động thay đổi cấu hình tường lửa của bạn để cấm các IP cụ thể sau một số lần đăng nhập không thành công. Điều này sẽ cho phép máy chủ của bạn tự tăng cường khả năng chống lại những nỗ lực truy cập này mà không cần sự can thiệp của bạn.

Trong một hướng dẫn khác, chúng tôi đã thảo luận về Cách bảo vệ SSH bằng Fail2ban. Trong hướng dẫn này, chúng ta sẽ thảo luận sâu hơn về cách Fail2ban thực sự hoạt động và cách bạn có thể sử dụng kiến thức này để sửa đổi hoặc mở rộng hoạt động của dịch vụ này.

Nguyên tắc cơ bản của Fail2ban

Mục đích của Fail2ban là giám sát nhật ký của các dịch vụ phổ biến để phát hiện các mẫu lỗi xác thực.

Khi Fail2ban được định cấu hình để giám sát nhật ký của một dịch vụ, nó sẽ xem xét bộ lọc (filter) đã được định cấu hình cụ thể cho dịch vụ đó. Bộ lọc được thiết kế để xác định lỗi xác thực cho dịch vụ cụ thể đó thông qua việc sử dụng các biểu thức chính quy phức tạp. Biểu thức chính quy là ngôn ngữ tạo khuôn mẫu phổ biến được sử dụng để khớp mẫu. Nó định nghĩa các mẫu biểu thức chính quy này thành một biến nội bộ gọi là failregex.

Theo mặc định, Fail2ban bao gồm các tệp bộ lọc cho các dịch vụ phổ biến. Khi nhật ký từ bất kỳ dịch vụ nào, chẳng hạn như máy chủ web, khớp với failregex trong bộ lọc của dịch vụ đó, một hành động xác định trước sẽ được thực thi cho dịch vụ đó. action là một biến có thể được cấu hình để thực hiện nhiều việc khác nhau, tùy thuộc vào sở thích của quản trị viên.

Hành động mặc định là cấm địa chỉ máy chủ/IP vi phạm bằng cách sửa đổi các quy tắc tường lửa cục bộ. Ví dụ: bạn có thể mở rộng hành động này để gửi email đến quản trị viên hệ thống của mình.

Theo mặc định, hành động sẽ được thực hiện khi phát hiện ba lỗi xác thực trong 10 phút và thời gian cấm mặc định là 10 phút. Đây là cấu hình.

Khi sử dụng tường lửa iptables mặc định, fail2ban sẽ tạo một bộ quy tắc tường lửa mới, còn được gọi là chuỗi, khi dịch vụ được khởi động. Nó thêm một quy tắc mới vào chuỗi INPUT để gửi tất cả lưu lượng TCP hướng đến cổng 22 tới chuỗi mới. Trong chuỗi mới, nó chèn một quy tắc duy nhất quay trở lại chuỗi INPUT. Chuỗi và các quy tắc liên quan sẽ bị xóa nếu dịch vụ Fail2ban bị dừng.

Khám phá cài đặt dịch vụ Fail2ban

Fail2ban được cấu hình thông qua một số tệp nằm trong hệ thống phân cấp trong thư mục /etc/fail2ban/.

Tệp fail2ban.conf định cấu hình một số cài đặt vận hành như cách daemon ghi thông tin cũng như tệp socket và pid mà nó sẽ sử dụng. Tuy nhiên, cấu hình chính được chỉ định trong các tệp xác định “jails” cho mỗi ứng dụng.

Theo mặc định, fail2ban gửi kèm theo tệp jail.conf. Tuy nhiên, điều này có thể bị ghi đè trong các bản cập nhật, vì vậy bạn nên sao chép tệp này vào tệp jail.local và thực hiện các điều chỉnh tại đó.

Nếu bạn đã có tệp jail.local, hãy mở tệp đó bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn:

  1. sudo nano /etc/fail2ban/jail.local

Nếu bạn chưa có tệp jail.local hoặc tệp bạn mở trống, hãy sao chép tệp jail.conf rồi mở tệp mới:

  1. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  2. sudo nano /etc/fail2ban/jail.local

Chúng ta sẽ xem xét các tùy chọn có sẵn ở đây và xem tệp này tương tác với các tệp cấu hình khác trên hệ thống như thế nào.

Phần mặc định

Phần đầu tiên của tệp sẽ xác định các giá trị mặc định cho chính sách fail2ban. Các tùy chọn này có thể được ghi đè trong phần cấu hình của từng dịch vụ riêng lẻ.

Khi các nhận xét bị xóa, toàn bộ phần mặc định trông giống như thế này:

/etc/fail2ban/jail.local
[DEFAULT]

ignoreip = 127.0.0.1/8
bantime = 10m
findtime = 10m
maxretry = 3
backend = auto
usedns = warn
destemail = root@localhost
sendername = Fail2Ban
banaction = iptables-multiport
mta = sendmail
protocol = tcp
chain = INPUT
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
action = %(action_)s

Chúng ta hãy xem xét ý nghĩa của một số điều này:

  • ignip: Tham số này xác định các địa chỉ IP mà hệ thống cấm sẽ bỏ qua. Theo mặc định, điều này chỉ được đặt để bỏ qua lưu lượng truy cập đến từ chính máy, do đó bạn không điền vào nhật ký của riêng mình hoặc tự khóa bản thân.
  • bantime: Tham số này đặt độ dài của lệnh cấm, tính bằng giây. Mặc định là 10 phút.
  • findtime: Tham số này đặt cửa sổ mà Fail2ban sẽ chú ý khi tìm kiếm các lần xác thực thất bại lặp đi lặp lại. Mặc định được đặt là 10 phút, nghĩa là phần mềm sẽ đếm số lần thử không thành công trong 10 phút vừa qua.
  • maxretry: Mục này đặt số lần thử thất bại sẽ được chấp nhận trong findtime trước khi lệnh cấm được áp dụng.
  • backend: Mục này chỉ định cách Fail2ban sẽ giám sát các tệp nhật ký. Cài đặt auto có nghĩa là Fail2ban sẽ thử pyinotify, sau đó là gamin và sau đó là thuật toán thăm dò dựa trên những gì có sẵn. inotify là một tính năng Linux kernel tích hợp để theo dõi khi các tệp được truy cập, và pyinotify là giao diện Python để inotify, được Fail2ban sử dụng.
  • usedns: Mục này xác định liệu reverse DNS có được sử dụng để giúp thực hiện các lệnh cấm hay không. Đặt cài đặt này thành “no” sẽ cấm chính IP thay vì tên máy chủ miền của chúng. Cài đặt warn sẽ cố gắng tra cứu tên máy chủ và cấm theo cách đó, nhưng sẽ ghi lại hoạt động để xem xét.
  • destemail: Đây là địa chỉ sẽ được gửi thư thông báo nếu bạn định cấu hình hành động của mình để gửi thông báo qua thư.
  • sendername: Điều này sẽ được sử dụng trong trường email đối với các email thông báo được tạo
  • banaction: Mục này đặt ra hành động sẽ được sử dụng khi đạt đến ngưỡng. Đây thực chất là đường dẫn đến một tệp nằm trong /etc/fail2ban/action.d/ có tên là iptables-multiport.conf. Điều này xử lý thao tác tường lửa iptables thực tế để cấm địa chỉ IP. Chúng ta sẽ xem xét điều này sau.
  • mta: Đây là tác nhân chuyển thư sẽ được sử dụng để gửi email thông báo.
  • protocol: Đây là loại lưu lượng sẽ bị loại bỏ khi lệnh cấm IP được thực hiện. Nó cũng là loại lưu lượng được gửi đến chuỗi iptables mới.
  • chain: Đây là chuỗi sẽ được định cấu hình bằng quy tắc nhảy để gửi lưu lượng truy cập đến kênh Fail2ban.

Các tham số còn lại xác định các hành động khác nhau có thể được chỉ định. Chúng chuyển vào một số tham số mà chúng tôi đã xác định ở trên bằng cách sử dụng thay thế biến trong chuỗi văn bản như sau:

%(var_name)s

Dòng trên sẽ được thay thế bằng nội dung của var_name. Bằng cách sử dụng điều này, chúng ta có thể biết rằng biến action được đặt thành định nghĩa action_ theo mặc định (chỉ cấm, không có thông báo qua thư).

Ngược lại, điều này được định cấu hình bằng cách gọi hành động iptables-multiport với danh sách các tham số (service name, port, protocol, and chain) cần thiết để thực hiện lệnh cấm. __name__ được thay thế bằng tên của dịch vụ như được chỉ định bởi tiêu đề phần bên dưới.

Các phần cụ thể của dịch vụ

Bên dưới phần mặc định, có các phần dành cho các dịch vụ cụ thể có thể được sử dụng để ghi đè cài đặt mặc định. Điều này tuân theo quy ước chỉ sửa đổi các tham số khác với giá trị bình thường (quy ước về cấu hình).

Mỗi tiêu đề phần được chỉ định như thế này:

[service_name]

Bất kỳ phần nào có dòng enabled = true sẽ được đọc và kích hoạt.

Trong mỗi phần, các tham số được định cấu hình, bao gồm tệp bộ lọc sẽ được sử dụng để phân tích nhật ký (trừ phần mở rộng tệp) và vị trí của chính tệp nhật ký.

Hãy ghi nhớ điều này, phần chỉ định các hành động cho dịch vụ SSH trông như thế này:

/etc/fail2ban/jail.local
[SSH]

enabled     = true
port        = ssh
filter      = sshd
logpath     = /var/log/auth.log
maxretry    = 6

Điều này sẽ kích hoạt phần này và đặt cổng thành cổng “ssh” mặc định (cổng 22). Nó yêu cầu Fail2ban xem nhật ký nằm ở /var/log/auth.log cho phần này và phân tích nhật ký bằng cách sử dụng các cơ chế lọc được xác định trong thư mục /etc/fail2ban/filters.d trong tệp có tên sshd.conf.

Tất cả các thông tin khác mà nó cần được lấy từ các tham số được xác định trong phần [DEFAULT]. Ví dụ: hành động sẽ được đặt thành action_, sẽ cấm địa chỉ IP vi phạm bằng cách sử dụng banaction iptables-multiport, tham chiếu đến tệp có tên iptables-multiport.conf được tìm thấy trong /etc/fail2ban/action.d.

Như bạn có thể thấy, các thao tác trong phần [DEFAULT] phải chung chung và linh hoạt. Việc sử dụng thay thế tham số cùng với các tham số cung cấp giá trị mặc định hợp lý sẽ giúp bạn có thể ghi đè các định nghĩa khi cần thiết.

Kiểm tra tệp filter

Để hiểu những gì đang diễn ra trong cấu hình của chúng tôi, chúng tôi cần hiểu các tệp bộ lọc và hành động (filter và action), những phần này thực hiện phần lớn công việc.

Tệp bộ lọc sẽ xác định các dòng mà Fail2ban sẽ tìm kiếm trong tệp nhật ký để xác định các đặc điểm vi phạm. Tệp action thực hiện tất cả các hành động được yêu cầu, từ việc xây dựng cấu trúc tường lửa khi dịch vụ khởi động, đến thêm và xóa các quy tắc cũng như phá bỏ cấu trúc tường lửa khi dịch vụ dừng.

Hãy xem tệp bộ lọc mà dịch vụ SSH của chúng tôi yêu cầu trong cấu hình ở trên:

  1. sudo nano /etc/fail2ban/filter.d/sshd.conf
/etc/fail2ban/sshd.conf
[INCLUDES]

before = common.conf

[Definition]

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

Tiêu đề phần [INCLUDES] chỉ định các tệp bộ lọc khác được đọc trước hoặc sau tệp này. Trong ví dụ của chúng tôi, tệp common.conf được đọc và đặt trước các dòng khác trong tệp này. Điều này thiết lập một số tham số mà chúng tôi sẽ sử dụng trong cấu hình của mình.

Tiếp theo, chúng tôi có phần [Definition] xác định các quy tắc thực tế cho kết quả khớp bộ lọc của chúng tôi. Đầu tiên, chúng ta đặt tên của daemon mà chúng ta đang theo dõi bằng cách sử dụng tham số _daemon.

Sau đó, chúng ta đi qua định nghĩa failregex thực tế, định nghĩa này đặt các mẫu sẽ kích hoạt khi tìm thấy dòng khớp trong tệp nhật ký. Đây là các biểu thức chính quy khớp dựa trên các lỗi, và những thất bại khác nhau có thể xảy ra khi người dùng không xác thực chính xác.

Các phần của dòng như %(__prefix_line)s sẽ được thay thế bằng giá trị của thiết lập tham số trong tệp common.conf mà chúng tôi đã lấy nguồn. Điều này được sử dụng để khớp với các thông tin hàng đầu khác nhau mà hệ điều hành ghi vào tệp nhật ký khi chúng sử dụng các phương pháp tiêu chuẩn. Ví dụ: một số dòng trong /var/log/auth.log có thể trông giống như thế này:

/var/log/auth.log
May  6  18:18:52 localhost sshd[3534]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.79.130.213 
May  6 18:18:54 localhost sshd[3534]: Failed password for invalid user phil from 101.79.130.213 port 38354 ssh2
May  6 18:18:54 localhost sshd[3534]: Received disconnect from 101.79.130.213: 11: Bye Bye [preauth]

Phần được tô sáng là mẫu tiêu chuẩn mà hệ điều hành chèn vào để cung cấp thêm ngữ cảnh. Sau đó, có khá nhiều cách khác nhau mà dịch vụ tường lửa iptables ghi các lần thử lỗi vào nhật ký.

Chúng tôi thấy hai lỗi riêng biệt trong hai dòng đầu tiên ở trên (lỗi xác thực PAM và lỗi mật khẩu). Các biểu thức chính quy được xác định trong bộ lọc được thiết kế để khớp với bất kỳ dòng lỗi nào có thể xảy ra. Bạn không cần phải điều chỉnh bất kỳ dòng nào trong số này, nhưng bạn nên lưu ý đến nhu cầu nắm bắt tất cả các mục nhật ký biểu thị lỗi sử dụng trái phép đối với ứng dụng mà bạn đang cố gắng bảo vệ nếu bạn phải tự tạo một tệp bộ lọc .

Ở phía dưới cùng, bạn có thể thấy tham số ignoreregex hiện đang trống. Điều này có thể được sử dụng để loại trừ các mẫu cụ thể hơn thường phù hợp với tình trạng lỗi trong trường hợp bạn muốn loại bỏ trình kích hoạt lỗi cho Fail2ban trong một số trường hợp nhất định. Chúng tôi sẽ không điều chỉnh điều này.

Lưu và đóng tệp khi bạn kiểm tra xong.

Kiểm tra tệp action

Bây giờ chúng ta hãy xem tệp action. Tệp này chịu trách nhiệm thiết lập tường lửa với cấu trúc cho phép sửa đổi để cấm các máy chủ độc hại cũng như thêm và xóa các máy chủ đó nếu cần.

Hành động mà dịch vụ SSH của chúng tôi gọi ra được gọi là iptables-multiport. Mở tệp được liên kết ngay bây giờ:

  1. sudo nano /etc/fail2ban/action.d/iptables-multiport.conf

Khi đã xóa nhận xét, tệp này trông giống như thế này:

/etc/fail2ban/action.d/iptables-multiport.conf
[INCLUDES]
before = iptables-blocktype.conf

[Definition]
actionstart = iptables -N fail2ban-<name>
                iptables -A fail2ban-<name> -j RETURN
                iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

actioncheck = iptables -n -L <chain> | grep -a 'fail2ban-<name>[ \t]'

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>

actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>

[Init]
name = default
port = ssh
protocol = tcp
chain = INPUT

Tệp bắt đầu bằng cách tìm nguồn cung cấp một tệp action khác có tên iptables-blocktype.conf xác định tham số blocktype, định cấu hình hạn chế sẽ được đặt khi máy khách bị cấm. Theo mặc định, blocktype được đặt để từ chối các gói và trả lời các ping được gửi bởi các máy khách bị cấm với thông báo từ chối rằng cổng không thể truy cập được. Chúng tôi sẽ sử dụng điều này trong các quy tắc cấm của chúng tôi dưới đây.

Tiếp theo, chúng ta đi đến các định nghĩa quy tắc. Hành động actionstart thiết lập tường lửa iptables khi dịch vụ Fail2ban được khởi động. Nó tạo ra một chuỗi mới, thêm một quy tắc vào chuỗi đó để quay lại chuỗi gọi, và sau đó chèn một quy tắc vào đầu chuỗi INPUT để chuyển lưu lượng truy cập khớp với giao thức chính xác và đích cổng tới chuỗi mới.

Nó thực hiện điều này bằng cách sử dụng các giá trị mà chúng tôi đã chuyển vào với action mà chúng tôi đã xác định trong tệp jail.local của mình. name được lấy từ tiêu đề phần cho mỗi dịch vụ. chain, protocol, và port được lấy từ chính dòng action trong tệp đó.

Ở đây, tất cả các tham số do tệp khác đặt đều được tham chiếu bằng cách đưa tên tham số vào dấu ngoặc nhọn:

&lt;param_name&gt;

Khi chúng ta chuyển sang định nghĩa actionstop đồng hành, chúng ta có thể thấy rằng các lệnh tường lửa đang thực hiện đảo ngược các lệnh actionstart. Khi dịch vụ Fail2ban dừng, nó sẽ xóa sạch mọi quy tắc tường lửa mà nó đã thêm vào.

Một hành động khác gọi là actioncheck đảm bảo rằng chuỗi thích hợp đã được tạo trước khi cố gắng thêm quy tắc cấm.

Tiếp theo, chúng ta chuyển sang quy tắc cấm thực tế, được gọi là actionban. Quy tắc này hoạt động bằng cách thêm quy tắc mới vào chuỗi đã tạo của chúng tôi. Quy tắc khớp với địa chỉ IP nguồn của máy khách vi phạm – tham số này được đọc từ nhật ký ủy quyền khi đạt đến giới hạn maxretry. Nó thiết lập khối được xác định bởi tham số blocktype mà chúng tôi đã lấy nguồn trong phần [INCLUDE] ở đầu tệp.

Quy tắc actionunban loại bỏ quy tắc này. Việc này được thực hiện tự động bởi Fail2ban khi hết thời gian cấm.

Cuối cùng, chúng ta đến phần [Init]. Điều này chỉ cung cấp một số giá trị mặc định trong trường hợp tệp action được gọi mà không chuyển vào tất cả các giá trị thích hợp.

Cách dịch vụ Fail2ban xử lý các tệp cấu hình để thực hiện lệnh cấm

Bây giờ chúng ta đã biết chi tiết cụ thể, hãy cùng xem lại quá trình xảy ra khi Fail2ban bắt đầu.

Tải các tập tin cấu hình ban đầu

Đầu tiên, tệp fail2ban.conf chính được đọc để xác định các điều kiện mà quy trình chính sẽ hoạt động. Nó tạo các tệp socket, pid và log nếu cần thiết và bắt đầu sử dụng chúng.

Tiếp theo, Fail2ban đọc tệp jail.conf để biết chi tiết cấu hình. Nó tuân theo điều này bằng cách đọc, theo thứ tự bảng chữ cái, bất kỳ tệp nào được tìm thấy trong thư mục jail.d kết thúc bằng .conf. Nó thêm các cài đặt được tìm thấy trong các tệp này vào cấu hình bên trong của nó, ưu tiên các giá trị mới hơn các giá trị được mô tả trong tệp jail.conf.

Sau đó, nó tìm kiếm tệp jail.local và lặp lại quá trình này, điều chỉnh các giá trị mới. Cuối cùng, nó tìm kiếm lại thư mục jail.d, đọc theo thứ tự bảng chữ cái các tệp kết thúc bằng .local.

Trong trường hợp của chúng tôi, chúng tôi chỉ có tệp jail.conf và tệp jail.local. Trong tệp jail.local của chúng tôi, chúng tôi chỉ cần xác định các giá trị khác với tệp jail.conf. Quá trình Fail2ban hiện có một tập hợp các lệnh được tải vào bộ nhớ thể hiện sự kết hợp của tất cả các tệp mà nó tìm thấy.

Nó kiểm tra từng phần và tìm kiếm chỉ thị enabled = true. Nếu tìm thấy, nó sẽ sử dụng các tham số được xác định trong phần đó để xây dựng chính sách và quyết định những hành động nào được yêu cầu. Bất kỳ tham số nào không tìm thấy trong phần dịch vụ sẽ sử dụng các tham số được xác định trong phần [DEFAULT].

Phân tích tệp action để xác định hành động bắt đầu

Fail2ban tìm kiếm một chỉ thị action để tìm ra tập lệnh hành động nào cần gọi để thực hiện các chính sách cấm/bỏ cấm. Nếu không tìm thấy, nó sẽ quay lại hành động mặc định được xác định ở trên.

Lệnh hành động bao gồm tên của (các) tệp action sẽ được đọc, cũng như từ điển key-value chuyển các tham số cần thiết cho các tệp đó. Các giá trị này thường ở dạng thay thế tham số bằng cách tham chiếu các cài đặt được định cấu hình trong phần dịch vụ. Key “name” thường được truyền giá trị của biến __name__ đặc biệt sẽ được đặt thành giá trị của tiêu đề của phần.

Fail2ban sau đó sử dụng thông tin này để tìm các tệp liên quan trong thư mục action.d. Trước tiên, nó tìm tệp action liên quan kết thúc bằng .conf và sau đó sửa đổi thông tin tìm thấy ở đó với bất kỳ cài đặt nào có trong tệp .local đi kèm cũng được tìm thấy trong thư mục action.d.

Nó phân tích các tệp đó để xác định các hành động cần thực hiện. Nó đọc giá trị actionstart để xem các hành động cần thực hiện để thiết lập môi trường. Điều này thường bao gồm việc tạo cấu trúc tường lửa để phù hợp với các quy tắc cấm trong tương lai.

Các hành động được xác định trong tệp này sử dụng các tham số được truyền cho nó từ lệnh action. Nó sẽ sử dụng các giá trị này để tự động tạo ra các quy tắc thích hợp. Nếu một biến nhất định chưa được đặt, nó có thể xem các giá trị mặc định được đặt trong tệp action để điền vào chỗ trống.

Phân tích các tệp filter để xác định quy tắc lọc

Các tham số cho dịch vụ trong tệp jail.* cũng bao gồm vị trí của tệp nhật ký cũng như cơ chế bỏ phiếu nên được sử dụng để kiểm tra tệp (điều này được xác định bởi tham số backend). Nó cũng bao gồm một bộ lọc sẽ được sử dụng để xác định xem một dòng trong nhật ký có phải là lỗi hay không.

Fail2ban tìm trong thư mục filter.d để tìm tệp bộ lọc phù hợp kết thúc bằng .conf. Nó đọc tệp này để xác định các mẫu có thể được sử dụng để khớp với các dòng vi phạm. Sau đó, nó tìm kiếm tệp bộ lọc phù hợp kết thúc bằng .local để xem liệu có bất kỳ tham số mặc định nào bị ghi đè hay không.

Nó sử dụng các biểu thức chính quy được xác định trong các tệp này khi đọc tệp nhật ký của dịch vụ. Nó thử từng dòng failregex được xác định trong tệp filter.d đối với mọi dòng mới được ghi vào tệp nhật ký của dịch vụ.

Nếu biểu thức chính quy trả về một kết quả khớp, nó sẽ kiểm tra dòng đó với các biểu thức chính quy được xác định bởi ignoreregex. Nếu điều này cũng khớp, thì fail2ban sẽ bỏ qua nó. Nếu dòng khớp với một biểu thức trong failregex nhưng không khớp với một biểu thức trong ignoreregex, bộ đếm nội bộ sẽ tăng lên cho ứng dụng khách gây ra dòng đó và timestamp (dấu thời gian) có liên quan sẽ được tạo cho sự kiện.

Khi đạt đến khoảng thời gian được thiết lập bởi tham số findtime trong tệp jail.* (được xác định bằng timestamp của sự kiện), bộ đếm nội bộ lại giảm đi và sự kiện không còn được coi là liên quan đến chính sách cấm.

Nếu theo thời gian, các lỗi xác thực bổ sung được ghi lại thì mỗi lần thử sẽ tăng bộ đếm. Nếu bộ đếm đạt đến giá trị do tham số maxretry đặt trong khoảng thời gian đã định cấu hình, thì fail2ban sẽ đưa ra lệnh cấm bằng cách gọi hành động actioncheck cho dịch vụ như được xác định trong tệp action.d/ cho dịch vụ. Điều này nhằm xác định xem hành động actionstart có thiết lập cấu trúc cần thiết hay không. Sau đó nó gọi hành động actionban để cấm khách hàng vi phạm. Nó cũng đặt timestamp cho sự kiện này.

Khi khoảng thời gian đã trôi qua được chỉ định bởi tham số bantime, fail2ban sẽ mở khóa máy khách bằng cách gọi hành động actionunban.

Kết luận

Đến đây bạn đã hiểu khá sâu về cách hoạt động của Fail2ban. Khi bạn đi chệch khỏi cấu hình tiêu chuẩn, sẽ rất hữu ích khi biết cách thức hoạt động của Fail2ban để điều khiển hành vi của nó theo cách có thể dự đoán được.

Để tìm hiểu về cách bảo vệ các dịch vụ khác bằng Fail2ban, bạn có thể đọc Cách bảo vệ máy chủ Nginx bằng Fail2Ban trên Ubuntu 22.04.

0 replies