Table of Contents

No table of contents

Cách bảo vệ máy chủ Apache bằng Fail2Ban trên Ubuntu 14.04

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

Giới thiệu

Khi vận hành máy chủ web, điều quan trọng là phải thực hiện các biện pháp bảo mật để bảo vệ trang web và người dùng của bạn. Bảo vệ các trang web và ứng dụng của bạn bằng chính sách tường lửa và hạn chế quyền truy cập vào một số khu vực nhất định bằng xác thực mật khẩu là điểm khởi đầu tuyệt vời để bảo mật hệ thống của bạn. Tuy nhiên, bất kỳ lời nhắc mật khẩu có thể truy cập công khai nào cũng đều có khả năng thu hút tấn công brute force từ những người dùng và bot độc hại.

Thiết lập fail2ban có thể giúp giảm bớt vấn đề này. Khi người dùng liên tục không xác thực được một dịch vụ (hoặc tham gia vào hoạt động đáng ngờ khác), fail2ban có thể đưa ra lệnh cấm tạm thời đối với địa chỉ IP vi phạm bằng cách sửa đổi linh hoạt chính sách tường lửa đang chạy. Mỗi “nhà tù” fail2ban hoạt động bằng cách kiểm tra nhật ký được viết bởi một dịch vụ để tìm các mẫu cho biết các lần thử thất bại. Thiết lập fail2ban để giám sát nhật ký Apache thật dễ dàng bằng cách sử dụng các bộ lọc cấu hình đi kèm.

Trong hướng dẫn này, chúng tôi sẽ trình bày cách cài đặt fail2ban và định cấu hình nó để giám sát nhật ký Apache của bạn nhằm phát hiện các nỗ lực xâm nhập. Chúng tôi sẽ sử dụng máy chủ Ubuntu 14.04.

Điều kiện tiên quyết

Trước khi bắt đầu, bạn nên thiết lập máy chủ Ubuntu 14.04 bằng tài khoản non-root. Tài khoản này phải được cấu hình với đặc quyền sudo để đưa ra các lệnh quản trị. Để tìm hiểu cách thiết lập người dùng có đặc quyền sudo, hãy làm theo hướng dẫn thiết lập máy chủ ban đầu của chúng tôi cho Ubuntu 14.04.

Cài đặt Apache và định cấu hình xác thực mật khẩu

Nếu bạn quan tâm đến việc bảo vệ máy chủ Apache của mình bằng fail2ban, thì có thể bạn đã thiết lập và chạy một máy chủ. Nếu không, bạn có thể cài đặt Apache từ kho lưu trữ mặc định của Ubuntu bằng apt.

Cập nhật chỉ mục gói cục bộ và cài đặt bằng cách gõ:

  1. sudo apt-get update
  2. sudo apt-get install apache2

Dịch vụ fail2ban rất hữu ích trong việc bảo vệ các điểm vào đăng nhập. Để tính năng này hữu ích cho quá trình cài đặt Apache, xác thực mật khẩu phải được triển khai cho ít nhất một tập hợp con nội dung trên máy chủ. Bạn có thể làm theo hướng dẫn này để định cấu hình bảo vệ bằng mật khẩu cho máy chủ Apache của mình.

Cài đặt Fail2Ban

Khi máy chủ Apache của bạn đang chạy và xác thực mật khẩu được bật, bạn có thể tiếp tục và cài đặt fail2ban (chúng tôi bao gồm một kho lưu trữ khác được tìm nạp lại ở đây trong trường hợp bạn đã thiết lập Apache ở các bước trước):

  1. sudo apt-get update
  2. sudo apt-get install fail2ban

Điều này sẽ cài đặt phần mềm. Theo mặc định, fail2ban được định cấu hình để chỉ cấm các lần đăng nhập SSH không thành công. Chúng tôi cần kích hoạt một số quy tắc sẽ định cấu hình nó để kiểm tra nhật ký Apache của chúng tôi để tìm các mẫu cho biết hoạt động độc hại.

Điều chỉnh cài đặt chung trong Fail2Ban

Để bắt đầu, chúng ta cần điều chỉnh tệp cấu hình mà fail2ban sử dụng để xác định nhật ký ứng dụng nào cần theo dõi và hành động cần thực hiện khi tìm thấy các mục vi phạm. Tệp /etc/fail2ban/jail.conf được cung cấp là tài nguyên chính được cung cấp cho việc này.

