Giới thiệu
Nginx là một máy chủ web phổ biến, nhưng nếu không được bảo mật đúng cách, nó có thể trở thành mục tiêu dễ dàng cho các cuộc tấn công. Hướng dẫn này sẽ cung cấp cho bạn bảy bước thiết thực để bảo mật Nginx bằng cách sử dụng TLS, tường lửa mạnh mẽ và Fail2Ban. Danh sách kiểm tra này được viết từ góc độ của một trưởng nhóm DevOps, người cần các biện pháp kiểm soát an ninh có thể lặp lại và kiểm tra cho các khối lượng công việc sản xuất.
1. Bắt Buộc Sử Dụng TLS 1.2+ và Bộ Mã Hóa Mạnh
Các phiên bản TLS cũ (1.0/1.1) đã lỗi thời và dễ bị tổn thương trước các cuộc tấn công như POODLE, BEAST. Bạn cần chỉnh sửa tệp nginx.conf (hoặc một đoạn mã riêng trong /etc/nginx/conf.d/) để chỉ cho phép TLS 1.2 và TLS 1.3:
# /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers \
"ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:\
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:\
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
Lý do tại sao điều này quan trọng: Các mã hóa mạnh bảo vệ dữ liệu trong quá trình truyền và cải thiện điểm số của bạn trên SSL Labs.
2. Kích Hoạt HTTP Strict Transport Security (HSTS)
HSTS yêu cầu trình duyệt chỉ sử dụng HTTPS cho miền của bạn, ngăn chặn các cuộc tấn công hạ cấp giao thức.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Thêm tiêu đề trong cùng khối nơi bạn kết thúc TLS. Hãy nhớ kiểm tra bằng cách sử dụng curl -I https://example.com trước khi gửi vào danh sách preload HSTS.
3. Triển Khai Chứng Chỉ Miễn Phí, Tự Động Gia Hạn với Certbot
Quản lý chứng chỉ thủ công dễ mắc lỗi. Sử dụng certbot để lấy và gia hạn chứng chỉ một cách tự động.
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com --agree-tos --no-eff-email
Certbot sẽ chỉnh sửa cấu hình Nginx của bạn, thêm các chỉ thị ssl_certificate, và thiết lập một bộ hẹn giờ systemd để gia hạn.
4. Củng Cố Tường Lửa Hệ Điều Hành
Ngay cả khi Nginx đã được bảo mật, một tường lửa mở có thể phơi bày các dịch vụ mà bạn không muốn công khai. Sử dụng ufw (hoặc iptables) để chỉ cho phép HTTP/HTTPS và SSH từ các IP đáng tin cậy.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp from 203.0.113.0/24 comment "Admin SSH"
sudo ufw allow 80/tcp comment "HTTP"
sudo ufw allow 443/tcp comment "HTTPS"
sudo ufw enable
Thường xuyên xem xét các quy tắc bằng cách sử dụng ufw status numbered.
5. Cài Đặt và Cấu Hình Fail2Ban cho Nginx
Fail2Ban có thể tự động cấm các IP kích hoạt các phản hồi 4xx/5xx liên tục, chẳng hạn như các nỗ lực tấn công brute-force trên các điểm cuối API.
- Cài đặt:
sudo apt-get install -y fail2ban
- Tạo một jail cho Nginx:
# /etc/fail2ban/jail.d/nginx.conf
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 86400
findtime = 600
- Khởi động lại dịch vụ:
sudo systemctl restart fail2ban
Fail2Ban sẽ theo dõi nhật ký lỗi để phát hiện các lỗi xác thực và chặn các IP vi phạm thông qua iptables.
6. Hạn Chế Truy Cập Đến Các Vị Trí Nhạy Cảm
Không bao giờ công khai trang trạng thái Nginx hoặc các API nội bộ ra internet công cộng. Sử dụng các chỉ thị allow/deny hoặc ACL dựa trên IP.
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
Tương tự, bảo vệ các điểm cuối /admin hoặc /api bằng xác thực cơ bản hoặc OAuth, và luôn giới hạn chúng trong các dải IP của khách hàng đã biết.
7. Kích Hoạt Ghi Nhận và Giám Sát Tập Trung
An ninh chỉ tốt như khả năng phát hiện các bất thường. Cấu hình Nginx để ghi nhận dưới định dạng JSON và gửi nhật ký đến một hệ thống tập trung như ELK hoặc Grafana Loki.
log_format json '{"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":$status, '
'"body_bytes_sent":$body_bytes_sent, '
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"}';
access_log /var/log/nginx/access.json json;
Chuyển nhật ký vào SIEM của bạn và thiết lập cảnh báo cho các đợt gia tăng trong phản hồi 4xx/5xx.
Tóm Tắt Tất Cả Lại
Dưới đây là một khối server tối thiểu nhưng đầy đủ bao gồm các bước bảo mật đã thảo luận:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# Cấu hình TLS (ssl.conf được bao gồm)
include /etc/nginx/conf.d/ssl.conf;
# Tiêu đề HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# Hạn chế trang trạng thái
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
Triển khai cấu hình, kiểm tra với nginx -t, và tải lại:
sudo nginx -t && sudo systemctl reload nginx
Kết luận
Việc bảo mật Nginx là một quá trình nhiều lớp: bắt buộc sử dụng TLS hiện đại, củng cố tường lửa hệ điều hành, tự động hóa quản lý chứng chỉ và thêm các biện pháp phòng vệ phản ứng như Fail2Ban. Bằng cách làm theo bảy mẹo này, bạn sẽ giảm thiểu đáng kể diện tích tấn công của tầng web trong khi vẫn giữ mức độ vận hành thấp. Để tìm hiểu sâu hơn về các mô hình bảo mật Nginx và các tùy chọn lưu trữ quản lý, bạn có thể tham khảo các tài nguyên tại https://lacidaweb.com.