Вопрос или проблема
У меня есть несколько симметричных ключей шифрования (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. Этот процесс может быть реализован через следующие шаги:
-
Создание уникального ключа шифрования: Перед шифрованием DEK используйте метод деривации ключа, который использует ввод пользователя. Например, вы можете добавить префикс ("key-") к паролю перед его обработкой для получения ключа. Это поможет предотвратить атаки с использованием предварительно вычисленных таблиц (rainbow tables).
-
Сохранение безопасности пароля: В целях безопасности, не храните пароль в явном виде. Вместо этого используйте методы хеширования, такие как bcrypt или Argon2, при хранении паролей.
Б. Использование SCRAM-256
Другой метод заключается в использовании протокола аутентификации, такого как SCRAM-256 (RFC 5802). В этом случае:
- Ключ клиента, который не хранится на сервере, может использоваться для шифрования DEK.
- Протокол SCRAM позволяет сохранить секретность и защиту от атак с подменой запросов, тем самым повышая общую безопасность системы.
3. Внешние устройства и управление ключами
Для дополнительного уровня безопасности вы можете рассмотреть возможность использования внешнего устройства для хранения ключей. Например:
- USB-ключи или безопасные токены: Они могут содержать ключи, необходимые для доступа к DEK. Пользователь должен заботиться о безопасности своего устройства, что также увеличивает уровень защиты.
4. Разделение доступа и контроль
Необходимо также внедрить многоуровневую систему контроля доступа, которая включает:
- Систему ролей, чтобы только авторизованные пользователи могли выполнять операции шифрования и дешифрования.
- Логи аудита для отслеживания доступа к DEK и HSM, что поможет в выявлении подозрительных действий.
Заключение
Реализация внешних компонентов для защиты ключей в вашей системе потребует тщательной проработки архитектуры и методов шифрования. Применение сложной системы безопасности, основанной на совокупности паролей, протоколов аутентификации, внешних устройств и контроля доступа, позволит минимизировать риски и обеспечить высокий уровень защиты ключевой информации.
Создание безопасной среды для работы с конфиденциальными данными требует постоянного внимания и обновления методов защиты. Рассматривайте актуальность и эффективность выбранных решений в контексте нового уровня угроз, чтобы обеспечить надежность вашей системы.