Để thực hiện sửa đổi, chúng ta cần sao chép tệp này vào /etc/fail2ban/jail.local. Điều này sẽ ngăn các thay đổi của chúng tôi bị ghi đè nếu bản cập nhật gói cung cấp tệp mặc định mới:

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

Mở tệp mới sao chép để chúng tôi có thể thiết lập giám sát nhật ký Apache của mình:

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

Thay đổi mặc định

Chúng ta nên bắt đầu bằng cách đánh giá các giá trị mặc định được đặt trong tệp để xem chúng có phù hợp với nhu cầu của chúng ta hay không. Những thứ này sẽ được tìm thấy trong phần [DEFAULT] trong tệp. Những mục này đặt ra chính sách chung và mỗi mục có thể được ghi đè trong các jail cụ thể.

Một trong những mục đầu tiên cần xem xét là danh sách khách hàng không tuân theo chính sách fail2ban. Điều này được thiết lập bởi lệnh ignoreip. Đôi khi, bạn nên thêm địa chỉ IP hoặc mạng của riêng mình vào danh sách ngoại lệ để tránh bị khóa. Tuy nhiên, đây không phải là vấn đề xảy ra với thông tin đăng nhập máy chủ web nếu bạn có thể duy trì quyền truy cập shell, vì bạn luôn có thể đảo ngược lệnh cấm theo cách thủ công. Bạn có thể thêm các địa chỉ IP hoặc mạng bổ sung được phân cách bằng dấu cách vào danh sách hiện có:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP

Một mục khác mà bạn có thể muốn điều chỉnh là bantime, nó kiểm soát số giây mà thành viên vi phạm bị cấm. Lý tưởng nhất là đặt khoảng thời gian này đủ dài để gây gián đoạn cho nỗ lực của kẻ tấn công độc hại, đồng thời đủ ngắn để cho phép người dùng hợp pháp sửa chữa sai lầm. Theo mặc định, giá trị này được đặt thành 600 giây (10 phút). Tăng hoặc giảm giá trị này khi bạn thấy phù hợp:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
bantime = 3600

Hai mục tiếp theo xác định phạm vi dòng nhật ký được sử dụng để xác định khách hàng vi phạm. findtime chỉ định một khoảng thời gian tính bằng giây và lệnh maxretry cho biết số lần thử được chấp nhận trong thời gian đó. Nếu khách hàng thực hiện nhiều lần thử tối đa trong khoảng thời gian do findtime đặt, họ sẽ bị cấm:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
findtime = 3600   # These lines combine to ban clients that fail
maxretry = 6      # to authenticate 6 times within a half hour.

Thiết lập thông báo qua thư (Tùy chọn)

Bạn có thể bật thông báo qua email nếu bạn muốn nhận thư bất cứ khi nào lệnh cấm diễn ra. Để làm như vậy, trước tiên bạn phải thiết lập MTA trên máy chủ của mình để nó có thể gửi email. Để tìm hiểu cách sử dụng Postfix cho tác vụ này, hãy làm theo hướng dẫn Cách cài đặt và định cấu hình Postfix làm máy chủ SMTP chỉ gửi trên Ubuntu 14.04.

Sau khi thiết lập MTA, bạn sẽ phải điều chỉnh một số cài đặt bổ sung trong phần [DEFAULT] của tệp /etc/fail2ban/jail.local. Bắt đầu bằng cách thiết lập lệnh mta. Nếu bạn thiết lập Postfix, như hướng dẫn ở trên minh họa, hãy thay đổi giá trị này thành “mail”:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
mta = mail

Bạn cần chọn địa chỉ email sẽ được gửi thông báo. Sửa đổi lệnh destemail với giá trị này. Lệnh sendername có thể được sử dụng để sửa đổi trường “Sender” trong email thông báo:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts

Theo cách nói của fail2ban, “action” là quy trình được thực hiện khi máy khách không xác thực quá nhiều lần. Hành động mặc định (được gọi là action_) chỉ đơn giản là cấm địa chỉ IP khỏi cổng được đề cập. Tuy nhiên, có hai hành động được thực hiện sẵn khác có thể được sử dụng nếu bạn đã thiết lập mail.

Bạn có thể sử dụng hành động action_mw để cấm khách hàng và gửi thông báo qua email đến tài khoản đã định cấu hình của bạn kèm theo báo cáo “whois” về địa chỉ vi phạm. Bạn cũng có thể sử dụng hành động action_mwl, hành động này thực hiện điều tương tự nhưng cũng bao gồm các dòng nhật ký vi phạm đã kích hoạt lệnh cấm:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
action = %(action_mwl)s

