Безопасное хранилище учетных данных в python

нападение

одной из возможных моделей угроз, в контексте хранения учетных данных, является злоумышленник, который имеет возможность :

  • проверьте любую (пользовательскую) память процесса
  • чтение локальных (пользовательских) файлов

AFAIK, консенсус по этому типу атаки заключается в том, что его невозможно предотвратить (поскольку учетные данные должны храниться в памяти для их фактического использования программой), но есть несколько методов для смягчения это:

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

Python в частности

первый способ достаточно прост в реализации, возможно через брелок (надеюсь, место для хранения ядра)

в второй не достижим вообще без написания модуля C, насколько мне известно (но я бы хотел, чтобы здесь было доказано обратное или иметь список существующих модулей)

третий хитрый.

в частности, python является языком с очень мощными возможностями самоанализа и отражения, трудно предотвратить доступ к учетным данным любому, кто может выполнить код python в процессе интерпретатора.

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

вопрос

принимая все это во внимание, как безопасно хранить учетные данные аутентификации с помощью python? Каковы наилучшие методы? Можно ли что-то сделать с философией языка "все публично"? Я знаю "мы все здесь взрослые люди по обоюдному согласию", но должны ли мы быть вынуждены выбирать между обменом паролями с злоумышленником и использованием другого языка?

2 ответов


есть две очень разные причины, почему вы можете хранить учетные данные аутентификации:

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

в первом случае, вы никогда не должны хранить пароль (или зашифрованную версию пароля). Вместо этого, вы должны хэш пароль с высококачественной солью и убедитесь, что используемый вами алгоритм хэширования является вычислительно дорогим (для предотвращения атак словаря), таким как PBKDF2 или bcrypt. См.соленый пароль хеширования-делать это правильно для много больше деталей. Если вы будете следовать этому подходу, даже если хакер получает подсоленной, медленный хэш-токен, они не могут с ним много сделать.

во втором случае есть ряд вещей, чтобы сделать секретное открытие сложнее (как вы описываете в своем вопросе), например:

  • хранение секретов в зашифрованном виде до необходимости, дешифрование по требованию, а затем повторное шифрование сразу после
  • используя рандомизацию адресного пространства, поэтому каждый раз, когда приложение запускается, ключи хранятся по другому адресу
  • использование ОС хранилища ключей
  • использование "жесткого" языка, такого как C/C++, а не на основе виртуальной машины, интроспективный язык, такой как Java или Python

такие подходы, конечно, лучше, чем ничего, но опытный хакер рано или поздно сломает его.

маркеры

с теоретической точки зрения аутентификация-это акт доказательства того, что оспариваемый человек является тем, кем они говорят. Традиционно, это достигается с помощью общего секрета (пароля), но есть и другие способы проявить себя, в том числе:

  • вне диапазона проверка подлинности. Например, где я живу, когда я пытаюсь войти в свой интернет-банк, я получаю одноразовый пароль (OTP) в качестве SMS на моем телефоне. В этом методе я доказываю, что я в силу владения определенным номером телефона
  • маркер безопасности: чтобы войти в службу, я должен нажать кнопку на моем токене, чтобы получить OTP, который я затем использую в качестве моего пароль:.
  • другие устройства:

    • смарт-карты, в частности, как используется Министерством обороны США, где он называется CAC. Python имеет модуль под названием pyscard интерфейс это
    • NFC устройства

и более полный список здесь

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

сессии краже

(однако всегда есть):

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

Это очень реальная угроза, как показывает несколько атак межсайтовых сценариев (один пример -сайты банка США и Банка Америки уязвимы, но их бесчисленное множество более.)

безопасное

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

один из способов частично смягчить это, делегировав связь службе защищенному прокси-серверу и разработав безопасный подход входа между приложением и прокси-сервером. В этом подходи!--1-->

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

недостатками этого подхода являются:

  • пользователь может не захотеть доверять защищенному прокси-серверу с хранением учетных данных
  • пользователь не может доверять защищенному прокси-серверу с данными, проходящими через него в стороннее приложение
  • владелец приложения имеет дополнительную инфраструктуру и затраты на хостинг для запуска прокси-сервера

ответы

Итак, к конкретному ответы:

Как безопасно хранить учетные данные аутентификации с помощью python?

  • при хранении пароля приложения для аутентификации пользователя используйте алгоритм PBKDF2, напримерhttps://www.dlitz.net/software/python-pbkdf2/
  • Если хранение пароля / маркера безопасности для доступа к другой службе, то нет абсолютно безопасного способа.
  • однако, рассмотрите возможность переключения аутентификации стратегии, например, смарт-карты, используя, например,pyscard. Смарт-карты можно использовать как для аутентификации пользователя в приложении, так и для безопасной аутентификации приложения в другой службе с помощью сертификатов X. 509.

можно ли что-то сделать с философией языка "все публично"? Я знаю ,что "мы все взрослые люди здесь", но должны ли мы быть вынуждены выбирать между обменом паролями с злоумышленником и использованием другого язык?

ИМХО нет ничего плохого в написании конкретные модуль в Python, который делает это проклятым, чтобы скрыть секретную информацию, что делает его правильным баггером для повторного использования другими (раздражает других программистов цель). Вы даже можете кодировать большие части в C и ссылаться на него. Однако не делайте этого для других модулей по очевидным причинам.

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

учитывая отсутствие абсолютной конфиденциальности, остальное - просто обфускация, а уровень защиты-это просто то, насколько сложно это запутать против того, насколько опытный хакер хочет информацию. И мы все знай как!--141-->заканчивается, даже пользовательского оборудования и миллиардные продукты.

использование Python keyring

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


Я не эксперт в этой области и действительно просто хочу решить ту же проблему, что и вы, но это похоже на что-то вроде хранилище Hashicorp мог бы помочь довольно хорошо.

в частности, WRT к проблеме хранения учетных данных для служб 3-й части. например:

в современном мире API-управляемого все, многие системы также поддерживают программное создание учетных данных доступа. Vault использует эту поддержку через функцию под названием dynamic secrets: секреты, которые генерируются по требованию, а также поддерживают автоматическое аннулирование.

для Vault 0.1 Vault поддерживает динамическое создание учетных данных AWS, SQL и Consul.

Дополнительные ссылки: