Table of Contents

No table of contents

Cách bảo vệ máy chủ Nginx với Fail2Ban trên Ubuntu 14.04

Posted on: 27 tháng 4 năm 2023

Ubuntu

Giới thiệu

Khi vận hành máy chủ web, điều quan trọng là phải triển khai 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 các 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 đều có khả năng thu hút các tấn công brute force từ người dùng và bot độc hại.

Thiết lập fail2ban có thể giúp giải quyế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 tự động sửa đổi 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ử không thành công. Thiết lập fail2ban để theo dõi nhật ký Nginx khá dễ dàng bằng cách sử dụng một số bộ lọc cấu hình đi kèm và một số bộ lọc chúng tôi sẽ tự tạo.

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ý Nginx của bạn để tìm 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 non-root account. Tài khoản này phải được cấu hình với các đặ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 Nginx và 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ủ Nginx của mình bằng fail2ban, bạn có thể đã thiết lập và chạy một máy chủ. Nếu không, bạn có thể cài đặt Nginx từ kho lưu trữ mặc định của Ubuntu bằng cách sử dụ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 nginx

Dịch vụ fail2ban rất hữu ích để bảo vệ các điểm đăng nhập. Để điều này hữu ích cho việc cài đặt Nginx, 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ệ mật khẩu cho máy chủ Nginx của mình.

Cài đặt Fail2Ban

Khi máy chủ Nginx 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ữ re-fetch khác ở đây trong trường hợp bạn đã thiết lập Nginx ở 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ý Nginx của chúng tôi để tìm các mẫu biểu thị 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 nhập vi phạm. Tệp /etc/fail2ban/jail.conf được cung cấp là tài nguyên được cung cấp chính 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 được sao chép để chúng tôi có thể thiết lập giám sát nhật ký Nginx 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 không. Chúng sẽ được tìm thấy trong phần [DEFAULT] trong tệp. Các mục này thiết lập chính sách chung và mỗi mục có thể bị ghi đè trong các nhà tù 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 chỉ thị 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. Đây không phải là vấn đề với thông tin đăng nhập máy chủ web mặc dù 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 tá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, kiểm soát số giây mà một 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 để phá vỡ nỗ lực của kẻ xấu, đồ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, thời lượng 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 của các dòng nhật ký được sử dụng để xác định một khách hàng vi phạm. findtime chỉ định một lượng thời gian tính bằng giây và chỉ thị 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 thư (Tùy chọn)

Bạn có thể bật thông báo qua email nếu muốn nhận thư bất cứ khi nào có lệnh cấm. Để làm như vậy, trước tiên bạn sẽ 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 này.

Khi bạn đã 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 chỉ thị mta. Nếu bạn thiết lập Postfix, giống như hướng dẫn ở trên, 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. Chỉ thị 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 ail2ban, một “action” là quy trình được thực hiện khi một máy khách không xác thực đượ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 tạo sẵn khác có thể được sử dụng nếu bạn đã thiết lập thư.

Bạn có thể sử dụng hành động action_mw để cấm ứng dụng khách và gửi thông báo qua email đến tài khoản đã định cấu hình của mình 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, thao tác này thực hiện 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ý Nginx

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

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

Để kích hoạt giám sát nhật ký cho các lần đăng nhập Nginx, chúng tôi sẽ kích hoạt nhà tù [nginx-http-auth]. Chỉnh sửa chỉ thị enabled trong phần này để nó ghi là “true”:

/etc/fail2ban/jail.local
[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

Đây là nhà tù dành riêng cho Nginx duy nhất có trong gói fail2ban của Ubuntu. Tuy nhiên, chúng tôi có thể tạo các nhà tù của riêng mình để thêm chức năng bổ sung. Nguồn cảm hứng và một số chi tiết triển khai của các nhà tù bổ sung này đến từ đây và đây.

Chúng tôi có thể tạo một nhà tù [nginx-noscript] để 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ể thêm nhà tù 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
[nginx-noscript]

enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
. . .

Chúng ta có thể thêm một phần có tên [nginx-badbots] để ngăn chặn một số mẫu yêu cầu bot độc hại đã biết:

/etc/fail2ban/jail.local
[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

Nếu bạn không sử dụng Nginx để 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ể cấm người dùng yêu cầu các tài nguyên này bằng cách thêm nhà tù [nginx-nohome]:

/etc/fail2ban/jail.local
[nginx-nohome]

enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2

Chúng ta nên cấm các khách hàng cố gắng sử dụng máy chủ Nginx của mình làm proxy mở. Chúng tôi có thể thêm một nhà tù [nginx-noproxy] để phù hợp với các yêu cầu sau:

/etc/fail2ban/jail.local
[nginx-noproxy]

enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

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. Bây giờ chúng tôi phải thêm các bộ lọc cho các nhà tù mà chúng tôi đã tạo.

Thêm bộ lọc cho các nhà tù Nginx bổ sung

Chúng tôi đã cập nhật tệp /etc/fail2ban/jail.local với một số thông số bổ sung về nhà tù để phù hợp và cấm nhiều hành vi xấu hơn. Chúng tôi cần tạo các tệp bộ lọc cho các nhà tù mà chúng tôi đã tạo. Các tệp bộ lọc này sẽ chỉ định các mẫu cần tìm trong nhật ký Nginx.

Bắt đầu bằng cách thay đổi thư mục bộ lọc:

  1. cd /etc/fail2ban/filter.d

Chúng tôi thực sự muốn bắt đầu bằng cách điều chỉnh bộ lọc xác thực Nginx được cung cấp trước để khớp với mẫu nhật ký đăng nhập không thành công bổ sung. Mở tệp để chỉnh sửa:

  1. sudo nano nginx-http-auth.conf

Bên dưới thông số failregex, hãy thêm một mẫu bổ sung. Điều này sẽ khớp với các dòng mà người dùng đã nhập không có tên người dùng hoặc mật khẩu:

/etc/fail2ban/filter.d/nginx-http-auth.conf
[Definition]


failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

Lưu và đóng tệp khi bạn hoàn tất.

Tiếp theo, chúng ta có thể sao chép tệp apache-badbots.conf để sử dụng với Nginx. Chúng tôi có thể sử dụng nguyên trạng tệp này, nhưng chúng tôi sẽ sao chép nó sang một tên mới cho rõ ràng. Điều này phù hợp với cách chúng tôi tham chiếu bộ lọc trong cấu hình nhà tù:

  1. sudo cp apache-badbots.conf nginx-badbots.conf

Tiếp theo, chúng tôi sẽ tạo bộ lọc cho nhà tù [nginx-noscript] của chúng tôi:

  1. sudo nano nginx-noscript.conf

Dán định nghĩa sau vào bên trong. Vui lòng điều chỉnh các hậu tố tập lệnh để xóa các tệp ngôn ngữ mà máy chủ của bạn sử dụng hợp pháp hoặc để thêm các hậu tố bổ sung:

/etc/fail2ban/filter.d/nginx-noscript.conf
[Definition]

failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

Lưu và đóng tập tin.

Tiếp theo, tạo bộ lọc cho nhà tù [nginx-nohome]:

  1. sudo nano nginx-nohome.conf

Đặt thông tin bộ lọc sau vào tệp:

/etc/fail2ban/filter.d/nginx-nohome.conf
[Definition]

failregex = ^<HOST> -.*GET .*/~.*

ignoreregex =

Lưu và đóng tệp khi hoàn tất.

Cuối cùng, chúng ta có thể tạo bộ lọc cho nhà tù [nginx-noproxy]:

  1. sudo nano nginx-noproxy.conf

Định nghĩa bộ lọc này sẽ phù hợp với các nỗ lực sử dụng máy chủ của bạn làm proxy:

/etc/fail2ban/filter.d/nginx-noproxy.conf
[Definition]

failregex = ^<HOST> -.*GET http.*

ignoreregex =

Lưu và đóng tệp khi bạn hoàn tất.

Kích hoạt nhà tù Nginx của bạn

Để thực hiện các thay đổi cấu hình của bạn, bạn cần 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 nhà tù được kích hoạt

Bạn có thể xem tất cả các nhà tù đã bật của mình bằng cách sử dụng lệnh fail2ban-client:

  1. sudo fail2ban-client status

Bạn sẽ thấy một danh sách tất cả các nhà tù mà bạn đã kích hoạt:

Output
Status |- Number of jail: 6 `- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

Bạn có thể xem iptables để 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 khách hàng. Ngay cả khi không có quy tắc tường lửa trước đó, giờ đây bạn sẽ có một khung được kích hoạt cho phép fail2ban cấm có chọn lọc các máy 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-nginx-badbots -N fail2ban-nginx-http-auth -N fail2ban-nginx-nohome -N fail2ban-nginx-noproxy -N fail2ban-nginx-noscript -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A fail2ban-nginx-badbots -j RETURN -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-nginx-nohome -j RETURN -A fail2ban-nginx-noproxy -j RETURN -A fail2ban-nginx-noscript -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ỳ nhà tù nào, có thể sử dụng lại fail2ban-client sẽ dễ dàng hơn:

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/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. Chẳng hạn, đối với lời nhắc xác thực Nginx, 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 bạn đã 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 các thông báo về lệnh cấm trong tài khoản email mà bạn đã cung cấp.

Nếu bạn xem 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 nginx-http-auth
Output
Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/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ể tự bỏ cấm địa chỉ IP của mình bằng fail2ban-client bằng cách nhập:

  1. sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

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

Kết luận

Thiết lập fail2ban để bảo vệ máy chủ Nginx 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 thấy 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 kiến thức cơ bản về cách bảo vệ máy chủ của bạn với fail2ban có thể cung cấp cho bạn rất nhiều biện pháp bảo mật với nỗ lực tối thiểu.

Nếu bạn muốn tìm hiểu thêm về fail2ban, hãy xem các liên kết sau:

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

0 replies