Định cấu hình Fail2Ban để theo dõi nhật ký Apache

Bây giờ bạn đã có một số cài đặt chung của fail2ban, chúng ta có thể tập trung vào việc kích hoạt các jail dành riêng cho Apache để giám sát nhật ký máy chủ web của chúng ta để tìm các mẫu hành vi cụ thể.

Mỗi jail trong tệp cấu hình được đánh dấu bằng tiêu đề chứa tên jail trong dấu ngoặc vuông (mọi phần trừ phần [DEFAULT] cho biết cấu hình của jail cụ thể). Theo mặc định, chỉ có jail [ssh] được bật.

Để bật tính năng giám sát nhật ký cho các lần đăng nhập Apache, chúng tôi sẽ kích hoạt tính năng jail [apache]. Chỉnh sửa lệnh enabled trong phần này để nó đọc là “true”:

/etc/fail2ban/jail.local
[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 6
. . .

Nếu máy chủ Apache của bạn đang ghi vào vị trí nhật ký mặc định (/var/log/apache/error.log) thì jail đã được định cấu hình để tìm đúng vị trí. Nếu bạn đang đăng nhập vào một vị trí khác, hãy sửa đổi logpath nếu cần. Ngoài ra, vui lòng điều chỉnh lệnh maxretry hoặc thêm giá trị findtime cho jail này nếu bạn muốn đặt các giới hạn khác nhau cho jail cụ thể này:

/etc/fail2ban/jail.local
[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache/custom_log_location.log
maxretry = 3
findtime = 600
. . .

Jail trên sẽ đảm nhiệm việc cấm các lỗi xác thực cơ bản. Ngoài ra còn có một số jail được cấu hình sẵn khác đáng để kích hoạt (jail [apache-multiport] là jail kế thừa không cần thiết).

Jail [apache-noscript] được sử dụng để cấm các khách hàng đang tìm kiếm các tập lệnh trên trang web thực thi và khai thác. Nếu bạn không sử dụng PHP hoặc bất kỳ ngôn ngữ nào khác kết hợp với máy chủ web của mình, bạn có thể kích hoạt jail này để cấm những người yêu cầu các loại tài nguyên này:

/etc/fail2ban/jail.local
[apache-noscript]

enabled  = true
. . .

Jail [apache-overflows] được sử dụng để chặn những khách hàng đang cố gắng yêu cầu các URL dài và đáng ngờ bất thường. Đây thường là dấu hiệu của những nỗ lực khai thác Apache bằng cách cố gắng kích hoạt lỗi tràn bộ đệm. Bạn có thể kích hoạt jail này nếu bạn muốn ngăn chặn các kiểu tấn công này:

/etc/fail2ban/jail.local
[apache-overflows]

enabled  = true
. . .

Một số kiểm tra bổ sung có thể được thực hiện bằng cách sao chép và dán mục nhập [apache-overflows] và sửa đổi nó một chút. Ví dụ: bạn có thể sao chép và dán phần đó cũng như sửa đổi tên jail và bộ lọc thành apache-badbots để ngăn chặn một số mẫu yêu cầu bot độc hại đã biết:

/etc/fail2ban/jail.local
[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

Nếu bạn không sử dụng Apache để cung cấp quyền truy cập vào nội dung web trong thư mục chính của người dùng, bạn có thể sao chép và dán lại cũng như thay đổi tên jail và bộ lọc thành apache-nohome:

/etc/fail2ban/jail.local
[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-nohome]

enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/apache*/*error.log
maxretry = 2

Cuối cùng, nếu bạn đang sử dụng Apache với PHP, bạn có thể muốn kích hoạt jail [php-url-fopen], tính năng này chặn các nỗ lực sử dụng một số hành vi PHP nhất định cho các mục đích xấu. Bạn có thể sẽ phải thay đổi lệnh logpath để trỏ đến vị trí nhật ký truy cập chính xác (trên Ubuntu, vị trí mặc định là /var/log/apache2/access.log). Bạn có thể sử dụng mẫu tương tự như mẫu khớp với nhật ký lỗi trong các jail khác:

/etc/fail2ban/jail.local
[php-url-fopen]

enabled = true
port    = http,https
filter  = php-url-fopen
logpath = /var/log/apache*/*access.log

Khi bạn thực hiện xong các sửa đổi cần thiết, hãy lưu và đóng tệp.

Triển khai Jail Apache của bạn

Để thực hiện các thay đổi cấu hình của mình, bạn cần phải khởi động lại dịch vụ fail2ban. Bạn có thể làm điều đó bằng cách gõ:

  1. sudo service fail2ban restart

Dịch vụ sẽ khởi động lại, triển khai các chính sách cấm khác nhau mà bạn đã định cấu hình.

Nhận thông tin về các jail đã kích hoạt

Bạn có thể xem tất cả các jail đã kích hoạt bằng cách sử dụng lệnh fail2ban-client:

  1. sudo fail2ban-client status

Bạn sẽ thấy danh sách tất cả các jail bạn đã kích hoạt:

Output
Status |- Number of jail: 7 `- Jail list: php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache

Bạn có thể thấy rằng fail2ban đã sửa đổi các quy tắc tường lửa của bạn để tạo một khuôn khổ cấm máy khách. Ngay cả khi không có quy tắc tường lửa nào trước đó, giờ đây bạn đã kích hoạt một khung cho phép fail2ban cấm có chọn lọc các ứng dụng khách bằng cách thêm chúng vào các chuỗi được xây dựng có mục đích:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-apache -N fail2ban-apache-badbots -N fail2ban-apache-nohome -N fail2ban-apache-noscript -N fail2ban-apache-overflows -N fail2ban-php-url-fopen -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A fail2ban-apache -j RETURN -A fail2ban-apache-badbots -j RETURN -A fail2ban-apache-nohome -j RETURN -A fail2ban-apache-noscript -j RETURN -A fail2ban-apache-overflows -j RETURN -A fail2ban-php-url-fopen -j RETURN -A fail2ban-ssh -j RETURN

Nếu bạn muốn xem chi tiết về các lệnh cấm được thực thi bởi bất kỳ jail nào, có thể sử dụng lại fail2ban-client một lần nữa:

  1. sudo fail2ban-client status apache
Output
Status for the jail: apache |- filter | |- File list: /var/log/apache2/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0

Kiểm tra chính sách Fail2Ban

Điều quan trọng là phải kiểm tra các chính sách fail2ban của bạn để đảm bảo chúng chặn lưu lượng truy cập như mong đợi. Ví dụ: đối với lời nhắc xác thực Apache, bạn có thể cung cấp thông tin xác thực không chính xác nhiều lần. Sau khi vượt quá giới hạn, bạn sẽ bị cấm và không thể truy cập trang web. Nếu bạn thiết lập thông báo qua email, bạn sẽ thấy thông báo liên quan đến lệnh cấm trong tài khoản email bạn đã cung cấp.

Nếu nhìn vào trạng thái bằng lệnh fail2ban-client, bạn sẽ thấy địa chỉ IP của mình bị cấm khỏi trang web:

  1. sudo fail2ban-client status apache
Output
Status for the jail: apache |- filter | |- File list: /var/log/apache2/error.log | |- Currently failed: 0 | `- Total failed: 12 `- action |- Currently banned: 1 | `- IP list: 111.111.111.111 `- Total banned: 1

Khi bạn hài lòng rằng các quy tắc của mình đang hoạt động, bạn có thể bỏ cấm địa chỉ IP của mình theo cách thủ công bằng fail2ban-client bằng cách nhập:

  1. sudo fail2ban-client set apache unbanip 111.111.111.111

Bây giờ bạn có thể thử xác thực lại.

Kết luận

Việc thiết lập fail2ban để bảo vệ máy chủ Apache của bạn khá đơn giản trong trường hợp đơn giản nhất. Tuy nhiên, fail2ban cung cấp rất nhiều tính linh hoạt để xây dựng các chính sách phù hợp với nhu cầu bảo mật cụ thể của bạn. Bằng cách xem xét các biến và mẫu trong tệp /etc/fail2ban/jail.local và các tệp mà nó phụ thuộc vào trong các thư mục /etc/fail2ban/filter.d/etc/fail2ban/action.d, bạn có thể tìm nhiều phần để điều chỉnh và thay đổi khi nhu cầu của bạn phát triển. Tìm hiểu những điều cơ bản về cách bảo vệ máy chủ của bạn bằng fail2ban có thể mang lại cho bạn mức độ bảo mật cao mà không tốn nhiều công sức.

Để tìm hiểu thêm về fail2ban, hãy xem một số liên kết sau:

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

0 replies