Force_ssl làm gì trong Rails?


84

Trong một câu hỏi trước đó, tôi phát hiện ra rằng tôi nên đặt kết thúc nginx ssl và không để Rails xử lý dữ liệu được mã hóa.

Sau đó, tại sao những điều sau đây tồn tại?

config.force_ssl = true

Tôi thấy điều này được nhận xét trong tệp cấu hình sản xuất. Nhưng nếu kỳ vọng là nginx sẽ xử lý tất cả nội dung ssl để ứng dụng rails của tôi không xử lý dữ liệu được mã hóa thì phải config.force_ssl = truelàm gì?

Tôi có nên để nó bình luận trong sản xuất nếu tôi biết tôi sẽ luôn sử dụng nginx?

Câu trả lời:


77

Nó không chỉ buộc trình duyệt của bạn chuyển hướng HTTP sang HTTPS. Nó cũng đặt cookie của bạn được đánh dấu là "an toàn" và cho phép HSTS , mỗi cookie đều là những biện pháp bảo vệ rất tốt chống lại việc tước SSL.

Mặc dù HTTPS bảo vệ ứng dụng của bạn tại " https://example.com/yourapp " chống lại các cuộc tấn công MITM, nhưng nếu ai đó vào giữa máy khách và máy chủ của bạn, họ có thể dễ dàng đưa bạn truy cập " http://example.com/yourapp " . Với cả hai biện pháp bảo vệ trên, trình duyệt của bạn sẽ vui vẻ gửi cookie phiên cho người thực hiện MITM.


1
Nguồn của force_ssl không có dấu hiệu cho thấy HSTS đang được kích hoạt bởi tùy chọn này
agios

13
@agios Đây là thuộc tính riêng cho mỗi bộ điều khiển force_ssl. Biến force_sslcấu hình, cài đặt Rack::SSLphần mềm trung gian, cho phép HSTS theo mặc định .
Brent Royal-Gordon,

@agios bạn đang tìm kiếm tại địa điểm sai: github.com/rails/rails/blob/...
jmera

4
nó có vẻ như config.force_ssl = truenên là mặc định, tại sao nhóm rails lại nhận xét nó là mặc định?
Henry Yang

55

Cài đặt config.force_sslbao gồm ActionDispatch::SSL. Tài ActionDispatch::SSLliệu mô tả chức năng như sau (nhấn mạnh được thêm vào để rõ ràng):

Xem phần bao gồm ở đây và tài liệu cho ActionDispatch :: SSL tại đây .

DOCS

Phần mềm trung gian này được thêm vào ngăn xếp khi config.force_ssl = truevà được chuyển qua các tùy chọn đã thiết lập config.ssl_options. Nó thực hiện ba công việc để thực thi các yêu cầu HTTP an toàn:

  1. Chuyển hướng TLS: Chuyển hướng vĩnh viễn các yêu cầu http: // đến https: // với cùng một máy chủ URL, đường dẫn, v.v. Được bật theo mặc định. Đặt config.ssl_options để sửa đổi URL đích (ví dụ redirect: { host: "secure.widgets.com", port: 8080 }:) hoặc đặt redirect: falseđể tắt tính năng này.

  2. Cookie an toàn: Đặt securecờ trên cookie để thông báo cho trình duyệt biết chúng không được gửi cùng với yêu cầu http: //. Được bật theo mặc định. Đặt config.ssl_optionsvới secure_cookies: falseđể tắt tính năng này.

  3. Bảo mật truyền tải nghiêm ngặt HTTP (HSTS): Yêu cầu trình duyệt ghi nhớ trang web này là chỉ TLS và tự động chuyển hướng các yêu cầu không phải TLS . Được bật theo mặc định. Định cấu hình config.ssl_optionsvới hsts: falseđể tắt. Đặt config.ssl_optionsvới hsts: { … }để định cấu hình HSTS:

    • expires: Trong bao lâu, tính bằng giây, các cài đặt này sẽ hoạt động. Mặc định thành 180.days(khuyến nghị). Yêu cầu tối thiểu để đủ điều kiện cho danh sách tải trước của trình duyệt là 18.weeks.
    • subdomains: Đặt để trueyêu cầu trình duyệt áp dụng các cài đặt này cho tất cả các miền phụ. Điều này bảo vệ cookie của bạn khỏi bị chặn bởi một trang web dễ bị tấn công trên một miền phụ. Mặc định là true.
    • preload: Quảng cáo rằng trang web này có thể được đưa vào danh sách HSTS được tải trước của trình duyệt. HSTS bảo vệ trang web của bạn trên mọi lượt truy cập ngoại trừ lượt truy cập đầu tiên vì nó chưa nhìn thấy tiêu đề HSTS của bạn. Để thu hẹp khoảng cách này, các nhà cung cấp trình duyệt bao gồm một danh sách tích hợp các trang web hỗ trợ HSTS. Truy cập https://hstspreload.appspot.com để gửi trang web của bạn để đưa vào. Để tắt HSTS, bỏ qua tiêu đề là không đủ. Các trình duyệt sẽ ghi nhớ chỉ thị HSTS ban đầu cho đến khi nó hết hạn. Thay vào đó, hãy sử dụng tiêu đề để yêu cầu trình duyệt hết hạn HSTS ngay lập tức. Cài đặt hsts: falselà một phím tắt cho hsts: { expires: 0 }.

