Thứ sáu, 14/08/2015 | 00:00 GMT+7

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

Khi vận hành một web server , đ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à user của bạn. Bảo vệ các trang web và ứng dụng của bạn bằng các policy firewall và hạn chế quyền truy cập vào các khu vực nhất định bằng xác thực password là một đ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ỳ dấu nhắc password nào có thể truy cập đều có khả năng thu hút các nỗ lực vũ phu từ user và bot độc hại.

Cài đặt fail2ban có thể giúp giảm bớt vấn đề này. Khi user liên tục không xác thực được 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 policy firewall đang chạy. Mỗi "nhà tù" fail2ban hoạt động bằng cách kiểm tra các bản ghi được viết bởi một dịch vụ để tìm các mẫu biểu thị các lần thử không thành công. Việc cài đặt fail2ban để theo dõi log 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 ta sẽ tự tạo.

Trong hướng dẫn này, ta sẽ trình bày cách cài đặt fail2ban và cấu hình nó để giám sát log Nginx của bạn để tìm các nỗ lực xâm nhập. Ta sẽ sử dụng server Ubuntu 14.04.

Yêu cầu

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

Cài đặt Nginx và cấu hình xác thực password

Nếu bạn quan tâm đến việc bảo vệ server Nginx của bạn bằng fail2ban , bạn có thể đã cài đặt và chạy một server . Nếu không, bạn có thể cài đặt Nginx từ repository mặc định của Ubuntu bằng cách sử dụng apt .

Cập nhật index gói local và cài đặt bằng lệnh :

  • sudo apt-get update
  • sudo apt-get install nginx

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

Cài đặt Fail2Ban

Sau khi server Nginx của bạn đang chạy và xác thực password được bật, bạn có thể tiếp tục và cài đặt fail2ban ( ta bao gồm tìm nạp lại repository khác ở đây trong trường hợp bạn đã cài đặt Nginx ở các bước trước):

  • sudo apt-get update
  • sudo apt-get install fail2ban

Thao tác này sẽ cài đặt phần mềm. Theo mặc định, fail2ban được cấu hình để chỉ cấm các lần đăng nhập SSH không thành công. Ta cần bật một số luật sẽ cấu hình nó để kiểm tra log Nginx của ta để 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, ta cần điều chỉnh file cấu hình mà fail2ban sử dụng để xác định log ứng dụng nào cần theo dõi và những hành động cần thực hiện khi tìm thấy các mục nhập vi phạm. /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, ta cần sao chép file này vào /etc/fail2ban/jail.local . Điều này sẽ ngăn các thay đổi của ta không bị overrides nếu bản cập nhật gói cung cấp file mặc định mới:

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

Mở file mới được sao chép để ta có thể cài đặt giám sát log Nginx của bạn :

  • sudo nano /etc/fail2ban/jail.local

Thay đổi mặc định

Ta nên bắt đầu bằng cách đánh giá các giá trị mặc định được đặt trong file để xem chúng có phù hợp với nhu cầu của ta hay không. Chúng sẽ được tìm thấy trong phần [DEFAULT] trong file . Những mục này cài đặt policy chung và mỗi mục có thể bị overrides 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 phải tuân theo policy fail2ban . Điều này được cài đặt 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 các trường hợp ngoại lệ để tránh tự khóa mình. Đây là ít vấn đề hơn với đăng nhập web server 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 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ể cầ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 điều này thành một khoảng thời gian đủ dài để làm gián đoạn nỗ lực của kẻ xấu, trong khi đủ ngắn để cho phép user hợp lệ sửa chữa sai lầm. Theo mặc định, điều 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 log được sử dụng để xác định khách hàng vi phạm. Thời 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 hơn maxretry lần thử tối đa trong repository ảng thời gian được đặt bởi thời gian findtime , 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. 

Cài đặt thông báo 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ư khi nào có lệnh cấm. Để làm như vậy, trước tiên bạn sẽ phải cài đặt MTA trên server của bạn để 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 .

Sau khi cài đặt xong MTA, bạn sẽ phải điều chỉnh một số cài đặt bổ sung trong phần [DEFAULT] của file /etc/fail2ban/jail.local . Bắt đầu bằng cách cài đặt chỉ thị mta . Nếu bạn cài đặt 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 chỉ thị destemail với giá trị này. Lệnh sendername được dùng để sửa đổi trường “Người gửi” 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 , “hành động” là quy trình được tuân theo khi client 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 trước khác được dùng nếu bạn đã cài đặt thư.

Bạn có thể sử dụng hành động action_mw để cấm ứng dụng client và gửi thông báo qua email đến account đã 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 log vi phạm đã kích hoạt lệnh cấm:

/etc/fail2ban/jail.local
[DEFAULT]  . . . action = %(action_mwl)s 

Cấu hình Fail2Ban để theo dõi log Nginx

Đến đây bạn đã có một số cài đặt fail2ban chung, ta 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 log web server của ta để biết các mẫu hành vi cụ thể.

