Вопрос или проблема
В настоящее время мы реализуем схему шифрования конвертов, чтобы безопасно хранить персонально идентифицируемые данные (PII) в нашей базе данных. Это означает, что у нас будет ключ шифрования данных (DEK), специфичный для пользователя, и ключ шифрования ключа (KEK), который будет производиться из пароля пользователя и случайной соли, специфичной для пользователя, с использованием PBKDF2 на фронтенде. Завернутый DEK (wDEK) будет храниться в нашей базе данных. Сам DEK нигде не будет храниться. Таким образом, до этого момента это, в основном, обычный подход к шифрованию конвертов.
Однако одно из наших бизнес-требований в будущем будет заключаться в реализации функции автоматического входа для новых пользователей. Это означает, что пользователь сможет войти без пароля с помощью простой URL-адреса входа (например, https://www.mycompany.com/autologin/${someRandomGeneratedToken}). Наш сервер аутентификации будет проверять someRandomGeneratedToken и выдавать токен авторизации. Таким образом, пользователь будет аутентифицирован в нашей системе.
Однако в этом случае пользователь не вводил никакой пароль. Таким образом, не будет возможности получить KEK на фронтенде.
Наш нынешний подход/идея решает эту дилемму, храня текущий KEK пользователя, завернутый с помощью секретного ключа на стороне сервера в нашей базе данных (wKEK). После ~15 дней (когда URL автоматического входа истечет) мы удалим запись wKEK из нашей базы данных. Мы знаем, что это (временно) нарушит подход нулевых знаний.
Таким образом, когда пользователь захочет получить/обновить свои PII, последовательность действий будет выглядеть следующим образом:
- Пользователь делает запрос к нашему серверу
- Наш сервер распаковывает wKEK с помощью секретного ключа на стороне сервера -> KEK
- Наш сервер распаковывает wDEK с помощью KEK -> DEK
- Наш сервер использует DEK для расшифровки/шифрования данных, хранящихся в нашей базе данных
- Возвращает расшифрованные данные пользователю
Кто-то знает лучший способ, как сделать шифрование конвертов с автоматическим входом?
Ответ или решение
Envelope шифрование: Управление KEK в случае автоматического входа
При реализации схемы встраиваемого шифрования (envelope encryption) для безопасного хранения данных, важным аспектом является управление ключами шифрования — как ключами данных (DEK), так и ключами шифрования ключей (KEK). Это особенно актуально в случае внедрения функции автоматического входа для новых пользователей, что создает уникальные вызовы в области безопасности и управления ключами.
Проблема при автоматическом входе
Как было описано, для реализации автоматического входа пользователи вводят токен, который позволяет им получить доступ к системе без ввода пароля. В стандартной ситуации процесс входа включает в себя извлечение KEK из пароля и случайной соли с использованием алгоритма PBKDF2. Однако при автоматическом входе это становится невозможным, так как пароль не вводится.
Текущая стратегия: использование wKEK
Согласно текущему решению, ключ шифрования KEK сохраняется в зашифрованном виде (wKEK) в базе данных, будучи защищенным серверным секретом. Эта стратегия позволяет серверу производить необходимые операции для извлечения данных. Однако, такой подход имеет свои недостатки, которые могут в будущем подвергнуть риску конфиденциальность пользовательских данных. Хранение wKEK в базе данных временно нарушает концепцию нулевого знания (zero-knowledge), поскольку сервер получает доступ к KEK, который должен оставаться в тайне.
Варианты улучшения управления KEK
-
Использование временного KEK: Вместо хранения wKEK в базе данных, рассмотрите использование временного KEK, который будет создан при запросе автоматического входа. Этот KEK может генерироваться и использоваться только в течение короткого времени, что уменьшает риск его компрометации. По окончании сессии его можно уничтожить.
-
Генерация KEK на сервере: Вместо хранения KEK или wKEK в базе данных, сервер может генерировать KEK на основе уникальных параметров сессии или информации о пользователе. Это создаст временную, но безопасную среду для развертывания DEK.
-
Уменьшение промежуточных данных: Сокращение объема хранимых промежуточных данных путем использования временных токенов или вызовов API для динамической генерации и валидации KEK может уменьшить риски, связанные с утечками данных.
-
Двухфакторная аутентификация: В дополнение к автоматическому входу рассмотрите возможность добавления механизма двухфакторной аутентификации (2FA) для предоставления дополнительной степени защиты при доступе к критически важным данным.
-
Периодический ротация ключей: Включение механизма ротации (перемены) KEK и DEK может помочь в обеспечении дополнительной безопасности без необходимости постоянного хранения этих ключей.
-
Использование временных токенов: Генерация временных токенов для доступа к ключам на сервере может косвенно уменьшить необходимость хранения постоянного wKEK и защитить систему даже в случае утечки.
-
Шифрование метаданных: Чтобы повысить безопасность, рассмотрите возможность шифрования метаданных, связанных с KEK и DEK, что обеспечит дополнительный уровень защиты данных.
В заключение, хотя текущая стратегия хранения wKEK служит временным решением, важно продолжать искать способы улучшения управления KEK для автоматического входа, чтобы минимизировать риски компрометации и обеспечить высокий уровень защиты персональных данных пользователей. Настройка политики безопасности и внедрение современных технологических решений обеспечит устойчивость вашей системы в условиях растущих угроз кибербезопасности.