Найкращі практики безпеки додатків у Ruby on Rails 🛡️🚀

Ruby on Rails має вбудовані функції безпеки, але розробники повинні дотримуватися кращих практик, щоб запобігти вразливостям, таким як SQL Injection, Cross-Site Scripting (XSS) і обходу аутентифікації.

Rails має вбудовані функції безпеки, але розробники повинні дотримуватися кращих практик, щоб уникнути ризиків безпеки.

pic

🔒 Безпечна аутентифікація та авторизація

✅ Використовуйте сильну аутентифікацію

  • Використовуйте Devise, bcrypt або Authlogic для аутентифікації.
  • Встановіть Багатофакторну аутентифікацію (MFA) для адміністративних користувачів.
  • Зберігайте паролі безпечно, використовуючи bcrypt з сильним алгоритмом хешування.

Приклад: Хешування паролів безпечно

class User < ApplicationRecord  
 has_secure_password # Використовує bcrypt для хешування паролів  
end

✅ Реалізуйте контроль доступу на основі ролей (RBAC)

  • Використовуйте Pundit або CanCanCan для контролю доступу на основі ролей.
  • Обмежте доступ до адміністративних маршрутів за допомогою аутентифікації.
before_action :authenticate_user!  
before_action :check_admin, only: [:destroy]  

def check_admin  
 redirect_to root_path, alert: "Access Denied" unless current_user.admin?  
end

🛡️ Запобігання SQL-ін'єкціям

Rails ActiveRecord захищає від SQL-ін'єкцій, використовуючи параметризовані запити.

Приклад безпечного запиту

User.where("email = ?", params[:email]) # Безпечно

🚫 Небезпечний (Уникайте динамічного SQL)

User.where("email = '#{params[:email]}'") # ❌ Вразливий до SQL-ін'єкцій

🛡️ Захист від Cross-Site Scripting (XSS)

XSS дозволяє зловмисникам вставляти шкідливий JavaScript на веб-сторінки.

✅ Уникайте введення користувача (за замовчуванням Rails)

<%= user.name %> 

🚫 Уникайте використання html_safe без санітизації

<%= user.bio.html_safe %> # ❌ Небезпечно, якщо введення користувача не було санітизовано

Використовуйте sanitize для безпечного HTML-контенту

<%= sanitize user.bio %> # Дозволяє тільки безпечні HTML-елементи

✅ Використовуйте Політику безпеки контенту (CSP)

В файлі config/initializers/content_security_policy.rb:

Rails.application.config.content_security_policy do |policy|  
 policy.default_src :self, :https  
 policy.script_src :self, :https  
 policy.object_src :none  
 policy.frame_ancestors :none  
end

🛡️ Запобігання Cross-Site Request Forgery (CSRF)

Rails автоматично захищає від атак CSRF.

✅ Перевірте, чи увімкнута захист від CSRF

Перевірте application_controller.rb:

class ApplicationController < ActionController::Base  
 protect_from_forgery with: :exception  
end

Включіть токен CSRF у формах

<%= form_with(model: @user, authenticity_token: true) do |f| %>

🚫 Ніколи не вимикайте захист CSRF, якщо це не обов'язково.

🛡️ Безпечне управління сесіями

✅ Увімкніть безпечні та HTTP-only cookies

У файлі config/application.rb:

Rails.application.config.session_store :cookie_store, key: '_myapp', secure: Rails.env.production?, httponly: true

Керуйте сесіями з обмеженням часу дії

Rails.application.config.session_store :cookie_store, expire_after: 30.minutes

Анулюйте сесію при виході

reset_session

🛡️ Безпечне завантаження файлів та зберігання

  • Ніколи не зберігайте завантажені файли в /public каталозі.
  • Використовуйте ActiveStorage з S3 замість локального зберігання.
  • Обмежте типи та розмір файлів.

Приклад: Перевірка завантажених файлів

class AvatarUploader < CarrierWave::Uploader::Base  
 def extension_allowlist  
 %w[jpg jpeg png gif]  
 end  

 def size_range  
 1..5.megabytes  
 end  
end

🛡️ Безпечні API ендпоінти

✅ Використовуйте токени аутентифікації API

  • Використовуйте JWT (JSON Web Tokens) або OAuth для аутентифікації.

Приклад: Використання JWT з Devise Token Auth

class Api::UsersController < ApplicationController  
 before_action :authenticate_user!  
end

✅ Обмежте API за допомогою Rack Attack

У файлі config/initializers/rack_attack.rb:

class Rack::Attack
throttle('requests per ip', limit: 100, period: 60.seconds) do |request|  
 request.ip  
 end  
end

🛡️ Забезпечте безпеку залежностей та гемів

  • Запускайте bundle audit, щоб перевірити вразливі геми.
  • Використовуйте Brakeman для сканування коду Rails на наявність проблем з безпекою.
gem install brakeman  
brakeman .

Увімкніть автоматичні оновлення безпеки в Gemfile:

gem "rails", ">= 7.1.3"  
gem "devise", ">= 4.9.4"

🛡️ Реалізуйте заголовки безпеки

✅ Увімкніть HTTPS

В файлі config/environments/production.rb:

config.force_ssl = true

Встановіть безпечні заголовки в Rails

Rails.application.config.action_dispatch.default_headers = {  
 'X-Frame-Options' => 'SAMEORIGIN',  
 'X-XSS-Protection' => '1; mode=block',  
 'X-Content-Type-Options' => 'nosniff'  
}

🛡️ Проводьте регулярні аудити безпеки

✅ Використовуйте OWASP ZAP, Burp Suite або Brakeman для тестування на проникнення.
✅ Моніторьте логи за допомогою AWS CloudTrail або Splunk.
✅ Проводьте перегляд коду та навчання безпеці для розробників.

🛠 Інструменти безпеки для Rails

pic

Висновок

Дотримуючись цих кращих практик, ви можете значно знизити ризики безпеки у вашому додатку на Rails. Безпечна аутентифікація, валідація введених даних, управління сесіями та захист API є ключовими для забезпечення безпеки вашого додатку.

Перекладено з: Best Practices for Application Security in Ruby on Rails 🛡️🚀