Mẹo và thủ thuật để bảo mật máy chủ web Nginx của bạn

theanh

Administrator
Nhân viên
Nginx là một máy chủ web mã nguồn mở, nhẹ, hiệu suất cao, phát triển nhanh nhất trên thế giới. Nginx chạy trên hệ điều hành Linux, Windows, Mac OS và Solaris. NGINX tiếp tục tăng về mức độ phổ biến, điều đó có nghĩa là ngày càng có nhiều triển khai NGINX cần được bảo mật.

Trong hướng dẫn này, chúng tôi sẽ giải thích một số mẹo và thủ thuật bảo mật máy chủ Nginx phổ biến.

Yêu cầu​

  • Máy chủ chạy Ubuntu 18.04 hoặc Debian 9.
  • Mật khẩu gốc được thiết lập trên máy chủ của bạn.

Cài đặt Nginx​

Đầu tiên, bạn sẽ cần cài đặt Nginx vào hệ thống của mình. Bạn có thể cài đặt bằng cách chạy lệnh sau:
Mã:
apt-get install nginx -y
Sau khi Nginx được cài đặt, bạn có thể kiểm tra trạng thái của Nginx bằng lệnh sau:
Mã:
systemctl status nginx
Bạn sẽ thấy đầu ra sau:
Mã:
? nginx.service - Máy chủ web hiệu suất cao và máy chủ proxy ngược Đã tải: đã tải (/lib/systemd/system/nginx.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đang chạy) từ CN 2019-03-10 02:43:14 UTC; 4 phút 40 giây trước Tài liệu: man:nginx(8) Tiến trình: 2271 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Tiến trình: 2281 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Tiến trình: 2274 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) PID chính: 2285 (nginx) Nhiệm vụ: 2 (giới hạn: 1111) CGroup: /system.slice/nginx.service ??2285 nginx: tiến trình chính /usr/sbin/nginx -g daemon on; master_process on; ??2290 nginx: tiến trình công nhân10-03 02:43:14 ubuntu1804 systemd[1]: Đang khởi động Một máy chủ web hiệu suất cao và một máy chủ proxy ngược...10-03 02:43:14 ubuntu1804 systemd[1]: nginx.service: Không phân tích được PID từ tệp /run/nginx.pid: Đối số không hợp lệ10-03 02:43:14 ubuntu1804 systemd[1]: Đang khởi động Một máy chủ web hiệu suất cao và một máy chủ proxy ngược.

Cập nhật Nginx​

Bạn sẽ cần cập nhật máy chủ web Nginx của mình vì có nhiều cải tiến về hiệu suất, tính năng mới và bản sửa lỗi bảo mật đang được thêm vào. Hầu hết các bản phân phối Linux hiện đại sẽ không đi kèm phiên bản nginx mới nhất trong danh sách gói mặc định của chúng. Vì vậy, bạn sẽ cần nâng cấp phiên bản nginx mới nhất thông qua trình quản lý gói. Bạn có thể cập nhật máy chủ web Nginx của mình bằng lệnh sau:
Mã:
apt-get update -y
apt-get install nginx --reinstall -y

Ngăn chặn tiết lộ thông tin​

Trước tiên, bạn cần ngăn Nginx tiết lộ thông tin phiên bản của chúng.

Theo mặc định, Nginx hiển thị tên và phiên bản của nó trong tiêu đề HTTP.

Bạn có thể kiểm tra bằng lệnh sau:
Mã:
curl -I http://localhost
Bạn sẽ thấy đầu ra sau:
Mã:
HTTP/1.1 200 OKMáy chủ: nginx/1.14.0 (Ubuntu)Ngày: Thứ bảy, 09 tháng 03 năm 2019 15:28:01 GMTLoại nội dung: text/htmlĐộ dài nội dung: 10918Lần sửa đổi cuối: Thứ sáu, 01/02/2019 16:05:17 GMTKết nối: keep-aliveETag: "5c546e3d-2aa6"Accept-Ranges: bytes
Trong đầu ra ở trên, bạn sẽ thấy Nginx và phiên bản hệ điều hành.

