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.
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:
Bạn sẽ thấy đầu ra sau:
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:
Bạn sẽ thấy đầu ra sau:
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:
Thêm server_tokens ngoại tuyến bên trong phần cấu hình http:
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:
Bây giờ, hãy chạy lại lệnh curl:
Bạn sẽ thấy kết quả sau:
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:
Thực hiện các thay đổi sau bên trong khối máy chủ:
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:
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:
Bạn sẽ nhận được lệnh cấm truy cập trong đầu ra sau:
Trước tiên, hãy tạo một thư mục cho SSL bằng lệnh sau:
Tiếp theo, hãy tạo khóa và chứng chỉ bằng lệnh sau:
Trước tiên, hãy tạo khóa bằng lệnh sau:
Bạn sẽ thấy đầu ra sau:
Tiếp theo, tạo csr bằng lệnh sau:
Cung cấp tất cả thông tin như hiển thị bên dưới:
Tiếp theo, hãy ký chứng chỉ bằng lệnh sau:
Bạn sẽ thấy thông báo sau đầu ra:
Tiếp theo, mở tệp máy chủ ảo mặc định của Nginx và xác định chứng chỉ:
Thực hiện các thay đổi sau:
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:
Để 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:
Bạn sẽ thấy kết quả sau:
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:
Tiếp theo, cấp quyền sở hữu cho người dùng www-data bằng lệnh sau:
Tiếp theo, mở tệp máy chủ ảo mặc định của Nginx bằng lệnh sau:
Tiếp theo, bảo vệ thư mục thử nghiệm như được hiển thị bên dưới:
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:
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.
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
Mã:
systemctl status nginx
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
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
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
Mã:
http { ## # Cài đặt cơ bản ## server_tokens tắt;
Mã:
systemctl restart nginx
Mã:
curl -I http://localhost
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
Mã:
server { listen 80 default_server; listen [::]:80 default_server; allow 172.16.0.0/16; deny all;
Mã:
systemctl restart nginx
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
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/
Mã:
cd /etc/nginx/ssl/
Mã:
openssl genrsa -aes256 -out nginx.key 1024
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:
Mã:
openssl req -new -key nginx.key -out nginx.csr
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
Mã:
openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt
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:
Mã:
nano /etc/nginx/sites-enabled/default
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;
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
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
Mã:
mkdir /var/www/html/test
Mã:
chown -R www-data:www-data /var/www/html/test
Mã:
nano /etc/nginx/sites-enabled/default
Mã:
location /test { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd/passwd;
Mã:
systemctl restart nginx
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.