Безопасное хранилище учетных данных в python
нападение
одной из возможных моделей угроз, в контексте хранения учетных данных, является злоумышленник, который имеет возможность :
- проверьте любую (пользовательскую) память процесса
- чтение локальных (пользовательских) файлов
AFAIK, консенсус по этому типу атаки заключается в том, что его невозможно предотвратить (поскольку учетные данные должны храниться в памяти для их фактического использования программой), но есть несколько методов для смягчения это:
- минимизировать время хранения конфиденциальных данных в памяти
- перезаписать память, как только данные больше не нужны
- калечить данные в памяти, продолжать перемещать его и другие меры безопасности через неизвестность
Python в частности
первый способ достаточно прост в реализации, возможно через брелок (надеюсь, место для хранения ядра)
в второй не достижим вообще без написания модуля C, насколько мне известно (но я бы хотел, чтобы здесь было доказано обратное или иметь список существующих модулей)
третий хитрый.
в частности, python является языком с очень мощными возможностями самоанализа и отражения, трудно предотвратить доступ к учетным данным любому, кто может выполнить код python в процессе интерпретатора.
Кажется, есть консенсус это нет никакого способа обеспечить соблюдение частных атрибутов и попытки он будет в лучшем случае раздражать других программистов, которые используют ваш код.
вопрос
принимая все это во внимание, как безопасно хранить учетные данные аутентификации с помощью python? Каковы наилучшие методы? Можно ли что-то сделать с философией языка "все публично"? Я знаю "мы все здесь взрослые люди по обоюдному согласию", но должны ли мы быть вынуждены выбирать между обменом паролями с злоумышленником и использованием другого языка?
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.
Дополнительные ссылки: