Реализация хранилища ключей и ротации ключей для необлачного приложения

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

У меня есть настольное приложение, написанное на Python. Приложение подключается к внешнему сервису SAP HANA и извлекает данные. В настоящее время есть несколько файлов конфигурации, в которых несколько строк подключения хранятся в незашифрованном виде.

Я хочу зашифровать файлы конфигурации, которые должны расшифровываться, когда пользователь входит в систему. Я проверил несколько библиотек, таких как encrypted-config, но мои требования здесь не подходят.

Вот мой план

  1. Файл конфигурации зашифрован с использованием ключа шифрования: CK
  2. CK хранится на другом сервере в зашифрованном виде с хэшем пароля пользователя.
  3. Когда пользователь входит в приложение, вычисляется хэш пароля, и оно подключается к серверу ключей, расшифровывает CK, хранит его в кэше, расшифровывает файл конфигурации
  4. Извлекает данные из SAP

Я не знаю, насколько надежен этот подход, но есть несколько проблем:

  1. Если CK зашифрован с хэшем пароля пользователя, мне нужно хранить несколько копий CK для каждого пользователя.
  2. Я хочу реализовать ротацию ключей, и в этом случае проблема 1, упомянутая выше, станет ещё более сложной.

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

Пожалуйста, дайте совет.

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

Серверы ключей имеют свои собственные механизмы шифрования и будут шифровать все свои ключи своим собственным ключом (обычно называемым чем-то вроде “мастер-ключа” или “ключа шифрования ключа (KEK)”). Когда вы подключаетесь к серверу ключей с паролем, сервер аутентифицирует вашу комбинацию имя пользователя/пароль. Затем вы запрашиваете доступ к конкретному имени ключа или идентификатору ключа, и если вы авторизованы, он предоставит вам доступ. В зависимости от конфигурации сервера и вашего запроса он может экспортировать ключ вам, чтобы вы могли использовать его для шифрования и расшифрования, или он может предоставить вам услуги шифрования/расшифрования.

Задача сервера ключей — надежно хранить ключи и выполнять функции управления жизненным циклом ключей (генерация ключей, уничтожение ключей и т. д.) Сервер ключей может предоставлять функциональность ротации ключей; но поскольку нет криптографических стандартов для ротации ключей или версионирования ключей, реализации будут зависеть от сервера.

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

Для безопасной работы с конфигурационными файлами в вашем настольном приложении на Python, которое взаимодействует с внешним сервисом SAP HANA, необходимо воспользоваться концепцией управления ключами и ротации ключей. Давайте разберем ваш подход и предложим оптимальные решения для повышения надежности и безопасности.

Шаг 1: Шифрование конфигурационных файлов

Ваш план по шифрованию файлов конфигурации с использованием ключа шифрования (CK) является разумным. Однако есть несколько моментов, на которые стоит обратить внимание:

  • Использование надежных алгоритмов: Выберите авторитетные библиотеки для шифрования, такие как cryptography или PyCryptodome, которые обеспечивают высокий уровень безопасности. Эти библиотеки поддерживают алгоритмы AES, которые являются стандартом для шифрования данных.

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

Шаг 2: Хранение ключа шифрования

Ваше решение о хранении ключа шифрования на другом сервере требует дополнительных мер безопасности:

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

  2. Ключевые серверы: Используйте специализированный сервер для управления ключами (например, HashiCorp Vault, AWS Key Management Service или аналогичный). Он сможет безопасно хранить и управлять ключами, обеспечивая ротацию ключей и доступ только по авторизованным запросам.

Шаг 3: Дешифрование при входе пользователя

Ваш алгоритм по дешифрованию CK после входа пользователя является правильным, однако следует учитывать:

  • Кэширование и безопасность: Храните декодированный CK в безопасной области памяти или использовать длительные сессии с минимальной частотой обращения к серверу ключей. Это способствует уменьшению задержек и увеличивает безопасность.

  • Очистка кеша: Убедитесь, что CK очищается из кеша после завершения сессии пользователя, чтобы избежать потенциальных утечек.

Шаг 4: Реализация ротации ключей

Ротация ключей – важный аспект безопасности, поэтому необходимо учитывать:

  1. Стратегия ротации: Разработайте стратегию ротации CK, которая будет сбалансирована между регулярной сменой ключей и сохранением их доступности для пользователей.

  2. Текущие и новые ключи: Храните предыдущие версии CK, чтобы обеспечить обратную совместимость на время перехода на новый ключ. Важно предусмотреть механизм для организации перехода между текущим и новым ключами.

  3. Автоматизация процесса: Используйте возможности вашего ключевого сервера для автоматизации ротации ключей с минимальным влиянием на пользователей.

Заключение

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

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

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