Giới thiệu
Nếu bạn là một quản lý DevOps được giao nhiệm vụ duy trì một dịch vụ web công khai an toàn và đáng tin cậy, Nginx thường là proxy ngược đầu tiên mà bạn dựa vào. Mặc dù Nginx nổi bật về hiệu suất, nó cũng cần một tư thế bảo mật vững chắc để sống sót trong bối cảnh đe dọa hiện đại. Hướng dẫn này sẽ dẫn bạn qua bảy bước thực tế để bảo mật Nginx bằng TLS, Fail2Ban và Tường lửa Ứng dụng Web (WAF). Chúng tôi sẽ tập trung vào những đoạn cấu hình có thể áp dụng ngay vào thiết lập hiện tại của bạn.
1. Thực thi Cài đặt TLS Mạnh
TLS là hàng rào phòng thủ đầu tiên. Một bộ mã hóa yếu hoặc phiên bản giao thức lỗi thời có thể khiến bạn bị tấn công hạ cấp.
- Vô hiệu hóa SSLv2/SSLv3 và TLS 1.0/1.1
- Ưu tiên sử dụng TLS 1.3 khi khách hàng hỗ trợ
- Sử dụng bộ mã hóa hiện đại (ví dụ:
TLS_AES_256_GCM_SHA384) - Kích hoạt OCSP stapling để tăng tốc độ xác thực chứng chỉ
Thêm đoạn mã sau vào tệp nginx.conf hoặc tệp tls.conf riêng:
nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers \
"TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256";
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Khởi động lại Nginx sau khi chỉnh sửa:
bash
sudo systemctl reload nginx
2. Cải thiện Headers HTTP
Các headers tập trung vào bảo mật giúp giảm bề mặt tấn công cho XSS, click-jacking và MIME sniffing.
nginx
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self'" always;
Áp dụng chúng trong một khối server phục vụ trang web công cộng của bạn.
3. Giới hạn Kích thước và Tốc độ Yêu cầu
Các yêu cầu lớn có thể bị lạm dụng cho các cuộc tấn công DoS, và các cú nhấp yêu cầu nhanh có thể chỉ ra các nỗ lực brute-force.
nginx
client_max_body_size 2M;
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
limit_req zone=mylimit burst=20 nodelay;
Điều chỉnh các giá trị rate và burst dựa trên các mẫu lưu lượng truy cập điển hình.
4. Triển khai ModSecurity như một WAF
ModSecurity cung cấp một engine dựa trên quy tắc có thể chặn các lỗ hổng web phổ biến (SQLi, XSS, v.v.). Cài đặt nó qua trình quản lý gói của bạn và kích hoạt Bộ quy tắc OWASP Core (CRS).
bash
# Ví dụ trên Ubuntu/Debian
sudo apt-get install libnginx-mod-http-modsecurity
sudo apt-get install owasp-modsecurity-crs
Sau đó bao gồm module trong Nginx:
nginx
modsecurity on;
modsecurity_rules_file /etc/modsecurity/crs/crs-setup.conf;
Tinh chỉnh CRS bằng cách vô hiệu hóa các quy tắc tạo ra các cảnh báo giả cho ứng dụng của bạn.
5. Thiết lập Fail2Ban cho Logs Nginx
Fail2Ban có thể tự động cấm các IP kích hoạt các phản hồi 4xx/5xx nhiều lần. Tạo một nhà tù theo dõi log lỗi của Nginx.
ini
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
Đặt tệp này vào /etc/fail2ban/jail.d/nginx.conf và khởi động lại Fail2Ban:
bash
sudo systemctl restart fail2ban
Bạn cũng có thể thêm một bộ lọc tùy chỉnh (/etc/fail2ban/filter.d/nginx-http-auth.conf) khớp với các mẫu như "401" hoặc "403".
6. Tách biệt Nội dung Tĩnh và Động
Chạy các tài sản tĩnh (hình ảnh, CSS, JS) từ một vị trí riêng biệt giúp giảm bề mặt tấn công của backend ứng dụng của bạn.
nginx
server {
listen 443 ssl http2;
server_name static.example.com;
root /var/www/static;
location / {
try_files $uri $uri/ =404;
}
# Tái sử dụng khối TLS từ trước
include /etc/nginx/conf.d/tls.conf;
}
Bằng cách cô lập nội dung tĩnh, bạn có thể áp dụng các giới hạn tốc độ nghiêm ngặt hơn và thậm chí phục vụ nó từ một CDN.
7. Tự động Gia hạn Chứng chỉ
Cập nhật chứng chỉ thủ công là một công thức cho thời gian ngừng hoạt động. Sử dụng certbot với một bộ hẹn giờ systemd để giữ cho chứng chỉ của bạn luôn mới.
bash
sudo apt-get install certbot python3-certbot-nginx
sudo certbot renew --dry-run
Tạo một bộ hẹn giờ nếu bản phân phối của bạn không cung cấp:
ini
[Unit]
Description=Renew Let's Encrypt certificates
[Timer]
OnCalendar=weekly
Persistent=true
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
Đặt tệp tại /etc/systemd/system/certbot-renew.timer và kích hoạt nó:
bash
sudo systemctl enable --now certbot-renew.timer
Kết luận
Bảo mật Nginx là một quá trình nhiều lớp: TLS mạnh mẽ, headers bảo mật, giới hạn yêu cầu, WAF, cấm tự động và quản lý chứng chỉ cẩn thận đều hoạt động cùng nhau để giữ cho dịch vụ của bạn bền bỉ. Thực hiện bảy bước này từng bước một, thử nghiệm từng thay đổi trong môi trường staging và theo dõi logs để phát hiện hành vi bất thường. Khi bạn cần một kiểm tra nhanh chóng hoặc một cái nhìn sâu hơn về bất kỳ chủ đề nào trong số này, các tài nguyên cộng đồng tại lacidaweb.com có thể cung cấp các tài liệu tham khảo hữu ích và các ví dụ thực tế.