Ruby on Rails Security: Best Practices
Bài đăng này đã không được cập nhật trong 4 năm
Framework được thiết kế với mục đích giúp các web developer xây dựng các ứng dụng web. Mặc dù có rất nhiều Framework có sẵn nhưng khả năng phát hiện ra các lỗ hổng như CSRF hoặc giả mạo nội dung (chúng ta không nói về XML Entity và Paramater Pollution) là rất cao.
Để đảm vệ ứng dụng không bị truy cập trái phép và bảo mật, các developer cần hiểu về các lỗi bảo mật có thể xuất hiện và cách triển khai các biện pháp phòng tránh tấn công. Bài viết tổng hợp lại các cơ chế bảo mật Ruby on Rails
Tổng quan
Security Header
Tại thời điểm này, rất có thể bạn đã nghe nói về bảo mật HTTP header. Hãy xem Ruby on Rails trang bị những gì cho header của mỗi request. Các cài đặt đó thuộc về mô-đun ActionDispatch bên dưới, một thành phần Rails core, chịu trách nhiệm định tuyến các request đến các controller.
# lib/action_dispatch/railtie.rb
config.action_dispatch.default_headers = {
"X-Frame-Options" => "SAMEORIGIN",
"X-XSS-Protection" => "1; mode=block",
"X-Content-Type-Options" => "nosniff",
"X-Download-Options" => "noopen",
"X-Permitted-Cross-Domain-Policies" => "none",
"Referrer-Policy" => "strict-origin-when-cross-origin"
}
Bạn có thể thấy một loạt các cài đặt được cung cấp đảm bảo một số biện pháp bảo mật mà trong hầu hết các trường hợp chúng ta không cần can thiệp. Nếu bạn muốn thay đổi chúng, nó có thể thực hiện được trong tệp config / application.rb
.
Bây giờ thì cùng xem mỗi config ở trên làm gì nhé
X-Frame-Options
X-Frame-Options có giá trị SAMEORIGIN hướng dẫn trình duyệt web rằng nó chỉ nên mở các địa chỉ URL liên kết đến cùng một miền trong thẻ <iframe />.
X-XSS-Protection
X-XSS-Protection with value 1; mode=block enables Cross-Site Scripting filter đã được xây dựng sẵn. Thành phần đầu tiên, 1, chỉ đơn giản là turn-on X-XSS-Protection.
Thành phần còn lại, mode=block ngăn chặn việc trình duyệt render các trang web nếu có tấn công XSS được phát hiện.
X-Content-Type-Options
X-Content-Type-Options với value nosniff chịu trách nhiệm block một request nếu đích của nó thuộc kiểu style
hoặc script
và kiểu MIMIE của chúng không khớp nhau.
X-Download-Options
X-Download-Options là một header dành riêng cho Internet Explorer 8. Chức năng của nó là chặn trình duyệt thực thi tệp HTML đã tải xuống trong ngữ cảnh của trang web.
X-Permitted-Cross-Domain-Policies
X-Permitted-Cross-Domain-Policies với giá trị none tránh các ứng dụng clients
như AdobeAcrobat và Flash truy cập bất kỳ dữ liệu nào từ domain của bạn.
Referrer-Policy
Referrer-Policy chịu trách nhiệm kiểm soát lượng thông tin được gửi trong Referrer header. Giá trị là strict-origin-when-cross-origin.
Content-Security-Policy
Ngoài việc đặt các mặc định trên, Ruby on Rails còn đề cập đến một cơ chế security header khác, được gọi là Content Security Policy.
Content Security Policy (CSP) is an HTTP response header that restricts the browser to loading external assets such as scripts, styles or media from a wide variety of sources — as well as inline scripts. Như thường lệ, DSL cho phép chúng ta config security với phạm vi globally.
config/initializers/content_security_policy.rb
# frozen_string_literal: true
Rails.application.config.content_security_policy do |policy|
policy.default_src :self, :https
policy.font_src :self, :https, :data
policy.img_src :self, :https, :data
policy.object_src :none
policy.script_src :self, :https
policy.style_src :self, :https
policy.report_uri '/csp-violated'
end
Rails.application.config.content_security_policy_report_only = false
SQL Injection Prevention
SQL Injection là một phương pháp nổi tiếng được sử dụng bởi kẻ tấn công đê truy cập vào cơ sở dữ liệu của một trang Web. SQL Injection cho phép kẻ tấn công bỏ qua các đăng nhập, chuyển các tập tin/thư mục quan trọng vào hộp thư của kẻ tấn công và các sự kiện độc hại khác. Trong Rails, các ứng dụng tương tác với cơ sở dữ liệu thông qua active record, một object-relational mapping (ORM) mà theo mặc định đi kèm với Rails. Mặc dù ORM cung cấp cơ sở dữ liệu trừu tượng, nhưng nếu xử lý không cẩn thận đầu vào có thể dẫn đến SQL Injection.
Data Sanitization
Có nhiều cuộc tấn công khác nhau có thể được thực hiện thông qua Ruby on Rails View.
Ruby on Rails được chuẩn bị sẵn sàng cho những lỗ hổng bảo mật đó, với mô-đun ActionView :: Helpers :: SanifyingHelper
, tổng cộng đưa ra bốn phương pháp khác nhau cho phép bạn hiển thị mọi thứ một cách an toàn:
- sanitize (được sử dụng nhiều nhất)
- sanitize_css
- strip_links
- strip_tags
Sanitizes HTML input, stripping all but known-safe tags and attributes. It also strips
href
/src
attributes with unsafe protocols likejavascript
:, while also protecting against attempts to use Unicode, ASCII, and hex character references to work around these protocol filters. All special characters will be escaped. Sanitize Helper documentation
Cross-Site Request Forgery
Ruby on Rails ngăn chặn hoàn toàn nếu bạn tuân theo các quy ước của nó, nhưng hãy xem nó thực sự có nghĩa là gì. Trong việc đánh cắp session, cross-site script là một phương pháp được sử dụng bởi kẻ tấn công để ăn cắp cookie và sửa đổi session ID. Không giống như XSS, CSRF, phương pháp này không ăn cắp cookie để đăng nhập qua tên người dùng. Giả sử có một cuộc tấn công Cross-Site Request Forgery (CSRF): Khi người dùng đăng nhập vào trang www.mybank.com và trang này đang bị tấn công CSRF. Khi người dùng nhấn một đường link có chứa mã độc thì một số tiền của người dùng tự động chuyển khoản sang tài khoản khác. Và mã độc sẽ có dạng như sau:
<iframe src="http://examplebank.com/app/transfermoney? amount=2200&attackersAccount">
Khi người dùng load iframe, trình duyệt sẽ tạo một request POST tới www.mybank.com để xử lý chuyển một số tiền vào tài khoản số: 247890345 Trong Rails chúng ta có ngăn chặn CSRF bằng authenticity_token trong các HTML response. Token này cũng được lưu trong session cookie của người dùng. Form trong rails có thể chứa đoạn code sau:
<input Name= "authenticity_token" type= "hidden" value="ghtyu7asdvnTojibBNYY67BshjyerUA+81+ DD="/>
Khi mà form và authenticity_token được submit, Rails sẽ xác minh request và quyết định request có được xử lý hay không.
Sessions Security
Ruby on Rails được chuẩn bị kỹ lưỡng để bảo mật session của người dùng. Bạn có thể tìm hiểu chi tiết hơn trong hướng dẫn Security Guide
Họ có một chương dành riêng về cách config và quản lý session, bao gồm:
- Session Hijacking prevention
- Secure Session Storage
- Configuring rotation of Encrypted and Signed Cookies
- Replay Attacks for CookieStore Sessions
- Session Fixation explanation and countermeasures
- Session Expiration management
HTTPS Configuration
Phương pháp tốt nhất để đảm bảo kết nối an toàn cho mọi request là sử dụng giao thức HTTPS. Việc thiết lập Ruby on Rails để sử dụng giao thức HTTPS là easy
config/environments/production.rb
# frozen_string_literal: true
Rails.application.configure do
# other config
config.force_ssl = true
end
Với dòng mã duy nhất này, bạn nhận được:
- Cookies flagged as Secure
- HTTP Strict Transport Security (HSTS) header hướng dẫn trình duyệt chỉ thực hiện các request qua HTTPS
- Redirects all requests to the HTTPS
Trên đây là các biện pháp bảo mật Ruby on Rails Out Of The Box, các biện pháp bảo mật Secure Users Authentication, Authorization and Access Control, ... được public ở P2 nè
Preferences:
All rights reserved