0
0
Lập trình
Admin Team
Admin Teamtechmely

7 Mẹo Tăng Cường Bảo Mật TLS cho Nginx trên Trang Web Cao Lưu lượng

Đăng vào 4 tháng trước

• 5 phút đọc

Mục Lục

  1. Giới thiệu
  2. Chỉ Sử Dụng Các Phiên Bản TLS Hiện Đại
  3. Chọn Bộ Mã Mạnh
  4. Bật HTTP/2 và Server Push (Tùy Chọn)
  5. Củng Cố Bảo Mật Header
  6. Cấu Hình OCSP Stapling
  7. Nén Thông Minh: Gzip + Brotli
  8. Bảo Vệ Chống Các Cuộc Tấn Công Brute-Force
  9. Tổng Hợp
  10. Giám Sát và Bảo Trì Liên Tục
  11. Kết Luận

Giới Thiệu

Khi bạn là người phụ trách DevOps cho một dịch vụ web có lưu lượng truy cập cao, TLS không chỉ là một mục kiểm tra – mà còn là một nền tảng quan trọng về hiệu suất và bảo mật. Việc cấu hình sai TLS có thể làm tăng độ trễ, lộ ra các mã yếu, hoặc thậm chí mở ra khả năng bị tấn công giảm cấp. Hướng dẫn này sẽ hướng dẫn bạn qua bảy bước thực tiễn để khóa chặt ngăn xếp TLS của Nginx trong khi vẫn giữ thời gian yêu cầu đến phản hồi sắc nét.

1. Chỉ Sử Dụng Các Phiên Bản TLS Hiện Đại

Các phiên bản giao thức cũ (SSLv2, SSLv3, TLS 1.0/1.1) chứa nhiều lỗ hổng đã biết. Trong tệp nginx.conf, hãy đặt chỉ thị ssl_protocols cho các phiên bản ổn định mới nhất:

Copy
ssl_protocols TLSv1.2 TLSv1.3;

TLS 1.3 mang lại sự giảm 30-40% độ trễ trong quá trình bắt tay và loại bỏ nhiều bộ mã cũ.

2. Chọn Bộ Mã Mạnh

Một danh sách mã được chọn kỹ lưỡng giúp ngăn chặn các thuật toán yếu như RC4 hoặc 3DES. Danh sách sau đã được xác thực bởi cấu hình trung gian của Mozilla và hoạt động tốt với hầu hết các trình duyệt:

Copy
ssl_ciphers \
    'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256' \
    '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_prefer_server_ciphers on;
  • ssl_prefer_server_ciphers on; ép buộc thứ tự của máy chủ, loại bỏ việc thao tác mã từ phía khách hàng.

3. Bật HTTP/2 và Server Push (Tùy Chọn)

HTTP/2 hoạt động song song với TLS và có thể giảm miligiây khỏi TTFB. Bật nó cho từng trang:

Copy
listen 443 ssl http2;

Nếu bạn có các tài sản quan trọng (ví dụ: CSS nằm trên trang chính), hãy cân nhắc http2_push_preload on; để chủ động đẩy chúng.

4. Củng Cố Bảo Mật Header

Các header phản hồi tập trung vào bảo mật giúp bảo vệ chống lại click-jacking, MIME sniffing và XSS. Thêm chúng một lần trong khối http:

Copy
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 "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Header Strict-Transport-Security yêu cầu các trình duyệt sử dụng HTTPS trong một năm và cho biết sự bao gồm trong danh sách preload của Chrome.

5. Cấu Hình OCSP Stapling

OCSP stapling giảm số lượt đi và về cần thiết cho các kiểm tra thu hồi chứng chỉ. Đặt các chỉ thị này bên trong khối server:

Copy
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

Nếu máy chủ giải quyết thất bại, Nginx sẽ quay lại yêu cầu OCSP từ phía khách hàng, bảo toàn khả năng truy cập.

6. Nén Thông Minh: Gzip + Brotli

Nén giúp giảm kích thước tải trọng, nhưng bạn phải tránh nén các tài sản đã được nén (ví dụ: JPEG, MP4). Bật cả Gzip và Brotli để có khả năng tương thích tối đa:

Copy
# Gzip (sử dụng cho các trình duyệt cũ hơn)
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_vary on;

# Brotli (ưu tiên khi khách hàng hỗ trợ)
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript;

Brotli thường mang lại sự giảm kích thước từ 20-30% so với Gzip, cải thiện tốc độ cảm nhận trên các trình duyệt hiện đại.

7. Bảo Vệ Chống Các Cuộc Tấn Công Brute-Force

Ngay cả với TLS hoàn hảo, kẻ tấn công vẫn có thể làm ngập máy chủ của bạn bằng các yêu cầu bắt tay không hợp lệ. Một jail nhẹ nhàng của Fail2Ban có thể giảm bớt các IP xấu:

Copy
[nginx-https]
enabled  = true
filter   = nginx-https
logpath  = /var/log/nginx/error.log
maxretry = 5
bantime  = 3600

Tạo một bộ lọc tương ứng (/etc/fail2ban/filter.d/nginx-https.conf):

Copy
[Definition]
failregex = .*client sent TLS alert.*
            .*SSL_do_handshake() failed.*

Tải lại Fail2Ban và bạn sẽ bắt đầu thấy các IP vi phạm bị chặn sau một vài lần bắt tay thất bại.

Tổng Hợp

Một khối server tối thiểu, sẵn sàng cho sản xuất có thể trông như sau:

Copy
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    # Cơ bản về TLS
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 1.1.1.1 8.8.8.8 valid=300s;

    # Header bảo mật
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    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 "strict-origin-when-cross-origin" always;

    # Nén
    gzip on;
    gzip_vary on;
    gzip_types text/plain text/css application/json application/javascript;
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/javascript;

    # Tệp gốc & tĩnh
    root /var/www/example.com/html;
    index index.html index.htm;
}

Triển khai cấu hình này, chạy nginx -t && systemctl reload nginx, và theo dõi nhật ký lỗi Nginx để phát hiện bất kỳ lỗi bắt tay nào.

Giám Sát và Bảo Trì Liên Tục

  • Chỉ Số: Kết nối với Prometheus bằng nginx_exporter để theo dõi độ trễ bắt tay TLS và tỷ lệ 4xx/5xx.
  • Gia Hạn Chứng Chỉ: Tự động hóa với --deploy-hook của Certbot để tải lại Nginx sau khi gia hạn.
  • Kiểm Tra Bộ Mã: Chạy sslscan hoặc testssl.sh hàng tuần để đảm bảo bạn không vô tình kích hoạt lại các mã yếu.
  • Tuning Fail2Ban: Điều chỉnh maxretrybantime dựa trên mô hình lưu lượng; một trường hợp sai có thể chặn người dùng hợp lệ.

Kết Luận

Củng cố bảo mật TLS cho Nginx không phải là một nhiệm vụ đơn lẻ; đó là một vòng lặp liên tục của cấu hình, kiểm tra và giám sát. Bằng cách làm theo bảy mẹo này, bạn sẽ tận hưởng một tư thế bảo mật chặt chẽ hơn, độ trễ thấp hơn, và người dùng hài lòng hơn. Để tìm hiểu sâu hơn về hiệu suất và những thực tiễn tốt nhất về bảo mật Nginx, hãy xem các tài nguyên tại lacidaweb.com.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào