Bài này hoặc loạt bài hướng dẫn nginx này (nếu mình có thời gian) mình thực hiện bằng cách vừa học vừa viết lại , nguồn từ internet, chủ yếu mình lược dịch lại từ các trang web nước ngoài. Mục đích vừa để chia sẻ vừa để lại lưu trữ (sau này mình quên có thể vào để xem lại).
Nên đọc Hướng dẫn Nginx – Phần 1 và 2 trước:
Hướng dẫn Nginx – Phần 1: Các khái niệm cơ bản
Hướng dẫn Nginx – Phần 2: Performance
Tiếp tục phần 3:
SSL và TLS
Thiết lập SSL/TLS cơ bản
Để xử lý lưu lượng HTTPS, bạn cần có chứng chỉ SSL / TLS. Thường tốn phí, hoặc bạn có thể sử dụng chứng chỉ miễn phí thông qua Let’s encrypt (Bên dưới có hướng dẫn đăng ký)
Khi bạn có chứng chỉ, bạn có thể chỉ cần bật HTTPS bằng cách:
- bắt đầu lắng nghe trên cổng
443
(cổng mặc định mà trình duyệt sẽ sử dụng khi bạn nhậphttps://sofsog.com
) - cung cấp chứng chỉ và key của nó
1 2 3 4 5 6 7 |
server { listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate /etc/nginx/ssl/sofsog.crt; ssl_certificate_key /etc/nginx/ssl/sofsog.key; } |
Chúng ta cũng có thể chỉnh cấu hình:
- chỉ sử dụng giao thức TLS. Tất cả các phiên bản SSL không được sử dụng nữa do các lỗ hổng nổi tiếng
- sử dụng mật mã máy chủ bảo mật được xác định trước (trường hợp tương tự như với các giao thức – những ngày đó chỉ một vài mật mã được coi là an toàn)
Hãy nhớ rằng các cài đặt ở trên luôn thay đổi. Bạn nên xem lại chúng thường xuyên.
1 2 3 4 5 6 7 8 9 10 11 |
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5; ssl_prefer_server_ciphers on; server { listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate /etc/nginx/ssl/sofsog.crt; ssl_certificate_key /etc/nginx/ssl/sofsog.key; } |
TLS Session Resumption
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Open connection TCP Handshake: Warsaw ->------------------ synchronize packet (SYN) ----------------->- Berlin Warsaw -<--------- synchronise-acknowledgement packet (SYN-ACK) ------<- Berlin Warsaw ->------------------- acknowledgement (ACK) ------------------->- Berlin TLS Handshake: Warsaw ->------------------------ Client Hello ---------------------->- Berlin Warsaw -<------------------ Server Hello + Certificate ---------------<- Berlin Warsaw ->---------------------- Change Ciper Spec -------------------->- Berlin Warsaw -<---------------------- Change Ciper Spec --------------------<- Berlin Data transfer: Warsaw ->---------------------- /image.jpg --------------------------->- Berlin Warsaw -<--------------------- (image data) --------------------------<- Berlin Close connection |
1 2 3 4 |
server { ssl_session_cache shared:SSL:10m; ssl_session_timeout 1h; } |
OCSP Stapling(xếp chồng OCSP: Online Certificate Status Protocol)
1 2 3 4 5 6 7 8 |
server { ssl_stapling on; ssl_stapling_verify on; # Xác minh phản hồi OCSP ssl_trusted_certificate /etc/nginx/ssl/lemonfrog.pem; # khai báo cho nginx vị trí của tất cả các chứng chỉ trung gian resolver 8.8.8.8 8.8.4.4 valid=86400s; # độ phân giải của tên máy chủ phản hồi OCSP resolver_timeout 5s; } |
Security headers
Dưới đây là một số header, đáng để bật tính bảo mật. Để biết thêmheader và thông tin chi tiết, bạn chắc chắn nên xem OWASP Secure Headers Project.
HTTP Strict-Transport-Security
Ciết tắt HSTS, thực thi tác user-agent để gửi tất cả yêu cầu đến nguồn gốc (origin) qua HTTPS.
1 |
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"; |
X-Frame-Options
1 |
add_header X-Frame-Options DENY; |
X-Content-Type-Options
1 |
add_header X-Content-Type-Options nosniff; |
Server tokens
1 |
Server : nginx/1.13.2 |
1 |
server_tokens off; |
Bonus về Let’s Encrypt
Cài đặt
Cập nhật mới nhất có thể tìm thấy ở đây
Đối với mục đích thử nghiệm sử dụng staging environment, để không phải exhaust rate limits.
Tạo chứng chỉ mới.
1 2 3 |
certbot certonly --webroot --webroot-path /var/www/netguru/current/public/ \ -d foo.netguru.co \ -d bar.netguru.co |
Hãy chắc chắn rằng nó có thể được gia hạn đúng cách
1 |
certbot renew --dry-run |
1 |
0 3 * * * /usr/bin/certbot renew --quiet --renew-hook "/usr/sbin/nginx -s reload" |
Kiểm tra xem SSL có hoạt động bình thường không thông qua ssllabs
Kết luận
Cảm ơn các bạn đã đọc đến đây. Loạt bài này sẽ không thể có được nếu không có số lượng lớn tài nguyên được tìm thấy trên internet. Dưới đây là một số trang web tuyệt vời mà mình thấy đặc biệt hữu ích khi viết loạt bài này:
- nginx docs
- nginx blog
- nginx fundamentals on udemy
- Ilya Grigorik blog, và cuốn sánh của anh ta: High Performance Browser Networking
- Martin Fjordvald blog
Lược dịch từ: netguru.co