Безопасность в Ruby-приложениях — это не только про HTTPS и сложные пароли. Это про ежедневную рутину: обновления гемов, поиск уязвимостей в коде и автоматизацию проверок. Разберём инструменты, которые спасут ваш бэкенд от SQL-инъекций, устаревших зависимостей и других “подарков” из интернета.
🔍 Почему стандартных практик недостаточно?
Вы уверены, что:
- Все гемы в
Gemfile.lockбезопасны? - В ваших шаблонах нет XSS?
- Никто не забыл про
strong_paramsв новом контроллере?
Ответы “на глазок” не работают. Нужны инструменты, которые сканируют проект автоматически — как охранник с металлодетектором на входе в аэропорт.
🛡️ Brakeman: статический анализатор для Rails
Что делает?
Сканирует код на:
- SQL-инъекции (
User.where("name = '#{params[:name]}'")), - XSS (
<%= raw @comment.text %>), - массовое присваивание (
User.update(params[:user])), - и ещё 50+ уязвимостей.
Установка:
gem install brakeman
brakeman -o report.html
Пример отчёта:
+------------+-------+
| Confidence | High |
+------------+-------+
| Warning | SQL Injection in User.search |
| File | app/models/user.rb:42 |
| Code | User.where("login LIKE '%#{params[:q]}%'") |
+------------+-------+
Интеграция в CI:
# .github/workflows/security.yml
- name: Brakeman
run: brakeman -z --no-pager
Плюсы:
- Не требует запуска приложения.
- Проверяет даже комментарии в миграциях.
Минусы:
- Ложные срабатывания (например, на
sanitize_sql). - Не ищет проблемы в JavaScript.
📦 Bundler Audit: проверка зависимостей
Зачем?
Устаревший гем = потенциальная дыра. Например, rack до 2.1.4 допускает RCE.
Использование:
gem install bundler-audit
bundle-audit check --update
Вывод:
Name: actionpack
Version: 5.2.3
Advisory: CVE-2020-8166
Criticality: Medium
URL: https://groups.google.com/.../rubyonrails-security/1hPWx...
Title: Possible XSS in Action Pack
Solution: upgrade to >= 5.2.4.3
Автоматизация:
Добавьте в Rakefile:
task :security do
sh "bundle-audit check --update"
end
Совет: Запускайте bundle-audit после каждого bundle install через post_install-хук.
🔎 Другие инструменты
1. ruby_audit
Проверяет версию Ruby на известные CVE:
gem install ruby_audit
ruby-audit check
2. bundler-outdated
Ищет устаревшие гемы (не только уязвимые):
bundle outdated --strict
3. rails_best_practices
Анализирует архитектурные риски:
gem install rails_best_practices
rails_best_practices .
Пример предупреждения:
Don't use default_scope (app/models/user.rb:5)
💀 Антипаттерны безопасности
1. “У нас маленький проект — зачем аудит?”
Ответ: Взломы часто автоматизированы — боты сканируют даже пет-проекты.
2. “Обновим гемы, когда будет время”
Пример: В 2019 году через уязвимость в activestorage (CVE-2019-5421) атаковали тысячи Rails-приложений.
3. “Brakeman ругается — закомментируем его в CI”
Лучше:
# config/brakeman.yml
skip_checks: ["CheckRedirect"]
🛠️ Практика: настраиваем пайплайн
- Локально: Хуки в
overcommit:
PreCommit:
Brakeman:
enabled: true
command: ['brakeman', '-q', '-z']
- CI: Полный аудит перед деплоем:
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: gem install brakeman bundler-audit
- run: brakeman -z --no-pager
- run: bundle-audit check --update
- Мониторинг: Еженедельные отчеты через
cron+ Slack-бот.
🎯 Вывод
- Brakeman — сканер кода, ловит “хардкод-инъекции”.
- Bundler Audit — детектор уязвимых гемов.
- Автоматизация — единственный способ не забыть про безопасность.
Как сказал один мудрый DevOps:
“Лучше красный CI, чем красные глаза от ночного инцидента”. 🔥