Шифрование конвертов: управление KEK в случае автоматического входа

Вопрос или проблема

В настоящее время мы реализуем схему шифрования конвертов, чтобы безопасно хранить персонально идентифицируемые данные (PII) в нашей базе данных. Это означает, что у нас будет ключ шифрования данных (DEK), специфичный для пользователя, и ключ шифрования ключа (KEK), который будет производиться из пароля пользователя и случайной соли, специфичной для пользователя, с использованием PBKDF2 на фронтенде. Завернутый DEK (wDEK) будет храниться в нашей базе данных. Сам DEK нигде не будет храниться. Таким образом, до этого момента это, в основном, обычный подход к шифрованию конвертов.

Однако одно из наших бизнес-требований в будущем будет заключаться в реализации функции автоматического входа для новых пользователей. Это означает, что пользователь сможет войти без пароля с помощью простой URL-адреса входа (например, https://www.mycompany.com/autologin/${someRandomGeneratedToken}). Наш сервер аутентификации будет проверять someRandomGeneratedToken и выдавать токен авторизации. Таким образом, пользователь будет аутентифицирован в нашей системе.

Однако в этом случае пользователь не вводил никакой пароль. Таким образом, не будет возможности получить KEK на фронтенде.

Наш нынешний подход/идея решает эту дилемму, храня текущий KEK пользователя, завернутый с помощью секретного ключа на стороне сервера в нашей базе данных (wKEK). После ~15 дней (когда URL автоматического входа истечет) мы удалим запись wKEK из нашей базы данных. Мы знаем, что это (временно) нарушит подход нулевых знаний.

Таким образом, когда пользователь захочет получить/обновить свои PII, последовательность действий будет выглядеть следующим образом:

  1. Пользователь делает запрос к нашему серверу
  2. Наш сервер распаковывает wKEK с помощью секретного ключа на стороне сервера -> KEK
  3. Наш сервер распаковывает wDEK с помощью KEK -> DEK
  4. Наш сервер использует DEK для расшифровки/шифрования данных, хранящихся в нашей базе данных
  5. Возвращает расшифрованные данные пользователю

Кто-то знает лучший способ, как сделать шифрование конвертов с автоматическим входом?

Ответ или решение

Envelope шифрование: Управление KEK в случае автоматического входа

При реализации схемы встраиваемого шифрования (envelope encryption) для безопасного хранения данных, важным аспектом является управление ключами шифрования — как ключами данных (DEK), так и ключами шифрования ключей (KEK). Это особенно актуально в случае внедрения функции автоматического входа для новых пользователей, что создает уникальные вызовы в области безопасности и управления ключами.

Проблема при автоматическом входе

Как было описано, для реализации автоматического входа пользователи вводят токен, который позволяет им получить доступ к системе без ввода пароля. В стандартной ситуации процесс входа включает в себя извлечение KEK из пароля и случайной соли с использованием алгоритма PBKDF2. Однако при автоматическом входе это становится невозможным, так как пароль не вводится.

Текущая стратегия: использование wKEK

Согласно текущему решению, ключ шифрования KEK сохраняется в зашифрованном виде (wKEK) в базе данных, будучи защищенным серверным секретом. Эта стратегия позволяет серверу производить необходимые операции для извлечения данных. Однако, такой подход имеет свои недостатки, которые могут в будущем подвергнуть риску конфиденциальность пользовательских данных. Хранение wKEK в базе данных временно нарушает концепцию нулевого знания (zero-knowledge), поскольку сервер получает доступ к KEK, который должен оставаться в тайне.

Варианты улучшения управления KEK

  1. Использование временного KEK: Вместо хранения wKEK в базе данных, рассмотрите использование временного KEK, который будет создан при запросе автоматического входа. Этот KEK может генерироваться и использоваться только в течение короткого времени, что уменьшает риск его компрометации. По окончании сессии его можно уничтожить.

  2. Генерация KEK на сервере: Вместо хранения KEK или wKEK в базе данных, сервер может генерировать KEK на основе уникальных параметров сессии или информации о пользователе. Это создаст временную, но безопасную среду для развертывания DEK.

  3. Уменьшение промежуточных данных: Сокращение объема хранимых промежуточных данных путем использования временных токенов или вызовов API для динамической генерации и валидации KEK может уменьшить риски, связанные с утечками данных.

  4. Двухфакторная аутентификация: В дополнение к автоматическому входу рассмотрите возможность добавления механизма двухфакторной аутентификации (2FA) для предоставления дополнительной степени защиты при доступе к критически важным данным.

  5. Периодический ротация ключей: Включение механизма ротации (перемены) KEK и DEK может помочь в обеспечении дополнительной безопасности без необходимости постоянного хранения этих ключей.

  6. Использование временных токенов: Генерация временных токенов для доступа к ключам на сервере может косвенно уменьшить необходимость хранения постоянного wKEK и защитить систему даже в случае утечки.

  7. Шифрование метаданных: Чтобы повысить безопасность, рассмотрите возможность шифрования метаданных, связанных с KEK и DEK, что обеспечит дополнительный уровень защиты данных.

В заключение, хотя текущая стратегия хранения wKEK служит временным решением, важно продолжать искать способы улучшения управления KEK для автоматического входа, чтобы минимизировать риски компрометации и обеспечить высокий уровень защиты персональных данных пользователей. Настройка политики безопасности и внедрение современных технологических решений обеспечит устойчивость вашей системы в условиях растущих угроз кибербезопасности.

Оцените материал
Добавить комментарий

Капча загружается...