Thứ bảy, 19/12/2015 | 00:00 GMT+7

Cách cài đặt và cấu hình Naxsi trên Ubuntu 14.04

Naxsi là một module Nginx của bên thứ ba cung cấp các tính năng firewall ứng dụng web. Nó mang lại bảo mật bổ sung cho web server của bạn và bảo vệ bạn khỏi các cuộc tấn công web khác nhau như XSS và SQL injection.

Naxsi linh hoạt và mạnh mẽ. Bạn có thể sử dụng các luật sẵn có cho các ứng dụng web phổ biến như WordPress. Đồng thời, bạn cũng có thể tạo ra các luật của riêng mình và tinh chỉnh chúng bằng cách sử dụng chế độ học tập của Naxsi.

Naxsi tương tự như ModSecurity cho Apache . Vì vậy, nếu bạn đã quen với ModSecurity và / hoặc tìm kiếm chức năng tương tự cho Nginx, Naxsi chắc chắn sẽ quan tâm đến bạn. Tuy nhiên, bạn có thể không tìm thấy tất cả các tính năng của ModSecurity trong Naxsi.

Hướng dẫn này chỉ cho bạn cách cài đặt Naxsi, hiểu các luật , tạo danh sách trắng và nơi tìm các luật đã được viết cho các ứng dụng web thường được sử dụng.

Yêu cầu

Trước khi làm theo hướng dẫn này, hãy đảm bảo bạn hoàn thành các yêu cầu sau:

Trừ khi có lưu ý khác, tất cả các lệnh yêu cầu quyền root trong hướng dẫn này phải được chạy với quyền user không phải root có quyền sudo.

Bước 1 - Cài đặt Naxsi

Để cài đặt Naxsi, bạn sẽ phải cài đặt một server Nginx được biên dịch với nó. Vì mục đích này, bạn cần gói nginx-naxsi . Bạn có thể cài đặt nó theo cách Ubuntu thông thường bằng apt-get :

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

Điều này sẽ cài đặt Naxsi cùng với Nginx và tất cả các phụ thuộc của nó. Nó cũng sẽ đảm bảo dịch vụ bắt đầu và dừng tự động trên Server.

Lưu ý: Nếu bạn đã cài đặt Nginx mà không có Naxsi, bạn cần thay thế gói nginx-core hoặc một hương vị khác của Nginx mà bạn có thể có, bằng gói nginx-naxsi . Các gói Nginx khác không hỗ trợ module có thể tải và bạn không thể chỉ tải Naxsi vào server Nginx hiện có.

Trong hầu hết các trường hợp, việc thay thế nginx-core bằng nginx-naxsi không phải là vấn đề và bạn có thể tiếp tục sử dụng cấu hình trước đó của bạn . Tuy nhiên, với việc nâng cấp như vậy luôn là một ý kiến hay khi tạo bản backup cho folder /etc/nginx/ hiện có của bạn trước. Sau đó, hãy làm theo hướng dẫn để cài đặt mới và chỉ cần xác nhận bạn đồng ý xóa gói Nginx hiện có trên hệ thống của bạn .

Cài đặt mặc định của Nginx cung cấp một môi trường Nginx hoạt động cơ bản, đủ để làm quen với Naxsi. Ta sẽ không dành thời gian tùy chỉnh Nginx mà thay vào đó ta sẽ chuyển thẳng đến cấu hình Naxsi. Tuy nhiên, nếu bạn chưa có kinh nghiệm với Nginx, bạn nên xemCách cài đặt Nginx trên Ubuntu 14.04 LTS và các bài viết liên quan đến nó, đặc biệt là Cách cài đặt khối server Nginx ( Server ảo) trên Ubuntu 14.04 LTS .

Bước 2 - Bật Naxsi

Đầu tiên, để kích hoạt Naxsi, ta phải tải các luật cốt lõi của nó được tìm thấy trong file /etc/nginx/naxsi_core.rules . Tệp này chứa các chữ ký chung để phát hiện các cuộc tấn công độc hại. Ta sẽ thảo luận chi tiết hơn về các luật này sau. Hiện tại, ta sẽ chỉ đưa các luật vào file cấu hình chính của Nginx /etc/nginx/nginx.conf trong phần trình nghe HTTP. Vì vậy, hãy mở file sau để chỉnh sửa bằng nano:

  • sudo nano /etc/nginx/nginx.conf

Sau đó, tìm phần http và bỏ ghi chú phần bao gồm cho các luật của Naxsi bằng cách xóa ký tự # ở đầu dòng. Bây giờ nó sẽ trông như thế này:

