Нещодавно я побачив на Reddit питання чи можна зберігати ключі API в базі даних? і вирішив більш детально розібрати цю тему на прикладі Ruby on Rails.
Уявімо, ви хочете зберігати ключі API (або паролі від SSL-сертифікатів). Як зробити це найкраще?
Прямо в коді
Як?
#config/environments/production.rb
config.mailchimp_api_key = "ABCDEF"
Мінуси
-
Не працює з ключами, що динамічно отримуються від користувачів.
-
Ваш ключ буде відомий всім розробникам, що мають доступ до коду. Ваш робітник може виявитися недостатньо сумлінним, або в нього можуть вкрасти ноутбук. І чим більше розробників — тим більший ризик.
-
Кожен додаток має доступ до ваших ключів. Всі ці хмарні додатки для збереження та оцінки коду, деплою чи тестування. А це ще одна потенційна дірка в безпеці.
-
Файл може бути доступний публічно через неправильне налаштування веб-сервера. Ні, серйозно. Були випадки коли зловмисники просто підставляли
../../something/else
в потрібний параметр та отримували зміст файлу. Не в середовищі Rails, але хто знає? -
TL; DR; Ваш код кудись злили — ключі разом з ним.
-
Найнебезпечніший спосіб.
В ENV
Як?
config.mailchimp_api_key = ENV.fetch('MAILCHIMP_API_KEY')
Особливості
-
Не працює з ключами, що отримуються від користувачів.
-
Дуже просто реалізувати. В Heroku, наприклад, встановити змінні оточення можна в панелі адміністратора. Для оточення для розробки чи тестування ви можете використовувати dotenv, що встановлює змінні оточення, базуючись на файлах конфігурації. Тепер ви можете безпечно додати ваш конфіг в репозитарій.
Мінуси
- Якщо через дірку в безпеці, ваш
ENV
буде злито, то в вас почнуться проблеми.
В базі даних
Як?
class Group < ApplicationRecord
end
Group.create!(name: "...", mailchimp_api_key: "ABCDEF")
Особливості
-
Легко!
-
Працює й з динамічними ключами.
Мінуси
-
Якщо ви десь відправляєте Group як JSON (через API, наприклад), потрібно дуже уважно слідкувати щоб ключ не був відісланий з іншими даними.
-
Якщо вашу БД або її бекап буде злито, то... Думаю, ви вже самі про все здогадалися.
В базі даних в зашифрованому вигляді (ключ в коді або ENV)
Як?
class Group < ApplicationRecord
attr_encrypted_options.merge!(key: ENV.fetch('ATTR_ENCRYPTED_SECRET'))
attr_encrypted :mailchimp_api_key
end
Group.create!(name: "...", mailchimp_api_key: "ABCDEF")
-
використовуйте attr_encrypted
-
та згадані раніше dotenv
Особливості
-
Щоб отримати несанкціонований доступ до ключів потрібно щоб злили і БД і ENV чи код, де зберігається ключ для розшифровки. Якщо ж відбудеться щось одне — нічого страшного.
-
Найбезпечніше
Мінуси
-
Трохи складніше за вищеназвані способи
-
Може вплинути на швидкість роботи, якщо шифруються ключі в моделях, що часто використовуються.
Ще немає коментарів