Вопрос или проблема
У меня есть настольное приложение, написанное на Python. Приложение подключается к внешнему сервису SAP HANA и извлекает данные. В настоящее время есть несколько файлов конфигурации, в которых несколько строк подключения хранятся в незашифрованном виде.
Я хочу зашифровать файлы конфигурации, которые должны расшифровываться, когда пользователь входит в систему. Я проверил несколько библиотек, таких как encrypted-config, но мои требования здесь не подходят.
Вот мой план
- Файл конфигурации зашифрован с использованием ключа шифрования: CK
- CK хранится на другом сервере в зашифрованном виде с хэшем пароля пользователя.
- Когда пользователь входит в приложение, вычисляется хэш пароля, и оно подключается к серверу ключей, расшифровывает CK, хранит его в кэше, расшифровывает файл конфигурации
- Извлекает данные из SAP
Я не знаю, насколько надежен этот подход, но есть несколько проблем:
- Если CK зашифрован с хэшем пароля пользователя, мне нужно хранить несколько копий CK для каждого пользователя.
- Я хочу реализовать ротацию ключей, и в этом случае проблема 1, упомянутая выше, станет ещё более сложной.
** Отредактировано **
Этот сервер ключей не используется специально для управления ключами. Я просто назвал другой удалённый сервер как сервер ключей, где ключи будут храниться зашифрованными в базе данных или файле.
Пожалуйста, дайте совет.
Вопрос делает неправильные предположения о некоторых деталях. Например, говорится о вычислении хэша пароля, и, похоже, предполагается, что хэш используется в качестве криптографического ключа для шифрования/расшифрования ключа на сервере ключей. Но обычно так не работают серверы ключей.
Серверы ключей имеют свои собственные механизмы шифрования и будут шифровать все свои ключи своим собственным ключом (обычно называемым чем-то вроде “мастер-ключа” или “ключа шифрования ключа (KEK)”). Когда вы подключаетесь к серверу ключей с паролем, сервер аутентифицирует вашу комбинацию имя пользователя/пароль. Затем вы запрашиваете доступ к конкретному имени ключа или идентификатору ключа, и если вы авторизованы, он предоставит вам доступ. В зависимости от конфигурации сервера и вашего запроса он может экспортировать ключ вам, чтобы вы могли использовать его для шифрования и расшифрования, или он может предоставить вам услуги шифрования/расшифрования.
Задача сервера ключей — надежно хранить ключи и выполнять функции управления жизненным циклом ключей (генерация ключей, уничтожение ключей и т. д.) Сервер ключей может предоставлять функциональность ротации ключей; но поскольку нет криптографических стандартов для ротации ключей или версионирования ключей, реализации будут зависеть от сервера.
Ответ или решение
Для безопасной работы с конфигурационными файлами в вашем настольном приложении на Python, которое взаимодействует с внешним сервисом SAP HANA, необходимо воспользоваться концепцией управления ключами и ротации ключей. Давайте разберем ваш подход и предложим оптимальные решения для повышения надежности и безопасности.
Шаг 1: Шифрование конфигурационных файлов
Ваш план по шифрованию файлов конфигурации с использованием ключа шифрования (CK) является разумным. Однако есть несколько моментов, на которые стоит обратить внимание:
-
Использование надежных алгоритмов: Выберите авторитетные библиотеки для шифрования, такие как
cryptography
илиPyCryptodome
, которые обеспечивают высокий уровень безопасности. Эти библиотеки поддерживают алгоритмы AES, которые являются стандартом для шифрования данных. -
Шифруйте всю конфигурацию: Вместо шифрования отдельных элементов конфигурации, рассмотрите возможность шифрования всего файла, что значительно упростит процесс дешифрования.
Шаг 2: Хранение ключа шифрования
Ваше решение о хранении ключа шифрования на другом сервере требует дополнительных мер безопасности:
-
Избегайте использования хешей паролей: Хранение CK, зашифрованного с использованием хеша пароля пользователя, может привести к возникновению уязвимостей. Вместо этого воспользуйтесь безопасной аутентификацией в ключевом сервере, который хранит и управляет CK и другими ключами.
-
Ключевые серверы: Используйте специализированный сервер для управления ключами (например, HashiCorp Vault, AWS Key Management Service или аналогичный). Он сможет безопасно хранить и управлять ключами, обеспечивая ротацию ключей и доступ только по авторизованным запросам.
Шаг 3: Дешифрование при входе пользователя
Ваш алгоритм по дешифрованию CK после входа пользователя является правильным, однако следует учитывать:
-
Кэширование и безопасность: Храните декодированный CK в безопасной области памяти или использовать длительные сессии с минимальной частотой обращения к серверу ключей. Это способствует уменьшению задержек и увеличивает безопасность.
-
Очистка кеша: Убедитесь, что CK очищается из кеша после завершения сессии пользователя, чтобы избежать потенциальных утечек.
Шаг 4: Реализация ротации ключей
Ротация ключей – важный аспект безопасности, поэтому необходимо учитывать:
-
Стратегия ротации: Разработайте стратегию ротации CK, которая будет сбалансирована между регулярной сменой ключей и сохранением их доступности для пользователей.
-
Текущие и новые ключи: Храните предыдущие версии CK, чтобы обеспечить обратную совместимость на время перехода на новый ключ. Важно предусмотреть механизм для организации перехода между текущим и новым ключами.
-
Автоматизация процесса: Используйте возможности вашего ключевого сервера для автоматизации ротации ключей с минимальным влиянием на пользователей.
Заключение
Реализация безопасного управления ключами и ротацией ключей является необходимостью для обеспечения конфиденциальности и целостности вашего приложения. Переход на специализированные решения для хранения ключей и их безопасного использования поможет вам снизить риски, связанные с хранением и обработкой конфиденциальных данных. Важно следить за актуальностью ваших подходов, учитывая постоянное развитие технологий и угроз безопасности.