Thứ sáu, 12/02/2016 | 00:00 GMT+7

Cách bảo mật Nginx trên Ubuntu 14.04

Nginx là một web server rất an toàn và tin cậy ngay cả với cài đặt mặc định. Tuy nhiên, có nhiều cách để bảo mật Nginx hơn nữa.

Trong bài viết này, ta sẽ sử dụng độc quyền phần mềm open-souce trong khi cố gắng tuân theo một số phương pháp tiếp cận và tiêu chuẩn bảo mật web server phổ biến. Cụ thể, ta sẽ nói về việc ngăn chặn tiết lộ thông tin, thực thi mã hóa, thực hiện kiểm toán và hạn chế quyền truy cập.

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ập nhật tất cả phần mềm

Cập nhật phần mềm của bạn lên version mới nhất là bước đầu tiên tuyệt vời trong việc bảo mật toàn bộ hệ thống của bạn, không chỉ Nginx.

Cảnh báo: trước khi cập nhật tất cả các gói trên hệ thống của bạn, hãy đảm bảo xác định xem điều này có gây ra sự cố với bất kỳ thứ gì đang chạy trên hệ thống của bạn ngoài Nginx hay không. Bạn nên tạo bản backup toàn bộ hệ thống trước khi thực hiện một thao tác ảnh hưởng đến nhiều gói cùng một lúc. Bạn có thể hoàn nguyên về bản backup nếu vấn đề phát sinh sau khi cập nhật tất cả các gói. Để cập nhật danh sách gói repository và sau đó tất cả các gói hiện được cài đặt được quản lý bằng apt-get trên server Ubuntu của bạn, hãy chạy các lệnh:

  • sudo apt-get update && sudo apt-get upgrade

Ngoài ra, bạn có thể chỉ cần nâng cấp Nginx lên version mới nhất trong repository lưu trữ Ubuntu. Điều này sẽ nâng cấp gói Nginx và bất kỳ phụ thuộc cần thiết nào:

  • sudo apt-get upgrade nginx

Bước 2 - Ngăn tiết lộ thông tin

Để bắt đầu củng cố web server Nginx của bạn, hãy bắt đầu với việc hạn chế thông tin mà nó tiết lộ. Thông tin có giá trị bị rò rỉ ở mọi cấp độ từ tiêu đề server HTTP đến báo cáo lỗi ứng dụng.

Vì vậy, hãy bắt đầu với tiêu đề HTTP. Theo mặc định, Nginx hiển thị tên và version của nó trong tiêu đề HTTP. Bạn có thể kiểm tra thông tin này bằng cách curl như sau:

  • curl -I http://localhost

Đầu ra sẽ giống như sau:

Output of curl -I http://localhost
HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) ... 

Như bạn thấy , version của Nginx và tên của hệ điều hành có thể được nhìn thấy trong kết quả ở trên. Đây không hẳn là một vấn đề nghiêm trọng mà là một phần của câu đố mà kẻ tấn công sẽ cố gắng giải quyết để xâm phạm server Nginx của bạn. Đó là lý do tại sao ta sẽ ẩn thông tin này bằng cách mở file cấu hình chính của Nginx /etc/nginx/nginx.conf bằng nano như sau:

  • sudo nano /etc/nginx/nginx.conf

Sau đó, bên trong phần cấu hình http thêm dòng server_tokens off; như thế này:

/etc/nginx/nginx.conf
http {          ##         # Basic Settings         ##         server_tokens off; ... 

Sau đó, lưu và thoát file , đồng thời reload Nginx để thay đổi có hiệu lực:

  • sudo service nginx reload

Bây giờ, nếu bạn thử lại cùng một lệnh curl:

  • curl -I http://localhost

Bạn sẽ thấy ít thông tin hơn:

Output of curl -I http://localhost
HTTP/1.1 200 OK Server: nginx ... 

Kết quả ở trên chỉ tiết lộ thực tế rằng đây là một server Nginx. Bạn có thể tự hỏi nếu bạn cũng có thể loại bỏ điều này. Thật không may, điều này không dễ dàng thực hiện được vì không có tùy chọn cấu hình cho nó. Thay vào đó, bạn sẽ phải biên dịch lại Nginx từ nguồn không đáng để nỗ lực.

Bên cạnh tiêu đề Server , có một tiêu đề khác chứa thông tin nhạy cảm - X-Powered-By . Tiêu đề này thường hiển thị version của PHP, Tomcat hoặc bất kỳ công cụ phía server nào đằng sau Nginx. Nếu bạn chạy Nginx với PHP, kết quả của curl sẽ giống như sau:

Output of curl -I http://localhost on nginx with php
HTTP/1.1 200 OK Server: nginx ... X-Powered-By: PHP/5.5.9-1ubuntu4.14 ... 

Tiêu đề X-Powered-By ở trên cho thấy server là Ubuntu 14 chạy PHP version 5.5.9. Điều rất quan trọng là phải ẩn thông tin này khỏi tiêu đề X-Powered-By . Bạn không thể làm điều này trong Nginx, nhưng thay vào đó, bạn nên tìm tùy chọn tương ứng trong công cụ backend . Ví dụ, với trường hợp của PHP, bạn phải đặt tùy chọn expose_php = Off trong file cấu hình php.ini chính. Theo mặc định, tùy chọn này được đặt thành On .

Việc tiếp theo cần làm là thay đổi các trang lỗi 4xx (phía client ), thông tin mà kẻ tấn công có thể sử dụng. Thông thường, đây là các trang lỗi Unauthorized 401Forbidden 403 Unauthorized 401 . Trừ khi bạn đang gỡ lỗi một vấn đề, thường thì không cần hiển thị những lỗi này cho những người truy cập thường xuyên. Nếu bạn cần biết về những lỗi này, bạn vẫn có thể tìm thấy chúng trong log lỗi Nginx ( /var/log/nginx/error.log ).

Để thay đổi hai trang lỗi này, hãy mở file cấu hình cho server block của bạn, ví dụ: file mặc định:

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

Bên trong phần cấu hình server chủ chính chỉ định:

/ etc / nginx / sites-enable / default
server { ...         error_page 401 403 404 /404.html; ... 

Sau khi lưu các thay đổi vào file , hãy đảm bảo reload Nginx để nó có hiệu lực bằng lệnh:

  • sudo service nginx reload

Các gợi ý trên cung cấp cho bạn ý tưởng về việc ngăn chặn tiết lộ thông tin - hiển thị càng ít nội dung web không cần thiết càng tốt. Bạn nên ẩn thông tin dịch vụ và gỡ lỗi không chỉ trong Nginx mà còn trong các công cụ backend (PHP, Tomcat, v.v.) và tất nhiên, trong các ứng dụng web.

Bước 2 - Cấu hình SSL

Chạy giao thức HTTPS an toàn với SSL trên Nginx là điều bắt buộc đối với bất kỳ trang web nào xử lý thông tin nhạy cảm như thông tin đăng nhập của user , dữ liệu cá nhân, v.v. SSL là phương tiện duy nhất đảm bảo dù user trang web ở đâu và kết nối Internet nào họ sử dụng, thông tin họ nhận và gửi sẽ được bảo vệ.

Bài viết Cách tạo certificate SSL trên Nginx cho Ubuntu 14.04 giải thích cách dễ dàng cài đặt SSL miễn phí với cấu hình HTTPS mặc định. Mặc dù bài viết này là một khởi đầu tốt, nhưng nó sẽ không bảo vệ dữ liệu một cách hiệu quả. Ngày nay, các thuật toán và cài đặt SSL mặc định không đủ mạnh để ngăn kẻ tấn công giải mã lưu lượng của bạn.

Đó là lý do tại sao ta sẽ cấu hình certificate SSL cho Nginx với các thuật toán và cài đặt mã hóa mạnh hơn. Điều này sẽ đảm bảo mức độ bảo vệ cao hơn cho dữ liệu và dịch vụ HTTPS của bạn sẽ tuân theo các tiêu chuẩn và thông lệ bảo mật cao nhất.

Hãy bắt đầu với việc tạo folder cho certificate SSL bằng lệnh:

  • sudo mkdir /etc/nginx/ssl/

Đối với SSL , ta cần certificate có thuật toán chữ ký mạnh, SHA256. Đối với mục đích thử nghiệm hoặc môi trường phi production , bạn có thể sử dụng certificate tự ký và bỏ qua các cảnh báo SSL. Hãy tạo một cái bằng lệnh:

  • sudo openssl req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

Lệnh này sẽ hỏi bạn một số câu hỏi đơn giản về chi tiết của trang web và doanh nghiệp của bạn. Sau đó, nó sẽ tạo một khóa được mã hóa RSA 2048 bit trong file /etc/nginx/ssl/nginx.key và certificate SHA256 trong file /etc/nginx/ssl/nginx.crt .

Tiếp theo, bạn sẽ phải tạo các tham số DH mạnh hơn, dài 4096 bit. Hãy chuẩn bị tinh thần để chờ một chút thời gian, tùy thuộc vào Server, có thể mất đến 30 phút. Chạy lệnh:

  • sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

Đến đây bạn có thể cấu hình phần SSL của server block của bạn . Ví dụ, hãy cấu hình server block mặc định. Mở file cấu hình của nó để chỉnh sửa bằng nano:

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

Trong file này, hãy chỉnh sửa phần cấu hình server thêm phần SSL sau lệnh server_name như sau:

/ etc / nginx / sites-enable / default
server { ...        server_name localhost;          ### SSL Part         listen 443 ssl;         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;         ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';         ssl_prefer_server_ciphers on;         ssl_dhparam /etc/nginx/ssl/dhparam.pem;         ssl_certificate /etc/nginx/ssl/nginx.crt;         ssl_certificate_key /etc/nginx/ssl/nginx.key;  ... 

Dưới đây là những hướng dẫn mà ta đã chỉ định với các chỉ thị trên:

  • listen - bật trình nghe SSL trên cổng 443, tức là cổng HTTPS.
  • ssl_protocols - chỉ bật ba giao thức này, được coi là giao thức hiện đang an toàn - TLSv1 TLSv1.1 TLSv1.2 .
  • ssl_ciphers - chỉ bật các mật mã SSL an toàn này: EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
  • ssl_prefer_server_ciphers - đảm bảo client tôn trọng các tùy chọn mật mã của server .
  • ssl_dhparam - sử dụng các tham số DH mạnh, tùy chỉnh mà ta đã tạo trước đó.
  • ssl_certificate - sử dụng certificate SSL tự ký . Đảm bảo thay đổi nó nếu bạn đang sử dụng certificate khác.
  • ssl_certificate_key - sử dụng private key SSL , mà ta đã tạo trước đó.

Để các cài đặt trên có hiệu lực, bạn sẽ phải reload nginx bằng lệnh:

  • sudo service nginx reload

Để kiểm tra cấu hình SSL mới của bạn, tốt nhất bạn nên sử dụng một công cụ bên ngoài, chẳng hạn như công cụ do SSL Labs cung cấp. Ở đó, bạn nên bỏ qua cảnh báo rằng SSL không tin cậy . Điều này là tự nhiên vì nó là certificate tự ký. Lưu ý trang web này sẽ chỉ kiểm tra các trang web có domain đã đăng ký. Bạn không thể kiểm tra kết nối SSL chỉ với địa chỉ IP của Server.

Kết quả tổng thể phải là “T” giống như đối với “Thử nghiệm” nhưng về cơ bản nó là A (cao nhất có thể) và nó sẽ nói rằng "If trust issues are ignored: A" như thế này:

Kiểm tra SSL

Sau đó, bạn có thể cần loại bỏ cảnh báo SSL và làm cho kiểm tra SSL trở thành “A” sạch. Một tùy chọn là sử dụng Let's Encrypt như được mô tả trong bài viết Cách bảo mật Nginx với Let's Encrypt trên Ubuntu 14.04 . Nó miễn phí, cho phép bạn chỉ định kích thước khóa RSA lên đến 4096 và không đưa ra cảnh báo về việc tự ký. Nếu không, bạn có thể chọn bất kỳ nhà cung cấp SSL thương mại nào hiện có. Khi bạn chọn một, chỉ cần đảm bảo bạn chọn certificate SHA256.

Bước 3 - Hạn chế truy cập bằng IP

Xác thực password không phải lúc nào cũng đủ đảm bảo an ninh cho các khu vực nhạy cảm trên trang web như console trang, phpmyadmin, v.v. Đôi khi kẻ tấn công khai thác password yếu hoặc lỗ hổng phần mềm trong các khu vực đó để truy cập trái phép. Đó là lý do tại sao bạn nên thêm hạn chế IP bổ sung với điều kiện bạn có thể xác định IP của (những) user hợp lệ .

Ví dụ: nếu bạn có một trang web WordPress và khu vực quản trị của nó ở /wp-admin/ , bạn nên giới hạn quyền truy cập vào nó chỉ với IP của bạn hoặc IP của tất cả các administrator . Với mục đích này, hãy mở server block tương ứng - server block mặc định cho Nginx là /etc/nginx/sites-enabled/default :

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

Bên trong phần cấu hình server thêm:

/ etc / nginx / sites-enable / default
server { ...     location /wp-admin/ {         allow 192.168.1.1/24;      allow 10.0.0.1/24;         deny  all; } ... ... 

Trong phần trên, hãy đảm bảo thay thế 192.168.1.110.0.0.1 bằng IP của bạn. Tương tự, bạn có thể cho phép truy cập các IP khác hoặc thậm chí mạng bằng cách thay đổi mặt nạ mạng ( /24 ).

Để các cài đặt như vậy có hiệu lực, bạn sẽ phải reload Nginx bằng lệnh:

  • sudo service nginx reload

Bây giờ, nếu bạn cố gắng truy cập /wp-admin/ phần của trang web bằng trình duyệt nằm ngoài phạm vi địa chỉ IP được phép, bạn sẽ gặp lỗi. Lỗi này sẽ là 403 Forbidden (trừ khi bạn đã thay đổi lỗi này thành 404 Not found như đã giải thích trước đó). Đồng thời, bạn sẽ thấy mã lỗi thực sự trong log lỗi với lệnh:

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

Lỗi access forbidden sẽ hiển thị như sau:

Output of sudo tail -f /var/log/nginx/error.log
... 2016/01/02 04:16:12 [error] 4767#0: *13 access forbidden by rule, client: X.X.X.X, server: localhost, request: "GET /wp-admin/ HTTP/1.1", host: "Y.Y.Y.Y" ... 

Việc kết hợp áp dụng nhiều cách tiếp cận để bảo mật, chẳng hạn như thay đổi trang lỗi và hạn chế quyền truy cập bằng IP, cho thấy tác động tích lũy của việc củng cố Nginx. Theo ví dụ, thay vì trang quản trị WordPress thông thường, những kẻ tấn công và các công cụ tự động mà chúng sử dụng sẽ thấy trang 404 không tìm thấy. Điều này gây nhầm lẫn và có thể không khuyến khích họ thử các cách tiếp cận khác để xâm phạm WordPress của bạn.

Bước 4 - Thực hiện Kiểm tra Bảo mật

Bạn nên kiểm tra bảo mật độc lập với ý kiến của bạn . Vì mục đích này, bạn có thể sử dụng một công cụ kiểm tra bảo mật để quét các lỗ hổng web. Có rất nhiều công cụ như vậy, bao gồm cả những công cụ thương mại và để bắt đầu, bạn có thể sử dụng wapiti, miễn phí và open-souce . Wapiti có thể thiếu một số tính năng của các công cụ nâng cao hơn, nhưng nó sẽ cung cấp cho bạn ý tưởng về kiểm tra bảo mật là gì.

Bạn có thể cài đặt wapiti trên Ubuntu thông qua apt:

  • sudo apt-get install wapiti

Sau đó, bắt đầu quét trang web bằng wapiti bằng lệnh:

  • wapiti http://example.org -n 10 -b folder

Đảm bảo thay thế example.org bằng tên trang web . Ta đã đưa ra hai đối số bổ sung cho lệnh. -n 10 đầu tiên giới hạn số lượng URL có cùng một mẫu là 10 để ngăn chặn các vòng lặp vô tận. -b folder đối số thứ hai đặt phạm vi quét chỉ cho domain đã cho.

Sau khi quá trình quét hoàn tất, bạn sẽ có kết quả bên trong một folder có tên là generated_report bên trong folder mà từ đó bạn đã chạy quá trình quét. Để xem tốt nhất, hãy tải folder này xuống máy tính local của bạn và mở index.html bằng trình duyệt web.

Bên trong báo cáo, bạn sẽ thấy các lỗ hổng được sắp xếp theo 10 danh mục khác nhau: SQL Injection, Blind SQL Injection, File Xử lý, Cross Site Scripting, CRLF, Thực thi lệnh, Tiêu thụ tài nguyên, Bỏ qua Htaccess, Tệp backup và Tệp có khả năng nguy hiểm.

Tốt nhất, báo cáo của bạn nên trông như thế này và không tìm thấy lỗ hổng bảo mật nào:

Báo cáo Wapiti

Nếu có lỗ hổng, bạn có thể mở rộng phần quét tương ứng để biết thêm thông tin.

Đảm bảo chạy các lần quét như vậy thường xuyên và bằng các công cụ khác nhau đảm bảo việc kiểm tra Nginx và các trang web một cách đầy đủ và kỹ nhất.

Bước 5 - Thực hiện các biện pháp bảo mật bổ sung

Một số chủ đề liên quan đến bảo mật Nginx không được đề cập trong bài viết này vì đã có bài viết rất hay về chúng. Hãy làm quen với những cái sau:

Naxsi là một firewall ứng dụng web cho Nginx. Nó bảo vệ bạn khỏi các lỗ hổng web đã biết và chưa biết bằng cách sử dụng tập hợp các chữ ký độc hại.

Bạn nên biết rằng Naxsi là một phần mềm phức tạp và việc chỉnh sửa nó cần một thời gian và nỗ lực. May mắn là có các cấu hình sẵn có cho hầu hết các ứng dụng web phổ biến mà bạn có thể tùy chỉnh thêm nếu cần.

Fail2ban là một công cụ tuyệt vời để đưa bảo mật web lên cấp độ tiếp theo và chủ động bảo vệ server nginx của bạn. Lúc này, ta đã hạn chế user tìm kiếm thông tin nhất định và truy cập các phần của trang web . Với fail2ban, bạn có thể chặn thêm những kẻ tấn công trong một khoảng thời gian nhất định khi bạn phát hiện ra rằng chúng đang thực hiện hoạt động độc hại.

Giám sát là điều cần thiết để bảo mật và Monit là một công cụ tuyệt vời cho mục đích này với sự hỗ trợ tốt cho Nginx. Nhật ký web không chỉ hiển thị dấu vết của các hoạt động độc hại mà còn cho thấy mức tăng đột biến về tải CPU và sử dụng bộ nhớ.

Trong bài viết này, đặc biệt chú ý đến Bước 5 - Theo dõi Nhật ký để tìm lỗi và từ khóa. Ở đó, bạn có thể cấu hình các cảnh báo tùy chỉnh được gửi theo các sự kiện bảo mật như khi ai đó truy cập hoặc cố gắng truy cập vào các phần nhạy cảm trên (các) trang web .

Có firewall là rất quan trọng đối với bảo mật của nginx và server nói chung. Đảm bảo rằng bạn thêm cổng https (tcp 443) vào các kết nối đến được phép bên cạnh cổng http (tcp 80) tiêu chuẩn.

Trình kiểm tra tính toàn vẹn của file và folder , chẳng hạn như AIDE, cảnh báo về các thay đổi trong file và folder .Điều này đặc biệt hữu ích cho các file web vì bạn nên biết khi các phần của trang web thay đổi và các file / folder mới được thêm vào. Để tìm hiểu thêm về AIDE, bạn có thể bắt đầu với bài viết.

Bài viết trên hơi lỗi thời và không được viết riêng cho Ubuntu. Tuy nhiên, bạn có thể dễ dàng điều chỉnh nó và áp dụng nó cho Ubuntu 14.04. Khi bạn cấu hình AIDE hoặc một công cụ tương tự khác, hãy đảm bảo loại trừ việc theo dõi log web và các file tạm thời như bộ nhớ đệm web của bạn.

Kết luận

Sau khi đọc bài viết này, bạn sẽ cảm thấy tự tin hơn về bảo mật Nginx. Chỉ cần đảm bảo tìm kiếm sự cân bằng giữa chức năng và bảo mật để bạn yên tâm rằng môi trường web của bạn hoạt động như được thiết kế nhưng an toàn. Ngoài ra, hãy nhớ rằng việc bảo mật Nginx là một nhiệm vụ liên tục đòi hỏi cập nhật, cấu hình lại, quét, v.v. thường xuyên.


Tags:

Các tin liên quan

Cách bảo mật Nginx bằng Let's Encrypt trên CentOS 7
2016-01-26
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 14.04
2015-12-17
Cách chạy Nginx trong Docker Container trên Ubuntu 14.04
2015-10-28
Cách thêm ngx_pagespeed vào Nginx trên CentOS 7
2015-09-30
Cách thêm ngx_pagespeed vào Nginx trên Ubuntu 14.04
2015-09-22
Cách thêm ngx_pagespeed vào Nginx trên Debian 8
2015-09-20
Cách bảo vệ server Nginx với Fail2Ban trên Ubuntu 14.04
2015-08-14
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