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

Danh sách kiểm tra tối ưu TLS trên máy chủ Nginx

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

• 4 phút đọc

Tại sao tối ưu TLS lại quan trọng

Bảo mật lớp truyền tải (TLS) là hàng rào đầu tiên bảo vệ cho bất kỳ dịch vụ web nào. Một cấu hình sai trên máy chủ Nginx có thể khiến trang web của bạn dễ bị tấn công hạ cấp, sử dụng các bộ mã yếu và bị nghe lén giữa đường. Đối với một người lãnh đạo DevOps, một danh sách kiểm tra rõ ràng sẽ giúp biến nhiệm vụ "bảo mật trang web" thành một quy trình có thể lặp lại và kiểm tra được.


Tổng quan về danh sách kiểm tra

Dưới đây là danh sách kiểm tra từng bước mà bạn có thể thực hiện sau mỗi lần triển khai Nginx. Hãy coi đây như một quy trình kiểm tra trước khi chuyển đổi DNS.

1. Bắt buộc sử dụng các phiên bản giao thức hiện đại

  • Vô hiệu hóa SSLv2, SSLv3, TLS 1.0 và TLS 1.1.
  • Bật TLS 1.2 và TLS 1.3 (nếu phiên bản OpenSSL của bạn hỗ trợ).
Copy
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

2. Chọn bộ mã mạnh

Ưu tiên các bộ mã cung cấp AEAD (Mã hóa xác thực với dữ liệu liên kết) và PFS (Bảo mật tiến bộ hoàn hảo). Một danh sách bộ mã hợp lý như sau:

Copy
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-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";

Tránh sử dụng các phím tắt !aNULL!MD5; hãy liệt kê chính xác các bộ mã mà bạn tin tưởng.

3. Kích hoạt Bảo mật tiến bộ hoàn hảo (PFS)

PFS đã được tích hợp trong danh sách mã ở trên, nhưng bạn có thể kiểm tra bằng cách tạo một tệp tham số Diffie-Hellman mạnh:

Copy
# Tạo tệp tham số DH 4096 bit (chạy một lần)
openssl dhparam -out /etc/nginx/dhparam.pem 4096

Sau đó tham chiếu nó trong cấu hình của bạn:

Copy
ssl_dhparam /etc/nginx/dhparam.pem;

4. Bật HTTP Strict Transport Security (HSTS)

HSTS buộc 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.

Copy
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Nhớ kiểm tra cờ preload với danh sách chính thức của Chrome trước khi xác nhận.

5. Triển khai OCSP Stapling

OCSP stapling giảm độ trễ và ẩn yêu cầu OCSP từ phía khách hàng khỏi kẻ tấn công.

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

6. Tăng cường bảo mật cho phiên làm việc

Nếu bạn bật TLS 1.3, các phiên làm việc sẽ là mặc định. Hãy xoay vòng khóa phiên thường xuyên:

Copy
# Tạo khóa phiên mới (xoay hàng tuần)
openssl rand -hex 48 > /etc/nginx/ticket.key
Copy
ssl_session_ticket_key /etc/nginx/ticket.key;

Buộc cookie chỉ được gửi qua HTTPS và không thể truy cập từ JavaScript.

Copy
add_header Set-Cookie "Secure; HttpOnly; SameSite=Strict" always;

8. Tự động gia hạn chứng chỉ

Sử dụng certbot (hoặc khách hàng ACME bạn chọn) với một timer systemd để giữ cho chứng chỉ luôn mới.

Copy
# Ví dụ về timer certbot (chạy hai lần mỗi ngày)
systemctl enable --now certbot.timer

9. Kiểm tra cấu hình của bạn

Chạy kiểm tra SSL Labs hoặc sử dụng testssl.sh cục bộ:

Copy
# Kiểm tra nhanh cục bộ
testssl.sh https://yourdomain.com

Hãy hướng tới xếp hạng A+ và xác minh rằng chỉ những bộ mã bạn liệt kê mới xuất hiện.

10. Ghi lại và theo dõi lỗi TLS

Thêm một nhật ký lỗi dành riêng cho các lỗi bắt tay TLS. Điều này giúp bạn phát hiện các cuộc tấn công sớm.

Copy
error_log /var/log/nginx/tls_errors.log warn;

Sau đó gửi nhật ký đến bộ tổng hợp trung tâm của bạn (ví dụ: Loki, Graylog) và đặt cảnh báo trên các đỉnh.


Tóm tắt các bước

Dưới đây là một đoạn mã tối thiểu, sẵn sàng cho sản xuất, kết hợp các bước trên. Dán nó vào khối server {} của bạn và tải lại Nginx.

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_prefer_server_ciphers on;
    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-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";
    ssl_dhparam         /etc/nginx/dhparam.pem;

    # HSTS & tiêu đề bảo mật
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy "no-referrer-when-downgrade";
    add_header Set-Cookie "Secure; HttpOnly; SameSite=Strict" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 1.1.1.1 1.0.0.1 valid=300s;
    resolver_timeout 5s;

    # Khóa phiên làm việc
    ssl_session_ticket_key /etc/nginx/ticket.key;

    # Ghi nhật ký
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/tls_errors.log warn;

    # Các khối vị trí thông thường của bạn ở đây…
}

Tải lại bằng nginx -t && systemctl reload nginx và xác minh đầu ra của openssl s_client -connect localhost:443 -tls1_3.


Những suy nghĩ cuối cùng

Việc tối ưu TLS là một mục tiêu luôn thay đổi: các bộ mã mới sẽ bị ngừng hỗ trợ, và các trình duyệt hỗ trợ TLS 1.3 với tốc độ khác nhau. Hãy coi danh sách kiểm tra này như một tài liệu sống—xem xét nó hàng quý, tự động hóa những phần bạn có thể, và theo dõi các thông báo bảo mật cho OpenSSL và Nginx.

Nếu bạn đang tìm kiếm hướng dẫn thực tế hơn hoặc dịch vụ lưu trữ được quản lý tôn trọng những thực hành bảo mật này ngay từ đầu, hãy xem xét https://lacidaweb.com để có một giải pháp đơn giản, thân thiện với nhà phát triển.

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