Ruby on Rails - почему определенные данные должны быть зашифрованы?
Шифрование данных
Закончив добавление attr_encrypted к некоторым моделям, я пришел к выводу, что работа хакеров может быть не такой сложной.
У меня есть база данных на сервере, отличном от серверов приложений, но есть вероятность, что если кому-то удастся получить доступ к серверу БД, он также сможет получить доступ к серверу приложений, где хранятся ключи (возможно, это неверное предположение), поскольку они имеют такие же меры безопасности.
вопрос
Код Rails хранится в читаемом текстовом формате на сервере, поэтому к секретным ключам можно получить доступ. Конечно, если кто-то овладел базой данных и удерживает эти ключи, все шифрование данных становится неактуальным, поскольку оно просто (немного) продлевает время хакеров для расшифровки информации.
Если да, можно ли предпринять дальнейшие меры безопасности или я полностью пропустил концепцию шифрования?
Я осмотрел гем attr_encrypted и связанные с ним readme и вопросы, но не смог найти ничего полезного.
2 ответа
attr_encrypted
защищает ваши данные от простых утечек данных. Подумайте, что АНБ прослушивает кабель между DC (куда будут отправляться ваши журналы репликации БД) или недовольный администратор БД (не имеющий доступа к источнику приложения), сбрасывающий все ваши данные в интернет.
Если это фактическое нарушение, злоумышленники могут не получить доступ как к коду приложения, так и к базе данных (зависит от вашей архитектуры и мер безопасности). Если у них есть оба, тогда да, игра окончена.
В общем, лучше иметь его [для конфиденциальных данных], чем не иметь. Не больно, я бы сказал.
Не помещайте ключи в сервер приложений и не регистрируйте их в репозитории git.
Вместо этого используйте переменные среды. Вы можете иметь разные подходы для разработки и производства.
Очень легко сделать на Heroku (например).
У меня есть проблема с шифрованием:
# app/models/concerns/encryption.rb
module Encryption
extend ActiveSupport::Concern
module ClassMethods
def encryption_key
ENV['ENCRYPT_KEY']
end
end
end
В модели я делаю это
class User < ActiveRecord::Base
include Encryption
attr_encrypted :name, :key => encryption_key
end
В разработке я использую .env
файл для хранения ключей и получения с помощью мастера.