Cài đặt và sử dụng Fail2ban trên Debian 12

theanh

Administrator
Nhân viên
Fail2ban giám sát các tệp nhật ký để tìm lỗi đăng nhập và tạm thời cấm địa chỉ IP nguồn dễ bị lỗi truy cập vào máy chủ. Đây là biện pháp phòng thủ chống lại các cuộc tấn công brute-force đoán mật khẩu. Rất hữu ích khi có fail2ban trên các máy chủ tiếp xúc với Internet.

Phiên bản fail2ban trên Debian 12 là 1.0.2.
Mã:
root@posti:~# fail2ban-client version
1.0.2
Để xem fail2ban có đang chạy hay không, hãy gửi lệnh ping đến máy chủ với fail2ban-client. Máy chủ Fail2ban trả lời "pong" nếu nó đang chạy.
Mã:
root@posti:/etc/fail2ban# fail2ban-client ping
Server replied: pong
root@posti:/etc/fail2ban#

Cách thức hoạt động​

Fail2ban thu thập các tệp bộ lọc, hành động và được giám sát vào jail. Một số jail đi kèm với bản phân phối. Chúng cần được bật để bắt đầu hoạt động. filter chỉ định cách phát hiện lỗi xác thực. hành động xác định cách thức diễn ra lệnh cấm và bỏ lệnh cấm.

Các nỗ lực xâm nhập sẽ kích hoạt lệnh cấm nếu trong findtime ít nhất maxretry lỗi đăng nhập được phát hiện từ cùng một số IP. Sau đó, IP sẽ bị cấm trong bantime giây. Sau khi lệnh cấm có hiệu lực trong số giây bantime, lệnh cấm sẽ được gỡ bỏ và IP có thể truy cập lại vào máy chủ. Fail2ban có thể xử lý cả IPv4 và IPv6.

Có thể đọc thêm thông tin từ các tệp trong thư mục /usr/share/doc/fail2ban/.

Thiết lập Fail2ban​

Trên hệ thống Debian GNU/Linux, fail2ban mặc định sẽ cài đặt với sshd jail được bật với các thiết lập hợp lý. Việc này được thực hiện trong tệp /etc/fail2ban/jail.d/defaults-debian.conf. Đây là jail duy nhất hoạt động theo mặc định. Các jail khác phải được quản trị viên hệ thống bật.

Vì vậy, nếu bạn chỉ muốn theo dõi các lần đăng nhập ssh và cấm những kẻ xâm nhập có hành vi không đúng, thì không cần cấu hình bổ sung nào.

Thật không may, trên Debian 12, fail2ban có thể không hoạt động với các thiết lập mặc định. Debian 12 đánh dấu gói rsyslog là tùy chọn, nghĩa là nó có thể không được cài đặt nên nhật ký chỉ được thu thập vào journald [wiki.debian.org/Rsyslog].

Trên các hệ thống ISPConfig, fail2ban hoạt động, vì trình cài đặt tự động ISPConfig cài đặt rsyslog và hướng dẫn máy chủ ISPConfig Perfect hướng dẫn cài đặt rsyslog.

Với rsyslog, các tệp nhật ký xuất hiện trong /var/log/ -directory, do đó cấu hình mặc định fail2ban tìm thấy các tệp nhật ký. Nếu rsyslog chưa được cài đặt, thì cấu hình fail2ban phải được sửa đổi để nó đọc các bản ghi từ nhật ký systemd. Thêm vào phần mặc định jail.local backend = systemd, như sau
Mã:
[DEFAULT]
backend = systemd

Bật jail​

Tài liệu khuyến nghị đặt tất cả các sửa đổi của riêng bạn vào các tệp .local. Điều này tránh được các sự cố khi các tệp do bản phân phối cung cấp được người bảo trì nâng cấp hoặc sửa đổi [Đọc tệp /usr/share/doc/fail2ban/README.Debian.gz].

Ví dụ, bật pure-ftpd jail bằng cách thêm vào tệp /etc/fail2ban/jail.local (tạo tệp nếu tệp chưa tồn tại) các dòng
Mã:
[pure-ftpd]
enabled = true
Tên jail trong dấu ngoặc vuông bắt đầu phần cài đặt của jail đó.