Yêu cầu có thể chọn không chuyển hướng với exclude:

config.ssl_options = { redirect: { exclude: -> request { request.path =~ /healthcheck/ } } }

3
"Yêu cầu có thể chọn không chuyển hướng với exclude" - Cảnh báo: tính năng này chỉ mới được thêm gần đây trong Rails 5, vì vậy sẽ không hoạt động đối với những người trong chúng ta trên Rails 4.2 trở xuống
jonleighton

1
Tôi tin rằng các excludetùy chọn toàn cầu đã có trước Rails 5 một thời gian dài, vì vậy văn bản cú pháp của nó hơi khác: config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/healthcheck/') } }- serverfault.com/a/517401
jwadsack

12

Cài đặt này buộc HTTPS bằng cách chuyển hướng các yêu cầu HTTP đến các đối tác HTTPS của chúng. Vì vậy, một trình duyệt đang truy cập http://domain.com/pathsẽ được chuyển hướng đến https://domain.com/path.

Bỏ qua cài đặt được nhận xét sẽ cho phép cả hai giao thức.

Bạn vẫn phải định cấu hình máy chủ web của mình để xử lý các yêu cầu HTTPS.


1
Nhưng nếu bạn bật HTTPS ở cấp độ nginx (bằng cách chuyển hướng mọi thứ sang HTTPS qua redirect 301 https:...), thì MỌI THỨ sẽ không qua https, do đó config.force_ssl = truesẽ không thực sự làm được gì (vì không có gì là http)? Hay có một lý do bảo mật sâu hơn ở đây?
Tristan Tao

2
@TristanTao vâng, điều đó cũng sẽ hoạt động. Nhưng ngay cả khi đó, tôi vẫn config.force_sslbật chế độ bật, đề phòng trường hợp ai đó xóa chuyển hướng khỏi cấu hình của máy chủ web.
Stefan

2
hãy cẩn thận doh, config.force_ssl hơi khác so với force_ssl trong bộ điều khiển về việc bảo mật cookie chống lại việc chiếm quyền điều khiển phiên ở đây: eq8.eu/blogs/…
tương đương

1
cũng lưu ý, rằng có cả hai config.force_ssladd_header Strict-Transport-Security max-age=...;sẽ dẫn đến 2 Strict-Transport-Securitytiêu đề
Victor Ivanov

4

Nó buộc mọi giao tiếp với máy chủ phải được mã hóa và sử dụng SSL, tức là thông qua HTTPS.

Khi bạn đưa nó vào bộ điều khiển, bộ điều khiển đó sẽ chỉ chấp nhận các yêu cầu HTTPS.

Liên kết hữu ích:

  1. http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
  2. http://rubydoc.info/docs/rails/ActionController/ForceSSL
  3. http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=comments
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.