1. HSTS là gì?

HTTPS là một phần thiết yếu để đảm bảo việc truy cập các trang web một cách an toàn, hạn chế việc bị tấn công qua việc chặn các yêu cầu (request), thay đổi hoặc giả mạo các thông tin giữa người sử dụng và trang web.
Khi chúng ta truy cập một trang web sử dụng http ( ví dụ: domain.com hoặc http://domain.com), thì các dữ liệu đầu tiên gửi đến máy chủ web là không được mã hóa, nếu trang web này được bảo mật bằng https thì nó sẽ gửi lại yêu cầu trình duyệt chuyển hướng ngay sang url với https://domain.com, nhưng trước khi được chuyển hướng, thì các yêu cầu được gửi bằng http có thể bị tấn công bằng cách chặn request và thay đổi thông tin trên request và dẫn tới bị mất thông tin phiên truy cập trang web.

HSTS (HTTP Strict Transport Security) tìm cách đối phó với lỗ hổng tiềm ẩn này bằng cách hướng dẫn trình duyệt rằng tên miền này chỉ có thể được truy cập bằng HTTPS. Khi trang web được bật HSTS, thì khi truy cập trang web này thông qua http, trình duyệt sẽ không gửi yêu cầu lên máy chủ web với http nữa, mà trình duyệt web sẽ tự động chuyển hướng sang https luôn, và sẽ gửi yêu cầu qua giao thức https lên máy chủ.

Đây là 1 request được chuyển hướng bằng máy chủ web (302 Found):
1Erl6w7u4Ym3Xndbg5HXWShGn-eNSZU9J

Và đây là request được chuyển hướng bằng trình duyệt do có HSTS (307 Internal Redirect):
1D096CjtECnfmq2MmoBERsvN9L9BaMkwG

2. HSTS hoạt động như thế nào?

Khi người dùng truy cập trang web qua https hoặc được chuyển hướng từ http sang https ( ví dụ trang web có tên miền: domain.com), thì máy chủ web sẽ gửi 1 header HSTS về cho trình duyệt, trình duyệt sẽ lưu lại header này lại cho các request sau. Sau đó, nếu người dùng truy cập tiếp vào trang web http://domain.com, thì trình duyệt sẽ tự động chuyển hướng sang trang https://domain.com luôn, và sẽ gửi yêu cầu truy cập lên máy chủ web thông qua giao thức bảo mật https chứ không phải là http như khi chưa có HSTS.
13SZXNnWIbtZFhw9RUj-T2adECLbsj5w5

3. Tối ưu HSTS

HSTS có thể tăng cường bảo mật cho trang web bằng cách yêu cầu trình duyệt luôn sử dụng https cho trang web đó. Tuy nhiên, HSTS không phải là một giải pháp hoàn hảo để xử lý hoàn toàn vấn đề bị chiếm quyền điều khiển session khi truy cập HTTP. Người dùng vẫn dễ bị tấn công nếu họ truy cập trang web được bảo vệ bằng HSTS qua HTTP khi họ có:

  • Chưa bao giờ truy cập trang web đó
  • Cài đặt lại trình duyệt
  • Sử dụng một trình duyệt mới, hoặc thiết bị mới ( ví dụ điện thoại, máy tính khác)
  • Xóa cache trình duyệt
  • Sử dụng trình duyệt ẩn danh
  • Truy cập trang web nhưng thông tin HSTS bị hết hạn (thời gian max-age bị hết)

Để giải quyết vấn đề này, Google sử dụng một "HSTS preload list" gồm các tên miền web và tên miền phụ sử dụng HSTS và được gửi tới https://hstspreload.appspot.com/. Danh sách miền này được phân phối và mã hóa cứng vào các trình duyệt web. Người dùng truy cập các tên miền web trong danh sách này sẽ tự động sử dụng HTTPS hoặc được chuyển hướng sang HTTPS nếu truy cập bằng HTTP, nếu máy chủ web không phục vụ HTTPS thì yêu cầu truy cập sẽ bị từ chối.

4. Cài đặt HSTS cho Nginx

Thêm header STS (Strict-Transport-Security) vào cài đặt vhost của nginx:

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

Với cài đặt này, chúng ta có:

  • add_header Strict-Transport-Security : Thêm STS vào response header
  • max-age=31536000 : Header STS sẽ expire sau 1 năm
  • includeSubDomains : Áp dụng HSTS cho tất cả các tền miền con

Tham số "always" đảm bảo rằng header được đặt cho tất cả các phản hồi, bao gồm cả các phản hồi lỗi được tạo nội bộ. Các phiên bản NGINX cũ hơn (trước phiên bản 1.7.5 hoặc NGINX Plus R5) không hỗ trợ tham số "always" và không đặt header cho các phản hồi lỗi được tạo nội bộ.

Mặc định HSTS sẽ được lưu ở cache của trình duyệt, nếu muốn lưu domain này vào "HSTS preload list" ở https://hstspreload.appspot.com/ thì cần thêm preload vào cài đặt:

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

5. Cách tắt HSTS cho Nginx

Để tắt HSTS, chúng ta chỉ cần cài đặt tham số "max-age=0":

add_header Strict-Transport-Security "max-age=0; includeSubDomains" always;

6. Cách gỡ bỏ tên miền khỏi danh sách HSTS Cache trong trình duyệt

Gỡ bỏ trên Google Chrome và Microsoft Edge

  1. Truy cập chrome://net-internals/#hsts
  2. Trong mục Delete domain security policies, nhập tên miền cần xóa
  3. Click Delete để xóa

1cwIWQVcDB3Wph4NcgZMNNysQsYIIJt-e

Để kiểm tra xem tên miền đã bị xóa chưa:

  1. Trong mục Query HSTS/PKP domain, nhập tên miền cần kiểm tra
  2. Click Query để tìm kiếm
  3. Kết quả thấy hiển thị Not found
    1JNlMyCMcSHp120jsM_wpgOvD18u5ve7Y

Gỡ bỏ trên Mozilla Firefox

  1. Đóng tất cả các tab đang mở trên trình duyệt Firefox
  2. Mở cửa sổ danh sách lịch sử truy cập (Menu > History > Manage history hoặc ấn Ctr + Shift + H)
  3. Tìm kiếm tên miền trong thanh tìm kiếm
  4. Click chuột phải vào tên miền và chọn Forget About This Site
  5. Restart trình duyệt Firefox
    1gg0DGqltA05Zw8ypVA7rX27YZh1mIEva

Gỡ bỏ trên Apple Safari

  1. Đóng Safari
  2. Xóa các file ở đường dẫn: ~/Library/Cookies/HSTS.plist
  3. Mở lại Safari

7. Tài liệu tham khảo