Mỗi tù trong file cấu hình được đánh dấu bằng tiêu đề chứa tên 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 tù cụ thể). Theo mặc định, chỉ có [ssh] jail được kích hoạt.

Để kích hoạt tính năng giám sát log cho các lần đăng nhập Nginx, ta sẽ bật trình giam [nginx-http-auth] . Chỉnh sửa chỉ thị enabled trong phần này để nó có nội dung 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à bản jail dành riêng cho Nginx duy nhất có trong gói fail2ban của Ubuntu. Tuy nhiên, ta có thể tạo 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 thực hiện của những nhà tù bổ sung này đến từ đâyđây .

Ta 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 cùng với web server của bạn , bạn có thể thêm 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 . . . 

Ta có thể thêm một phần có tên [nginx-badbots] để ngă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 folder chính của user , bạn có thể cấm những user yêu cầu các tài nguyên này bằng cách thêm 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 

Ta nên cấm các khách hàng cố gắng sử dụng server Nginx của ta làm proxy mở. Ta có thể thêm một nhà tù [nginx-noproxy] để đáp ứng 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 hoàn tất các sửa đổi cần thiết, hãy lưu file . Bây giờ ta phải thêm các bộ lọc cho nhà tù mà ta đã tạo.

Thêm bộ lọc để bổ sung Nginx Jail

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

Bắt đầu bằng cách thay đổi folder bộ lọc:

  • cd /etc/fail2ban/filter.d

Ta 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 để trùng với một mẫu log đăng nhập không thành công bổ sung. Mở file để chỉnh sửa:

  • sudo nano nginx-http-auth.conf

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

/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 file khi bạn hoàn tất.

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

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

Tiếp theo, ta sẽ tạo một bộ lọc cho nhà tù [nginx-noscript] của ta :

  • 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 file ngôn ngữ mà server của bạn sử dụng hợp lệ 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 file .

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

  • sudo nano nginx-nohome.conf

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

/etc/fail2ban/filter.d/nginx-nohome.conf
[Definition]  failregex = ^<HOST> -.*GET .*/~.*  ignoreregex = 

Lưu file khi hoàn tất.

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

  • 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 server của bạn làm proxy:

/etc/fail2ban/filter.d/nginx-noproxy.conf
[Definition]  failregex = ^<HOST> -.*GET http.*  ignoreregex = 

Lưu file khi bạn hoàn tất.

Kích hoạt Nginx Jails của bạn

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

  • sudo service fail2ban restart

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

Nhận thông tin về Jail đã bật

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

  • sudo fail2ban-client status

Bạn sẽ thấy 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ể nhìn vào iptables để thấy rằng fail2ban đã sửa đổi các luật firewall của bạn để tạo một khuôn khổ cấm client . Ngay cả khi không có luật firewall trước đây, bây giờ bạn sẽ có một khuôn khổ được kích hoạt cho phép fail2ban cấm khách hàng một cách có chọn lọc bằng cách thêm chúng vào các chuỗi được xây dựng có mục đích:

  • 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 đang được thực thi bởi bất kỳ nhà tù nào, có thể dễ dàng sử dụng lại fail2ban-client :

  • 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

Thử nghiệm Fail2Ban Policies

Điều quan trọng là phải kiểm tra các policy 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 dấu 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 một số 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 cài đặt thông báo qua email, bạn sẽ thấy các thông báo về lệnh cấm trong account email bạn đã cung cấp.

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

  • 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 thấy ổn rằng các luật của bạn đang hoạt động, bạn có thể bỏ cấm địa chỉ IP của bạn theo cách thủ công với fail2ban-client bằng lệnh :

  • sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

Đến đây bạn có thể thử xác thực lại.

Kết luận

Việc cài đặt fail2ban để bảo vệ server Nginx của bạn khá dễ hiểu 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 policy 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 file /etc/fail2ban/jail.local và các file mà nó phụ thuộc vào trong folder /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 kiến thức cơ bản về cách bảo vệ server của bạn với fail2ban có thể cung cấp cho bạn mức độ bảo mật tuyệt vời 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:


Tags:

Các tin liên quan

Cách cài đặt HHVM với Nginx trên Ubuntu 14.04
2015-08-12
Cách thiết lập xác thực mật khẩu với Nginx trên Ubuntu 14.04
2015-08-10
Cách cài đặt Nginx trên Debian 8
2015-07-09
Cách lưu trữ nhiều trang web một cách an toàn với Nginx và Php-fpm trên Ubuntu 14.04
2015-07-01
Cách tạo blog bằng Ghost và Nginx trên Ubuntu 14.04
2015-06-28
Cách tạo chứng chỉ ECC trên Nginx cho Debian 8
2015-06-23
Cách nâng cấp Nginx tại chỗ mà không làm rớt kết nối client
2015-06-15
Cách cấu hình Nginx để sử dụng các trang lỗi tùy chỉnh trên Ubuntu 14.04
2015-06-05
Cách cấu hình Nginx để sử dụng các trang lỗi tùy chỉnh trên CentOS 7
2015-06-05
Cách chuyển hướng www sang không có www với Nginx trên CentOS 7
2015-05-04