Giới thiệu
Bảo mật lớp truyền tải (TLS) là nền tảng của bảo mật web hiện đại. Tuy nhiên, một máy chủ Nginx cấu hình sai có thể làm lộ thông tin của bạn, gặp các cuộc tấn công hạ cấp hoặc sử dụng các thuật toán mã hóa yếu. Là một kỹ sư SRE, bạn cần một danh sách kiểm tra để cân bằng giữa mã hóa mạnh mẽ và độ trễ tối thiểu. Dưới đây là bảy mẹo thực tế mà bạn có thể áp dụng ngay hôm nay để củng cố TLS trên Nginx mà vẫn giữ được thời gian phản hồi nhanh chóng.
1. Bắt Buộc Sử Dụng TLS 1.3 và Ngừng Hỗ Trợ Các Giao Thức Cũ
TLS 1.3 cung cấp tính bảo mật phía trước theo mặc định và giảm số lần trao đổi trong quá trình bắt tay (handshake). Hãy tắt mọi phiên bản cũ hơn TLS 1.2.
nginx
# /etc/nginx/nginx.conf (hoặc tập tin cụ thể cho từng trang)
ssl_protocols TLSv1.3 TLSv1.2; # Chỉ cho phép các giao thức hiện đại
ssl_prefer_server_ciphers on; # Để máy chủ chọn thuật toán mã hóa tốt nhất
Các giao thức cũ (SSLv2, SSLv3, TLS 1.0/1.1) dễ bị tấn công POODLE, BEAST và các cuộc tấn công cổ điển khác. Việc loại bỏ chúng cũng giúp giảm bề mặt tấn công.
2. Sử Dụng Bộ Thuật Toán Mã Hóa Mạnh Mẽ
Chọn các thuật toán mã hóa cung cấp tính bảo mật phía trước (ECDHE) và tránh sử dụng RSA trong việc trao đổi khóa. Dưới đây là một cấu hình mặc định vững chắc cho hầu hết các khối lượng công việc:
nginx
ssl_ciphers \
"TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256" \
"ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384" \
"ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305";
Danh sách trên ưu tiên sử dụng AES-GCM và ChaCha20 cho hiệu suất tối ưu, đồng thời vẫn cung cấp các tùy chọn thay thế cho các trình duyệt cũ.
3. Kích Hoạt HTTP/2 (hoặc HTTP/3) Qua TLS
HTTP/2 giảm độ trễ thông qua việc đa luồng (multiplexing) và nén tiêu đề, nhưng chỉ hoạt động qua TLS trên hầu hết các trình duyệt. Thêm dòng sau vào chỉ thị listen của bạn:
nginx
listen 443 ssl http2; # Kích hoạt HTTP/2
# Đối với HTTP/3 (cần Nginx >= 1.25 và bản vá QUIC)
# listen 443 ssl http2 quic reuseport;
Nếu bạn sử dụng phiên bản Nginx mới, hãy xem xét việc kích hoạt HTTP/3 để tải trang nhanh hơn trên các khách hàng hỗ trợ.
4. Củng Cố Thông Số Phiên Làm Việc
Tinh chỉnh các thiết lập phiên làm việc và bộ nhớ đệm để cải thiện tốc độ bắt tay mà không hy sinh bảo mật.
nginx
ssl_session_cache shared:SSL:10m; # Khoảng 4000 phiên
ssl_session_timeout 1d; # Giữ phiên trong một ngày
ssl_session_tickets off; # Tắt vé nếu bạn chỉ muốn OCSP stapling
Việc tắt vé buộc máy chủ phải sử dụng các thủ tục bắt tay đầy đủ, điều này an toàn hơn khi bạn thường xuyên thay đổi khóa.
5. Triển Khai OCSP Stapling và HSTS
OCSP stapling loại bỏ lượt đi lượt lại cần thiết cho việc kiểm tra thu hồi chứng chỉ, trong khi HSTS buộc trình duyệt luôn sử dụng HTTPS.
nginx
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS của Google cho OCSP
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Đảm bảo rằng cơ quan cấp chứng chỉ của bạn hỗ trợ OCSP; nếu không, các chỉ thị stapling sẽ gây ra lỗi.
6. Giới Hạn Tốc Độ Các Hành Vi Xấu Với Fail2Ban
Ngay cả một cấu hình TLS hoàn hảo cũng có thể bị tấn công bằng brute-force hoặc tấn công lấp đầy thông tin xác thực. Kết hợp nhật ký Nginx với Fail2Ban để tạm thời cấm các IP xấu.
Hướng dẫn từng bước:
- Cài đặt Fail2Ban:
sudo apt-get install fail2ban. - Tạo một jail cho Nginx:
nginx
# /etc/fail2ban/jail.d/nginx-http-auth.conf
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
- Định nghĩa bộ lọc (ví dụ đơn giản):
nginx
# /etc/fail2ban/filter.d/nginx-http-auth.conf
[Definition]
failregex = ^<HOST> -.*"GET /wp-login.php HTTP/.*" 401
ignoreregex =
Điều chỉnh logpath và failregex để khớp với các điểm cuối mà bạn bảo vệ (ví dụ: /admin, /api).
7. Thêm Các Header Đáp Ứng Tập Trung Vào Bảo Mật
Các header như Content-Security-Policy, X-Content-Type-Options, và Referrer-Policy giúp giảm thiểu các cuộc tấn công XSS và click-jacking.
nginx
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header Referrer-Policy "no-referrer-when-downgrade";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com";
Các header này dễ gửi và cung cấp thêm một lớp phòng thủ mà không ảnh hưởng đến hiệu suất.
Kiểm Tra Cấu Hình Củng Cố Của Bạn
Sau khi tải lại Nginx (sudo systemctl reload nginx), hãy chạy các kiểm tra sau:
- SSL Labs: https://www.ssllabs.com/ssltest/ – nhắm đến xếp hạng "A+".
- curl:
curl -I -s -o /dev/null -w "%{http_version} %{ssl_protocol} %{ssl_cipher}\n" https://yourdomain.com - nginx -T: Kiểm tra xem cấu hình hiệu quả có chứa các chỉ thị bạn đã thêm hay không.
Các công cụ giám sát như Prometheus + Grafana cũng có thể giúp bạn theo dõi độ trễ bắt tay TLS, giúp bạn phát hiện các vấn đề sau các thay đổi trong tương lai.
Kết Luận
Củng cố TLS trên Nginx là sự kết hợp giữa tính chính xác trong mã hóa và sự nhận thức về hiệu suất. Bằng cách bắt buộc sử dụng TLS 1.3, chọn lựa bộ thuật toán mã hóa hiện đại, kích hoạt HTTP/2 và thêm các header bảo vệ, bạn nâng cao mức độ bảo mật mà không làm giảm tốc độ. Kết hợp cấu hình TLS với giới hạn tốc độ Fail2Ban và OCSP stapling để kiểm soát cả kẻ tấn công và độ trễ. Để tìm hiểu thêm về các bài viết sâu hơn, các hướng dẫn củng cố Nginx do cộng đồng duy trì hoặc dịch vụ lưu trữ được quản lý mà tôn trọng các thực hành tốt nhất này, hãy truy cập https://lacidaweb.com.