/etc/nginx/nginx.conf
http { ...         # nginx-naxsi config         ##         # Uncomment it if you installed nginx-naxsi         ##          include /etc/nginx/naxsi_core.rules; ... 

Lưu file và thoát khỏi editor .

Thứ hai, ta phải kích hoạt các luật trước đó và cấu hình một số tùy chọn cơ bản cho Naxsi. Theo mặc định, cấu hình Naxsi cơ bản được tìm thấy trong file /etc/nginx/naxsi.rules . Mở file này:

  • sudo nano /etc/nginx/naxsi.rules

Chỉ thay đổi giá trị cho DeniedUrl thành một file lỗi đã tồn tại theo mặc định và giữ nguyên phần còn lại:

/etc/nginx/naxsi.rules
# Sample rules file for default vhost. LearningMode; SecRulesEnabled; #SecRulesDisabled; DeniedUrl "/50x.html";  ## check rules CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK; 

Lưu file và thoát.

Dưới đây là các lệnh cấu hình từ bên trên với ý nghĩa của chúng:

  • LearningMode - Khởi động Naxsi ở chế độ học tập. Điều này nghĩa là không có yêu cầu nào sẽ thực sự bị chặn. Chỉ các ngoại lệ bảo mật sẽ được nêu ra trong log lỗi Nginx. Một hành vi ban đầu không chặn như vậy là quan trọng vì các luật mặc định khá linh hoạt. Sau đó, dựa trên những ngoại lệ này, ta sẽ tạo danh sách trắng cho lưu lượng truy cập hợp lệ .
  • SecRulesEnabled - Bật Naxsi cho khối / vị trí server . Tương tự, bạn có thể tắt Naxsi cho một trang hoặc một phần của trang bằng cách bỏ ghi chú SecRulesDisabled .
  • DeniedUrl - URL mà các yêu cầu bị từ chối sẽ được gửi nội bộ. Đây là cài đặt duy nhất bạn nên thay đổi. Bạn có thể sử dụng trang lỗi 50x.html sẵn có được tìm thấy bên trong root tài liệu mặc định ( /usr/share/nginx/html/50x.html ) hoặc bạn có thể tạo trang lỗi tùy chỉnh của riêng mình.
  • CheckRule - Đặt ngưỡng cho các bộ đếm khác nhau. Khi vượt qua ngưỡng này (ví dụ: 8 điểm cho bộ đếm SQL), yêu cầu sẽ bị chặn. Để làm cho các luật này trở nên tích cực hơn, hãy giảm giá trị của chúng và ngược lại.

Tệp naxsi.rules phải được tải trên cơ sở từng vị trí cho một khối server . Hãy tải nó cho vị trí root ( / ) của khối server mặc định. Đầu tiên, hãy mở file cấu hình của khối server /etc/nginx/sites-enabled/default :

  • sudo nano /etc/nginx/sites-enabled/default

Sau đó, tìm vị trí root / và đảm bảo nó trông giống như sau:

    location / {             # First attempt to serve request as file, then             # as directory, then fall back to displaying a 404.             try_files $uri $uri/ =404;             # Uncomment to enable naxsi on this location             include /etc/nginx/naxsi.rules;     } 

Cảnh báo: Đảm bảo thêm dấu chấm phẩy vào cuối câu lệnh include cho naxsi.rules vì không có dấu chấm phẩy theo mặc định. Vì vậy, nếu bạn chỉ bỏ ghi chú câu lệnh, sẽ có một lỗi cú pháp trong cấu hình.

Khi bạn đã áp dụng các thay đổi ở trên, bạn có thể reload Nginx để các thay đổi có hiệu lực:

  • sudo service nginx reload

Bước tiếp theo giải thích cách kiểm tra xem các thay đổi đã thành công hay chưa và cách đọc log .

Bước 3 - Kiểm tra Nhật ký

Để đảm bảo Naxsi hoạt động, ngay cả khi vẫn đang ở chế độ học tập, hãy truy cập vào một URL sẽ đưa ra ngoại lệ và xem log lỗi để tìm ngoại lệ.

Sau này ta sẽ xem cách thức hoạt động chính xác của luật này. Hiện tại, hãy kiểm tra log lỗi của Nginx để tìm ngoại lệ (tùy chọn -f giữ kết quả mở và gắn nội dung mới vào đó:

  • sudo tail -f /var/log/nginx/error.log

Cố gắng truy cập Server tại URL http:// Your_Server_IP /index.html?asd=---- . Điều này sẽ kích hoạt một ngoại lệ bảo mật Naxsi vì các dấu gạch ngang, được sử dụng cho các chú thích trong SQL và do đó được coi là một phần của SQL injection.

Trong kết quả của sudo tail -f /var/log/nginx/error.log , bây giờ bạn sẽ thấy nội dung mới sau:

Output of nginx's error log
2015/11/14 03:58:35 [error] 4088#0: *1 NAXSI_FMT: ip=X.X.X.X&server=Y.Y.Y.Y&uri=/index.html&learning=1&total_processed=24&total_blocked=1&zone0=ARGS&id0=1007&var_name0=asd, client: X.X.X.X, server: localhost, request: "GET /index.html?asd=---- HTTP/1.1", host: "Y.Y.Y.Y"

Phần quan trọng nhất của dòng trên được đánh dấu: zone0=ARGS&id0=1007&var_name0=asd . Nó cung cấp cho bạn vùng (một phần của yêu cầu), id của luật được kích hoạt và tên biến của yêu cầu đáng ngờ.

Hơn nữa, XXXX là IP máy tính local của bạn và YYYY là IP của Server. URI cũng chứa tên file của yêu cầu ( index.htm ), thực tế là Naxsi vẫn đang làm việc ở chế độ learning=1 ( learning=1 ) và tổng số tất cả các yêu cầu đã xử lý ( total_processed=24 ).

Ngoài ra, ngay sau dòng trên, sẽ có một thông báo về chuyển hướng đến DeniedUrl :

Output of nginx's error log
2015/11/14 03:58:35 [error] 4088#0: *1 rewrite or internal redirection cycle while internally redirecting to "/50x.html" while sending response to client, client: X.X.X.X, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "Y.Y.Y.Y", referrer: "http://Y.Y.Y.Y/index.html?asd=----"

Khi Naxsi ở chế độ học tập, chuyển hướng này sẽ chỉ hiển thị trong log nhưng sẽ không thực sự xảy ra.

Nhấn CTRL-C để thoát tail và dừng xuất file log lỗi.

Sau đó, ta sẽ tìm hiểu thêm về các luật của Naxsi, và sau đó điều quan trọng là phải có hiểu biết cơ bản này về các bản ghi.

Bước 4 - Cấu hình luật Naxsi

Phần quan trọng nhất trong cấu hình của Naxsi là các luật của nó. Có hai loại luật - luật chính và luật cơ bản. Các luật chính (được xác định bởi MainRule ) được áp dụng trên phạm vi global cho server và do đó là một phần của khối http trong cấu hình của Nginx chính. Chúng chứa các chữ ký chung để phát hiện các hoạt động độc hại.

Các luật cơ bản (được xác định bởi BasicRule ) được sử dụng chủ yếu để đưa vào danh sách trắng các chữ ký và luật dương tính giả. Chúng được áp dụng cho mỗi vị trí và do đó phải là một phần của cấu hình khối server (vhost).

Hãy bắt đầu với những luật chính, và hãy nhìn vào những cái mặc định được cung cấp bởi các nginx-naxsi gói trong file /etc/nginx/naxsi_core.rules . Đây là một dòng mẫu:

/etc/nginx/naxsi_core.rules
... MainRule "str:--" "msg:mysql comment (--)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1007; ... 

Từ luật trên, ta có thể phác thảo các phần sau, phổ biến và có trong mọi luật :

  • MainRule là chỉ thị để bắt đầu mọi luật . Tương tự, mọi luật đều kết thúc bằng số id của luật .
  • str: được tìm thấy trong phần thứ hai của luật . Nếu nó là str: nghĩa là chữ ký sẽ là một chuỗi thuần túy, theo ví dụ trên. Biểu thức chính quy cũng có thể được đối sánh với chỉ thị rx:
  • msg: đưa ra một số làm rõ về luật .
  • mz: viết tắt của vùng đối sánh, hoặc phần nào của yêu cầu sẽ được kiểm tra. Đây có thể là nội dung, URL, các đối số, v.v.
  • s: xác định điểm sẽ được ấn định khi tìm thấy chữ ký. Điểm được thêm vào các bộ đếm khác nhau như SQL (tấn công SQL), RFI (tấn công bao gồm file từ xa), v.v.

Về cơ bản, luật trên ( id 1007 ) với comment mysql comments nghĩa là nếu chuỗi -- được tìm thấy trong bất kỳ phần nào của yêu cầu (nội dung, đối số, v.v.), 4 điểm sẽ được thêm vào bộ đếm SQL.

Nếu ta quay lại ví dụ URI ( http:// Your_Server_IP /index.html?asd=---- ) đã kích hoạt ngoại lệ SQL trong log , bạn sẽ nhận thấy rằng để kích hoạt luật 1007, ta cần 2 cặp dấu gạch ngang ( -- ). Điều này là do đối với mỗi cặp, ta nhận được 4 điểm và chuỗi SQL cần 8 điểm để chặn một yêu cầu. Do đó, chỉ một cặp dấu gạch ngang sẽ không có vấn đề gì và trong hầu hết các trường hợp, lưu lượng truy cập hợp lệ sẽ không bị ảnh hưởng.

Một chỉ thị luật đặc biệt là negative . Nó áp dụng điểm nếu chữ ký không khớp, tức là bạn nghi ngờ hoạt động độc hại khi thiếu một thứ gì đó trong yêu cầu.

Ví dụ: hãy xem luật với id 1402 từ cùng một file /etc/nginx/naxsi_core.rules :

/etc/nginx/naxsi_core.rules
... MainRule negative "rx:multipart/form-data|application/x-www-form-urlencoded" "msg:Content is neither mulipart/x-www-form.." "mz:$HEADERS_VAR:Content-type" "s:$EVADE:4" id:1402; ... 

Luật trên nghĩa là 4 điểm sẽ được thêm vào bộ đếm EVADE nếu tiêu đề yêu cầu Content-type không có multipart/form-data hoặc application/x-www-form-urlencoded trong đó. Luật này cũng là một ví dụ về cách có thể sử dụng biểu thức chính quy ( rx: :) cho mô tả chữ ký.

Bước 5 - Luật lập danh sách trắng

Các luật Naxsi mặc định gần như chắc chắn sẽ chặn một số lưu lượng truy cập hợp lệ trên trang web , đặc biệt nếu bạn có một ứng dụng web phức tạp hỗ trợ nhiều loại tương tác của user . Đó là lý do tại sao có danh sách trắng để giải quyết các vấn đề như vậy.

Danh sách trắng được tạo ra với loại luật thứ hai, luật cơ bản của Naxsi. Với một luật cơ bản, bạn có thể đưa toàn bộ luật vào danh sách trắng hoặc các phần của luật đó.

Để chứng minh cách hoạt động của các luật cơ bản, hãy quay lại luật comment SQL (id 1007). Hãy tưởng tượng rằng bạn có một file có hai dấu gạch ngang trong tên file , ví dụ: some--file.html trên trang web . Với luật 1007, file này sẽ tăng bộ đếm SQL lên 4 điểm. Chỉ riêng tên file này và điểm số kết quả không đủ để chặn một yêu cầu, nhưng nó vẫn là một dương tính giả có thể gây ra sự cố. Ví dụ: nếu ta cũng có một đối số với hai dấu gạch ngang trong đó, thì yêu cầu sẽ kích hoạt luật 1007.

Để kiểm tra nó, hãy chỉnh sửa log lỗi như trước:

  • sudo tail -f /var/log/nginx/error.log

Hãy thử truy cập http:// Your_Server_IP /some--file.html?asd=-- . Bạn không cần phải có file này trên trang web của bạn để làm bài kiểm tra.

Bạn sẽ thấy một ngoại lệ quen thuộc tương tự như ngoại lệ này trong kết quả của log lỗi:

Output of nginx's error log
2015/11/14 14:43:36 [error] 5182#0: *10 NAXSI_FMT: ip=X.X.X.X&server=Y.Y.Y.Y&uri=/some--file.html&learning=1&total_processed=10&total_blocked=6&zone0=URL&id0=1007&var_name0=&zone1=ARGS&id1=1007&var_name1=asd, client: X.X.X.X, server: localhost, request: "GET /some--file.html?asd=-- HTTP/1.1", host: "Y.Y.Y.Y"

Nhấn CTRL-C để ngừng hiển thị kết quả log lỗi.

Để giải quyết trình kích hoạt dương tính giả này, ta cần một danh sách trắng trông giống như sau:

BasicRule wl:1007 "mz:URL"; 

Từ khóa quan trọng là wl cho danh sách trắng, theo sau là ID luật . Nói chính xác hơn những gì ta đang đưa vào danh sách trắng, ta cũng đã chỉ định vùng đối sánh - URL.

Để áp dụng danh sách trắng này, trước tiên hãy tạo một file mới cho danh sách trắng:

  • sudo nano /etc/nginx/naxsi_whitelist.rules

Sau đó, dán luật vào file :

/etc/nginx/naxsi_whitelist.rules
BasicRule wl:1007 "mz:URL"; 

Nếu bạn có các danh sách trắng khác, chúng cũng có thể đi vào file này, mỗi danh sách trên một hàng mới.

Tệp có danh sách trắng phải được đưa vào khối server của bạn. Để đưa nó vào khối server mặc định, hãy sử dụng lại nano:

  • sudo nano /etc/nginx/sites-enabled/default

Sau đó thêm bao gồm mới ngay sau bao gồm trước đó cho Naxsi như thế này:

/ etc / nginx / sites-enable / default
         location / {                 # First attempt to serve request as file, then                 # as directory, then fall back to displaying a 404.                 try_files $uri $uri/ =404;                 # Uncomment to enable naxsi on this location                 include /etc/nginx/naxsi.rules;                 include /etc/nginx/naxsi_whitelist.rules;         } 

Để thay đổi này có hiệu lực, hãy reload Nginx:

  • sudo service nginx reload

Bây giờ, nếu bạn thử lại yêu cầu tương tự trong trình duyệt của bạn đối với Your_Server_IP /some--file.html?asd=-- chỉ tham số asd bằng hai dấu gạch ngang sẽ kích hoạt 4 điểm cho bộ đếm SQL, nhưng tên file không phổ biến thì không. Do đó, bạn sẽ không thấy yêu cầu này trong log lỗi như một ngoại lệ.

Viết tất cả các danh sách trắng cần thiết có thể là một công việc tẻ nhạt và là một khoa học của riêng nó. Đó là lý do tại sao ngay từ đầu, bạn có thể sử dụng danh sách trắng Naxsi có sẵn. Có như vậy cho hầu hết các ứng dụng web phổ biến. Bạn chỉ cần tải chúng xuống và đưa chúng vào khối server như ta vừa làm.

Khi bạn đã chắc chắn rằng bạn không thấy bất kỳ ngoại lệ nào cho các yêu cầu hợp lệ trong log lỗi, bạn có thể tắt chế độ học tập của Naxsi. Vì mục đích này, hãy mở file /etc/nginx/naxsi.rules bằng nano:

  • sudo nano /etc/nginx/naxsi.rules

Comment chỉ thị LearningMode bằng cách thêm ký tự # vào trước nó như sau:

/etc/nginx/naxsi.rules
... #LearningMode; SecRulesEnabled; #SecRulesDisabled; ... 

Cuối cùng, reload Nginx để thay đổi có hiệu lực:

  • sudo service nginx reload

Như vậy, Naxsi sẽ chặn mọi yêu cầu đáng ngờ và trang web sẽ an toàn hơn.

Kết luận

Đó là cách dễ dàng để có một firewall ứng dụng web với Nginx và Naxsi. Như vậy là đủ cho sự khởi đầu và hy vọng bạn sẽ quan tâm đến việc tìm hiểu thêm về những gì mà module Naxsi mạnh mẽ cung cấp. Như vậy, bạn có thể làm cho server Nginx của bạn không chỉ nhanh mà còn an toàn.


Tags:

Các tin liên quan

Cách backup database OrientDB của bạn trên Ubuntu 14.04
2015-12-19
Cách cài đặt và cấu hình OrientDB trên Ubuntu 14.04
2015-12-19
Cách cài đặt VestaCP và thiết lập trang web trên Ubuntu 14.04
2015-12-16
Cách cài đặt Go 1.6 trên Ubuntu 14.04
2015-12-04
Cách cài đặt Go 1.6 trên Ubuntu 14.04
2015-12-04
Cách triển khai ứng dụng Symfony sang sản xuất trên Ubuntu 14.04
2015-11-24
Cách triển khai Hugo Site sang Sản xuất với Git Hooks trên Ubuntu 14.04
2015-11-12
Cách cài đặt và sử dụng Hugo, Trình tạo trang web tĩnh, trên Ubuntu 14.04
2015-11-09
Cách tạo thiết lập HAProxy khả dụng cao với Corosync, Pacemaker và IP nổi trên Ubuntu 14.04
2015-11-05
Cách cài đặt Elasticsearch 1.7, Logstash 1.5 và Kibana 4.1 (ELK Stack) trên Ubuntu 14.04
2015-11-04