Bạn có thể ẩn thông tin này bằng cách chỉnh sửa tệp /etc/nginx/nginx.conf:
Mã:
nano /etc/nginx/nginx.conf
Thêm server_tokens ngoại tuyến bên trong phần cấu hình http:
Mã:
http { ## # Cài đặt cơ bản ## server_tokens tắt;
Lưu và đóng tệp khi bạn hoàn tất. Sau đó, khởi động lại máy chủ web Nginx để áp dụng các thay đổi:
Mã:
systemctl restart nginx
Bây giờ, hãy chạy lại lệnh curl:
Mã:
curl -I http://localhost
Bạn sẽ thấy kết quả sau:
Mã:
HTTP/1.1 200 OKMáy chủ: nginxNgày: Thứ bảy, 09 tháng 03 năm 2019 15:33:31 GMTLoại nội dung: text/htmlĐộ dài nội dung: 10918Lần sửa đổi cuối: Thứ sáu, 01 tháng 02 năm 2019 16:05:17 GMTKết nối: keep-aliveETag: "5c546e3d-2aa6"Phạm vi chấp nhận: byte

Hạn chế IP khỏi quyền truy cập​

Nginx đến với một mô-đun đơn giản có tên là ngx_http_access_module để cho phép hoặc từ chối một địa chỉ IP cụ thể.

Nếu bạn muốn cho phép Nginx tạo 172.16.0.0/16 và từ chối từ các mạng con khác. Sau đó, hãy mở tệp /etc/nginx/sites-enabled/default:
Mã:
nano /etc/nginx/sites-enabled/default
Thực hiện các thay đổi sau bên trong khối máy chủ:
Mã:
server { listen 80 default_server; listen [::]:80 default_server; allow 172.16.0.0/16; deny all;
Lưu và đóng tệp khi bạn hoàn tất. Sau đó, khởi động lại Nginx để áp dụng các thay đổi này:
Mã:
systemctl restart nginx
Bây giờ, hãy thử truy cập máy chủ Nginx của bạn từ dải địa chỉ IP khác như 192.168.0.102.

Tiếp theo, hãy kiểm tra nhật ký Nginx bằng lệnh sau:
Mã:
tail -f /var/log/nginx/error.log
Bạn sẽ nhận được lệnh cấm truy cập trong đầu ra sau:
Mã:
2019/03/09 16:13:01 [lỗi] 11589#11589: *1 access denied by rule, client: 192.168.0.102, server: _, request: "GET /test/ HTTP/1.1", host: "172.16.0.122"

Bảo mật Nginx bằng TLS​

TLS (Bảo mật lớp truyền tải) là phiên bản kế thừa của SSL (Secure Socket Layer). Nó cung cấp HTTPS mạnh hơn và hiệu quả hơn và chứa nhiều cải tiến hơn như Forward Secrecy, khả năng tương thích với bộ mã hóa OpenSSL hiện đại và HSTS. Hướng dẫn này chỉ cách bật Chứng chỉ SSL tự ký trong Nginx. Nếu bạn muốn sử dụng chứng chỉ let's Encrypt thay thế, hãy xem tại đây: https://www.howtoforge.com/tutorial/nginx-with-letsencrypt-ciphersuite/

Trước tiên, hãy tạo một thư mục cho SSL bằng lệnh sau:
Mã:
mkdir /etc/nginx/ssl/
Tiếp theo, hãy tạo khóa và chứng chỉ bằng lệnh sau:
Mã:
cd /etc/nginx/ssl/
Trước tiên, hãy tạo khóa bằng lệnh sau:
Mã:
openssl genrsa -aes256 -out nginx.key 1024
Bạn sẽ thấy đầu ra sau:
Mã:
Tạo khóa riêng RSA, môđun dài 1024 bit...++++++................................++++++e là 65537 (0x010001)Nhập cụm mật khẩu cho nginx.key:Đang xác minh - Nhập cụm mật khẩu cho nginx.key:
Tiếp theo, tạo csr bằng lệnh sau:
Mã:
openssl req -new -key nginx.key -out nginx.csr
Cung cấp tất cả thông tin như hiển thị bên dưới:
Mã:
Đang tạo khóa riêng RSA, môđun dài 1024 bit...++++++.............................++++++e là 65537 (0x010001)Nhập cụm mật khẩu cho nginx.key:Đang xác minh - Nhập cụm mật khẩu cho nginx.key:root@ubuntu1804:~# openssl req -new -key nginx.key -out nginx.csrNhập cụm mật khẩu cho nginx.key:Bạn sắp được yêu cầu nhập thông tin sẽ được đưa vàoyêu cầu cấp chứng chỉ của bạn.Những gì bạn sắp nhập được gọi là Tên phân biệt hoặc DN.Có khá nhiều trường nhưng bạn có thể để trống một số trườngĐối với một số trường sẽ có giá trị mặc định,Nếu bạn nhập '.', trường đó sẽ được để trống.-----Tên quốc gia (mã 2 chữ cái) [AU]:INTên tiểu bang hoặc tỉnh (tên đầy đủ) [Some-State]:GujaratTên địa phương (ví dụ: thành phố) []:JunagadhTên tổ chức (ví dụ: công ty) [Internet Widgits Pty Ltd]:ITTên đơn vị tổ chức (ví dụ: bộ phận) []:ITTên chung (ví dụ: FQDN của máy chủ hoặc tên CỦA BẠN) []:HITESHĐịa chỉ email []:[emailprotected]Vui lòng nhập các thuộc tính 'thêm' sauđể gửi kèm yêu cầu cấp chứng chỉ của bạnMật khẩu thử thách []:adminTên công ty tùy chọn []:IT
Tiếp theo, hãy ký chứng chỉ bằng lệnh sau:
Mã:
openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt
Bạn sẽ thấy thông báo sau đầu ra:
Mã:
Chữ ký oksubject=C = IN, ST = Gujarat, L = Junagadh, O = IT, OU = IT, CN = HITESH, emailAddress = [emailprotected]Nhận khóa riêngNhập cụm mật khẩu cho nginx.key:
Tiếp theo, mở tệp máy chủ ảo mặc định của Nginx và xác định chứng chỉ:
Mã:
nano /etc/nginx/sites-enabled/default
Thực hiện các thay đổi sau:
Mã:
server { listen 192.168.0.100:443 ssl; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Lưu và đóng tệp khi bạn hoàn tất. Sau đó, khởi động lại máy chủ Nginx để áp dụng các thay đổi sau:
Mã:
systemctl restart nginx

Bảo vệ thư mục bằng mật khẩu​

Khi thiết lập máy chủ web Nginx, bạn cũng có thể bảo vệ một thư mục cụ thể bằng mật khẩu. Bạn có thể thực hiện việc này bằng tệp .htpasswd.

Để thực hiện, hãy tạo tệp passwd và thêm người dùng vào đó bằng lệnh sau:
Mã:
mkdir /etc/nginx/.htpasswd
htpasswd -c /etc/nginx/.htpasswd/passwd admin
Bạn sẽ thấy kết quả sau:
Mã:
Mật khẩu mới:Nhập lại mật khẩu mới:Đang thêm mật khẩu cho người dùng admin
Tiếp theo, tạo một thư mục thử nghiệm bên trong gốc web Nginx bằng lệnh sau:
Mã:
mkdir /var/www/html/test
Tiếp theo, cấp quyền sở hữu cho người dùng www-data bằng lệnh sau:
Mã:
chown -R www-data:www-data /var/www/html/test
Tiếp theo, mở tệp máy chủ ảo mặc định của Nginx bằng lệnh sau:
Mã:
nano /etc/nginx/sites-enabled/default
Tiếp theo, bảo vệ thư mục thử nghiệm như được hiển thị bên dưới:
Mã:
location /test { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd/passwd;
Lưu và đóng tệp khi bạn hoàn tất. Sau đó, khởi động lại dịch vụ Nginx để áp dụng các thay đổi này:
Mã:
systemctl restart nginx
Tiếp theo, mở trình duyệt web của bạn và nhập URL http://your-server-ip/test. Bạn sẽ được nhắc nhập tên người dùng và mật khẩu để truy cập thư mục thử nghiệm như hiển thị trong trang sau:



Xin chúc mừng! bạn đã bảo mật thành công máy chủ Nginx của mình trên máy chủ Ubuntu 18.04. Tôi hy vọng điều này sẽ giúp bạn bảo vệ ứng dụng của mình được lưu trữ trên máy chủ web Nginx. Hãy thoải mái hỏi tôi nếu bạn có bất kỳ câu hỏi nào. Để biết thêm thông tin, bạn có thể tham khảo Nginx security doc.
 
Back
Bên trên