Коли ми розпочинаємо розробку MVP, часто чуємо питання: "Чи є Ruby on Rails безпечним?".
По-перше, не існує програмного забезпечення, яке б було на 100% безпечним, і немає фреймворку, який був би більш безпечним за інші. Це не означає, що ми нічого не можемо зробити для забезпечення безпеки. У цьому пості ми розглянемо деякі вбудовані механізми, які надає Ruby on Rails, а також інші заходи безпеки, які необхідно застосовувати для створення більш безпечного програмного забезпечення.
Безпека залежить від людей, які використовують веб-фреймворк, і інших компонентів технічного стеку:
- база даних
- веб-сервер
- і, можливо, інші компоненти, такі як API, файлове сховище тощо
Кожен незалежний компонент технічного стеку може бути атакований і повинен бути захищений. У цьому пості ми зосередимося виключно на веб-фреймворку.
Веб-додатки відносно легко атакувати, оскільки їх просто зрозуміти і маніпулювати ними, маючи мінімальні знання. Згідно з OWASP Top Ten, найбільш поширеними ризиками безпеки веб-додатків є порушення доступу, ін'єкції (кроссайт скриптинг, SQL ін'єкція тощо), ненадійний дизайн, уразливі та застарілі компоненти тощо. Щоб запобігти або мінімізувати ці ризики, потрібно розуміти ці атаки.
Вбудовані механізми безпеки в Rails
Rails надає вбудовані механізми безпеки для запобігання деяким з найбільш поширених ризиків безпеки веб-додатків. Але їх потрібно використовувати згідно з інструкціями фреймворку.
Cross-Site Request Forgery (CSRF)
Цей метод атаки працює шляхом включення шкідливого коду або посилання на сторінку, яка створює підроблені запити до веб-додатку, маскуючи їх під запити користувача. Якщо сесія цього веб-додатку не вийшла з системи, атакуючий може виконати несанкціоновані команди, використовуючи акаунт користувача.
Першим заходом проти цієї атаки є правильне використання GET і POST, як цього вимагає W3C. Другий захід, який включено за замовчуванням в Ruby on Rails, — це додавання токену безпеки в запити, який ми перевіряємо на сервері. Усі форми, згенеровані Rails, будуть містити цей токен. Якщо токен, надісланий на сервер, не збігається з очікуваним, запит буде припинено, і жодні зміни не будуть внесені в систему.
Ін'єкція
Ін'єкція — це клас атак, який маніпулює введенням користувача, відправляючи довільний код для його виконання всередині додатку. Найпоширенішими прикладами ін'єкції є кроссайт скриптинг (XSS) і SQL ін'єкція.
SQL ін'єкція стосується коду, який буде виконуватися на базі даних. Якщо атака успішна, атакуючий може отримати доступ до записів, які спочатку були недоступні. Він може вкрасти особисту інформацію, паролі або надати своєму користувачеві привілеї адміністратора.
Методи запитів Ruby on Rails мають вбудований фільтр для спеціальних SQL символів, які використовуються для виконання цих атак, і автоматично очищують введення за замовчуванням. Але якщо ви використовуєте фрагменти SQL, особливо в умовних фрагментах (where("..."))
, очищення потрібно застосовувати вручну.
Робіть звичкою думати про наслідки безпеки при використанні зовнішніх даних у SQL рядках.
З іншого боку, атаки XSS (кроссайт скриптинг) намагаються вставити код, який буде виконуватися в браузері користувача. Якщо атака успішна, атакуючий може:
- вкрасти особисту інформацію, наприклад, куки для аутентифікації, щоб маскуватися під користувача в додатку
- змінити елементи на сторінці, щоб показувати фальшиву інформацію
- перенаправити жертву на інший сайт для фішингу або викрадення іншої інформації
За замовчуванням Rails автоматично екранує весь HTML (якщо ви не вказали не робити цього, що не рекомендується).
Це означає, що будь-який код, який атакуючий намагається вставити, не буде виконаний, і браузер не виконає його.
Ви можете ознайомитися з повним списком ризиків безпеки та їх контрзаходів у розділі безпеки Rails гідів.
Активна спільнота, широке використання та часті оновлення
Підтримка вашого кодового базу в актуальному стані є критично важливою, коли йдеться про безпеку. Сканери веб-додатків можуть легко виявляти старі версії програмного забезпечення і мають велику бібліотеку відомих експлойтів для кожної з них. Отже, наявність застарілої версії Rails є проблемою безпеки, яку слід вирішити якнайшвидше. Якщо хочете, ви можете дізнатися більше про те, що включає в себе оновлення Ruby on Rails додатків.
І останнє, але не менш важливе, команда розробників Rails має групу спеціалізованих інженерів, які працюють над покращенням його безпеки та виправленням багів, пов'язаних із безпекою. Ці баги виявляються досить швидко, оскільки є великі компанії, такі як Shopify, GitHub, Airbnb та Basecamp, які активно використовують Rails. Кожного разу, коли виявляється уразливість, випускається нова версія для всіх версій фреймворку, які підтримуються, з інструкціями, як оновити та як працює виправлення.
Відповідальність користувача
Є деякі ризики безпеки та уразливості, які Rails не може запобігти за замовчуванням, і вони зазвичай лежать на відповідальності користувача. Добре було б перевірити наш додаток на вразливості за допомогою сканера веб-додатків, такого як Brakeman (спеціально розроблений для додатків Ruby on Rails), ZAP або w3af.
Але в безпеці немає срібної кулі. Будь-який сканер веб-додатків може перевірити ваш додаток, але вони не завжди мають контекст. Більшість із них не знають ваших бізнес-правил, і є деякі вразливості, які вони можуть важко виявити, наприклад, пошкоджений контроль доступу. Контроль доступу стосується впровадження політики, яка гарантує, що користувачі не можуть діяти поза межами своїх призначених дозволів. Це залежить конкретно від бізнес-логіки. Відповідальний користувач фреймворку має запобігти тому, щоб користувачі їхнього додатку могли читати, змінювати або знищувати несанкціоновані ресурси за межами їхніх прав. Це можна зробити легко, реалізувавши правильну авторизацію користувачів за допомогою Ruby гемів, таких як pundit або cancancan.
Наступні кроки
Відповідаючи на питання "Чи є Ruby on Rails безпечним?": так, але лише якщо ви знаєте, що робите. В кінцевому рахунку, безпека є складною, всебічною проблемою всіх додатків, і єдиний спосіб бути якомога більш безпечним — це мати уважну та досвідчену команду.
Безпека залежить від людей, які використовують веб-фреймворк, але як ви бачите, Rails надає хороший набір вбудованих механізмів безпеки, які можуть запобігти найбільш поширеним атакам. І ми, як користувачі фреймворку, повинні бути вдячні за це. Водночас деякі поширені ризики безпеки та уразливості не можуть бути запобігані фреймворком за замовчуванням, і ми повинні бути уважними до безпеки. І знову ж таки, добре було б регулярно сканувати наш додаток на наявність вразливостей.
Завжди будуть існувати шкідливі користувачі, тож потрібно бути готовими зустріти їх з самого початку.
Перекладено з: Is Ruby on Rails secure?