Як правильно зберігати ключі API на бекенді

2 хв. читання

Нещодавно я побачив на 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")

Особливості

  • Щоб отримати несанкціонований доступ до ключів потрібно щоб злили і БД і ENV чи код, де зберігається ключ для розшифровки. Якщо ж відбудеться щось одне — нічого страшного.

  • Найбезпечніше

Мінуси

  • Трохи складніше за вищеназвані способи

  • Може вплинути на швидкість роботи, якщо шифруються ключі в моделях, що часто використовуються.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.7K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація