Защита ключей с использованием внешнего фактора

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

У меня есть несколько симметричных ключей шифрования (DEK), хранящихся в базе данных вместе с зашифрованными данными. DEK зашифрованы публичным ключом HSM. Сервер приложения использует HSM с интерфейсом PKCS11. Дешифрование ключей и данных осуществляется внутри HSM. Открытые ключи никогда не покидают память HSM.

Тем не менее, я обеспокоен безопасностью. Если злоумышленник сможет проникнуть на сервер приложения, он сможет просто извлечь зашифрованные данные из базы данных и запросить HSM.

Я хотел бы иметь “внешний” компонент, участвующий в дешифровании, связанный с аутентификацией пользователя. Таким образом, даже если злоумышленник успеет захватить сервер и базу данных и получит доступ к интерфейсу HSM, наличие исходного ключевого материала будет недостаточно. Протокол шифрования должен содержать компонент, который знает или имеет только уполномоченный пользователь, но это знание не хранится нигде и не может быть выведено. Также существует задача: ключ на самом деле связан с группой пользователя, а не с его идентичностью. Это означает, что разные пользователи одной группы должны иметь доступ к одному и тому же ключу.

Что ж, если вы планируете иметь это для каждого пользователя, я не вижу других вариантов, кроме как хранить отдельный DEK для каждого пользователя. Вы можете использовать различные способы для шифрования этого DEK.

Одна из идей заключается в том, чтобы использовать пароль для генерации ключа для дешифрования DEK. Конечно, это должно быть выведено другим способом, чем хэш пароля, хранящийся в базе данных, например, добавив “key-” перед паролем.

Другим вариантом является использование чего-то вроде SCRAM-256, а затем использовать, например, Client-Key для шифрования DEK (ключ клиента не хранится на сервере в SCRAM).

Другим вариантом, конечно, было бы просто хранить дополнительный ключ на компьютере пользователя, но это имеет недостаток, заключающийся в том, что пользователю придется защищать и создавать резервные копии этого файла.

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

Защита ключей с использованием внешних факторов

Ваша беспокойность относительно безопасности зашифрованных ключей (DEK), хранящихся в базе данных, совершенно обоснована. Даже если DEK защищены зашифрованным ключом HSM (Hardware Security Module), взлом серверов приложения может привести к получению доступа к зашифрованным данным и интерфейсу HSM. В данном контексте необходимы эффективные меры по усилению защиты.

1. Архитектура системы и необходимость внешнего компонента

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

2. Использование паролей и методов их обработки

А. Деривация ключа из пароля

Одним из самых простых и эффективных решений является использование пароля для создания ключа, предназначенного для дешифрования DEK. Этот процесс может быть реализован через следующие шаги:

  1. Создание уникального ключа шифрования: Перед шифрованием DEK используйте метод деривации ключа, который использует ввод пользователя. Например, вы можете добавить префикс ("key-") к паролю перед его обработкой для получения ключа. Это поможет предотвратить атаки с использованием предварительно вычисленных таблиц (rainbow tables).

  2. Сохранение безопасности пароля: В целях безопасности, не храните пароль в явном виде. Вместо этого используйте методы хеширования, такие как bcrypt или Argon2, при хранении паролей.

Б. Использование SCRAM-256

Другой метод заключается в использовании протокола аутентификации, такого как SCRAM-256 (RFC 5802). В этом случае:

  • Ключ клиента, который не хранится на сервере, может использоваться для шифрования DEK.
  • Протокол SCRAM позволяет сохранить секретность и защиту от атак с подменой запросов, тем самым повышая общую безопасность системы.

3. Внешние устройства и управление ключами

Для дополнительного уровня безопасности вы можете рассмотреть возможность использования внешнего устройства для хранения ключей. Например:

  • USB-ключи или безопасные токены: Они могут содержать ключи, необходимые для доступа к DEK. Пользователь должен заботиться о безопасности своего устройства, что также увеличивает уровень защиты.

4. Разделение доступа и контроль

Необходимо также внедрить многоуровневую систему контроля доступа, которая включает:

  • Систему ролей, чтобы только авторизованные пользователи могли выполнять операции шифрования и дешифрования.
  • Логи аудита для отслеживания доступа к DEK и HSM, что поможет в выявлении подозрительных действий.

Заключение

Реализация внешних компонентов для защиты ключей в вашей системе потребует тщательной проработки архитектуры и методов шифрования. Применение сложной системы безопасности, основанной на совокупности паролей, протоколов аутентификации, внешних устройств и контроля доступа, позволит минимизировать риски и обеспечить высокий уровень защиты ключевой информации.

Создание безопасной среды для работы с конфиденциальными данными требует постоянного внимания и обновления методов защиты. Рассматривайте актуальность и эффективность выбранных решений в контексте нового уровня угроз, чтобы обеспечить надежность вашей системы.

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

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