Khi hoàn tất các sửa đổi, hãy buộc đọc lại các tệp cấu hình bằng lệnh
Mã:
systemctl reload fail2ban
Bây giờ, nhà tù sẽ chạy, có thể xác minh bằng fail2ban-client:
Mã:
root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
| |- Currently failed:	0
| |- Total failed:	106
| `- File list:	/var/log/syslog
`- Actions |- Currently banned:	0 |- Total banned:	4 `- Banned IP list:
root@posti:/etc/fail2ban#
Vì jail.local chỉ có cài đặt "đã bật" cho nhà tù đó, nên tất cả các cài đặt khác đều là cài đặt mặc định từ bản phân phối. Thông thường, chúng có giá trị tốt nên không cần cấu hình thêm. Nếu cần, mục jail.local cho jail đó có thể chứa các thiết lập ghi đè lên những gì đã được thiết lập trong các tệp .conf.

Ví dụ này thay đổi findtime, maxretry và bantime cho pure-ftpd jail:
Mã:
[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1d
Fail2ban-client hiển thị thời gian tính bằng giây, nhưng thời gian có thể được nhập vào các tệp cấu hình ở định dạng dễ hơn, ví dụ 10h thay vì 36000 giây. man jail.conf trong chương "ĐỊNH DẠNG VIẾT TẮT THỜI GIAN" giải thích các định dạng nhập thời gian thân thiện với người dùng.

fail2ban-client có tùy chọn chuyển đổi từ định dạng thời gian thân thiện với người dùng sang giây.
Mã:
# fail2ban-client --str2sec 1d3h7m
97620

Theo dõi nhật ký​

Để xác định nhà tù nào cần được kích hoạt, hãy theo dõi nhật ký do các dịch vụ chạy trên máy chủ tạo ra. Một công cụ tạo tóm tắt nhật ký, như logwatch hoặc pflogsumm, rất hữu ích. Đọc nhật ký thô tốn thời gian và tẻ nhạt.

Kiểm tra xem có nhà tù nào khả dụng cho dịch vụ đang chạy trên máy chủ không, có thể đọc jail.conf.

Khi nhật ký cho thấy điều gì đó thú vị hoặc đáng lo ngại, thì đã đến lúc kiểm tra. Ví dụ, pflogsumm đã gửi tóm tắt email với các dòng như thế này:
Mã:
136 unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136 hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123 unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123 hostname mail.whatami.co does not resolve to address 193.32.162.23
Điều đó cho thấy IP 91.224.92.40 đã không đăng nhập vào email 136 lần và một trường hợp tương tự khác. Fail2ban lẽ ra phải ngăn chặn được nhiều lần thử như vậy. Để xem lý do tại sao điều đó không xảy ra, hãy kiểm tra nhật ký fail2ban.
Mã:
root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#
IP đó thử kết nối trong khoảng thời gian khoảng 10 phút và fail2ban jail postfix-sasl phát hiện ra nó.

Bạn nên tìm hiểu xem IP đó có thể thuộc về người dùng hợp pháp của máy chủ hay không, người này chỉ có mật khẩu cũ trên điện thoại thông minh hoặc một số thiết bị khác đang cố gắng kết nối trong khoảng thời gian đều đặn. Tôi sử dụng geoiplookup, nó hiển thị IP của quốc gia nào. Người dùng của tôi đến từ quốc gia của tôi nên người dùng nước ngoài có xu hướng là những kẻ xấu. geoiplookup xuất phát từ các gói Debian geoip-database và geoip-bin.
Mã:
$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lithuania
Để tìm hiểu lý do tại sao IP không bị cấm, hãy kiểm tra findtime của nhà tù đó:
Mã:
root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#
Gần đây tôi đã thấy những cuộc tấn công chậm này, thủ phạm biết findtime là 10 phút nên cố gắng tránh bị cấm bằng cách thử đăng nhập ở khoảng thời gian dài hơn. Điều đó hiệu quả trong trường hợp này. Để khiến việc đăng nhập không thành công gây ra lệnh cấm, hãy tăng thời gian tìm kiếm cho nhà tù, chẳng hạn lên 10 giờ. Thêm vào tệp jail.local trong phần [postfix-sasl]:
Mã:
findtime = 10h
Sau đó, sau khi systemctl reload fail2ban, jail có thời gian tìm kiếm lâu hơn:
Mã:
root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#
Một cách khác mà kẻ xâm nhập cố gắng đột nhập là kiên trì. Ngay cả khi kẻ xâm nhập bị cấm, chỉ cần đợi cho đến khi lệnh cấm kết thúc và tiếp tục đoán mật khẩu. Thời gian cấm có thể được kéo dài hơn, nhưng điều đó gây ra vấn đề cho người dùng hợp pháp, những người có thể nhập sai mật khẩu và sau đó không thể truy cập tài khoản của họ cho đến khi thời gian cấm kết thúc. Có một nhà tù dành cho những người tái phạm được gọi là recidive. Nó hoạt động bằng cách tìm kiếm các lệnh cấm lặp lại đối với một IP trong nhật ký fail2ban, sau đó cấm trong một thời gian dài, ví dụ như một tuần.

Danh sách sau đây là từ báo cáo logwatch:
Mã:
--------------------- pam_unix Begin ------------------------ 
 sshd:
 Authentication Failures:
 unknown (212.70.149.150): 59 Time(s)
Tìm kiếm IP đó trong tệp nhật ký sẽ hiển thị:
Mã:
2024-02-21 03:42:39,121 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04
Fail2ban hoạt động như mong đợi, tìm ra thông tin đăng nhập sai và ban hành lệnh cấm trong 10 phút. Trong thời gian lệnh cấm này, kẻ vi phạm sẽ không được phép truy cập vào máy chủ này, nhưng sẽ tiếp tục sau khi lệnh cấm được dỡ bỏ. Có vẻ như đây là trường hợp cố gắng đột nhập nghiêm trọng. Biện pháp khắc phục là cho phép tù tái phạm với số lần thử lại tối đa thấp và thời gian cấm dài.

Tôi thích sử dụng lệnh cấm ban đầu ngắn, chẳng hạn như 10 phút. Nếu người dùng thực sự bị cấm, họ chỉ cần đợi trong thời gian đó, hy vọng sẽ sử dụng thời gian đó để tìm mật khẩu chính xác và sau đó thử lại. Những người bị cấm lại trong cùng ngày sẽ bị cấm trong một tuần. Giá trị mặc định của recidive jail có thể được tìm thấy trong tệp jail.conf, có bantime là 1 tuần và findtime là 1 ngày, những giá trị này có vẻ ổn với tôi. Nhưng tôi đặt maxretry thành 2, những người vi phạm sẽ bị cấm nhanh hơn. Tôi đã thêm vào tệp jail.local:
Mã:
[recidive]
enabled = true
maxretry = 2
Theo tôi, lệnh cấm dài hơn 1 tuần là không đáng. Cuối cùng, địa chỉ IP cũ sẽ bị cấm hoặc bị đưa vào danh sách đen ở mọi nơi, do đó, người vi phạm sẽ nhận được một IP mới. Địa chỉ IP cũ được cấp cho một số người dùng Internet mới vô tội, những người không nên bị trừng phạt vì những điều xấu mà chủ sở hữu trước của địa chỉ IP đó đã phạm phải.

Khắc phục sự cố​

Sau khi khởi động hệ điều hành hoặc khởi động lại fail2ban, trạng thái sẽ được khôi phục, do đó lệnh cấm sẽ tiếp tục cho đến khi thời gian cấm trôi qua. Do đó, việc kiểm tra và khắc phục sự cố có thể liên quan đến việc khởi động lại.

Để kiểm tra cấu hình, có một tùy chọn kiểm tra:
Mã:
fail2ban-server --test
Để tìm hiểu xem một IP có bị cấm hay không, các phiên bản gần đây của fail2ban có thể thực hiện
Mã:
# fail2ban-client banned 43.131.9.186
[['recidive']]
Lệnh này hiển thị danh sách các nhà tù nơi IP đã cho hiện đang bị cấm.

Các phiên bản cũ hơn của fail2ban không có lệnh đó. Có thể kiểm tra từng jail một như sau:
Mã:
# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232
Nếu đầu ra hiển thị IP, thì IP đó nằm trong danh sách các số IP bị cấm. Lệnh tr có tác dụng chia nhỏ danh sách các số IP bị cấm (là một dòng dài) thành một IP trên một dòng.

Để xem những gì đã xảy ra với một IP nhất định, hãy tra cứu trong fail2ban.log:
Mã:
root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80
2024-03-06 09:00:40,295 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE [sshd] Unban
Việc đổ dữ liệu chi tiết về cấu hình fail2ban sẽ hiển thị các thiết lập cho kiểm tra:
Mã:
# fail2ban-client -vvv -d

Cho phép các địa chỉ IP của riêng bạn được đưa vào danh sách trắng​

Có thể máy chủ của riêng bạn bị cấm hoặc bạn muốn đảm bảo một số máy chủ nước ngoài không bao giờ bị cấm ngay cả khi chúng hoạt động không tốt. Những số IP đó có thể được đưa vào danh sách trắng. Theo mặc định, không có gì được đưa vào danh sách trắng, bạn có thể xác minh điều này bằng:
Mã:
root@posti:~# fail2ban-client get sshd ignoreip
No IP address/network is ignored
root@posti:~
Cài đặt ignoreip có thể được đặt trong mỗi phần jails, nhưng cài đặt này sẽ ảnh hưởng đến tất cả các jails nên tốt hơn là đặt trong phần DEFAULT. Tốt nhất là đặt ignore thành mạng con nội bộ để tất cả các máy chủ của riêng bạn tránh bị cấm. Đây là từ đầu jail.local:
Mã:
[DEFAULT]
ignoreip = 92.237.123.96/27
Phần mặc định có thể có các thiết lập khác ảnh hưởng đến tất cả các jail. Ví dụ, findtime = 10h có thể được thêm vào đó.

Cấm thủ công​

Để kiểm tra điều gì xảy ra khi cấm, hãy đặt lệnh cấm thủ công. Trước tiên, hãy kiểm tra với một jail có thời gian cấm ngắn, để cuối cùng bạn có thể quay lại nếu bạn vô tình cấm chính mình. Ví dụ
Mã:
# fail2ban-client set sshd banip 8.8.4.4
Nếu một số IP hoạt động không tốt nhưng bạn không thể khiến fail2ban phát hiện ra và ban hành lệnh cấm, thì việc thiết lập lệnh cấm thủ công trong lệnh recidive jail sẽ xóa IP đó trong một tuần.
Mã:
# fail2ban-client set recidive banip 8.8.4.4
Việc cấm một mạng con hoạt động bằng cách sử dụng CIDR ký hiệu:
Mã:
fail2ban-client set recidive banip 5.188.87.0/24

Bỏ cấm thủ công​

Có thể gỡ lệnh cấm, nhưng hãy cân nhắc rằng nếu hành vi xấu vẫn tiếp diễn thì IP sẽ lại bị cấm. Vì vậy, bạn nên tìm hiểu điều gì đang xảy ra (ví dụ như bằng cách đọc nhật ký) và khắc phục hành vi xấu.
Mã:
# fail2ban-client set recidive unbanip 8.8.4.4
IP có thể bị cấm ở một số nhà tù. Để bỏ cấm IP ở tất cả các nhà tù, hãy sử dụng
Mã:
# fail2ban-client unban 8.8.4.4
Tuy nhiên, tôi hiếm khi cần phải làm điều đó. Tôi có 10 phút bantime, ngoại trừ recidive jail có 1 tuần, vì vậy tôi chỉ bỏ cấm khỏi recidive jail, các jail khác đã hết hạn. Nếu bạn không sử dụng recidive jail, IP có thể bị cấm ở nhiều jail cùng một lúc nên điều này rất hữu ích.

Để bỏ cấm tất cả các địa chỉ IP khỏi tất cả các jail, hãy
Mã:
fail2ban-client unban --all

Kết luận​

Fail2ban khiến việc đoán mật khẩu trở nên khó khăn hơn nhưng không hoàn toàn ngăn chặn được những kẻ bẻ khóa cố gắng truy cập vào máy chủ. Đối với SSH, việc buộc sử dụng khóa SSH cung cấp nhiều biện pháp bảo vệ hơn bằng cách ngăn chặn việc đăng nhập bằng mật khẩu. Đối với các dịch vụ khác, xác thực đa yếu tố sẽ ngăn chặn việc đăng nhập nếu chỉ biết mật khẩu.
 
Back
Bên trên