Шаблон.Net Design для хранения и извлечения конфиденциальных данных пользователя
Существуют ли какие-либо эталонные шаблоны для серверных приложений.Net, относящиеся к хранению и извлечению конфиденциальной для пользователя информации, такой как учетные данные третьих сторон?
Мои предварительные мысли о дизайне таковы:
- Создайте самозаверяющий сертификат X509 с надежным закрытым ключом,
- Экспортируйте сертификат и ключ и сохраните их на USB-ключе, который будет заперт в сундуке с сокровищами и защищен драконами,
- Разработка приложений моего сервера для запроса закрытого ключа по требованию из хранилища сертификатов текущего пользователя Windows,
- При установке серверного приложения на новый сервер извлеките USB-ключ, импортируйте сертификат и пометьте закрытый ключ как неэкспортируемый.
Мои требования:
- Снижайте, насколько это возможно, риск получения конфиденциальной информации пользователя в случае взлома носителя. В моем случае носителем данных может быть реляционная база данных или Amazon SimpleDB,
- Уменьшите риск компрометации конфиденциальной информации пользователя, если будет взломана операционная система хоста сервера.Net, в данном случае Data Center Edition Windows.
Обновление3. Забыл упомянуть, что возможность повторного ввода ключа является требованием, чтобы один и тот же первичный ключ шифрования не использовался в течение 10 лет.
Проблемы:
- Если операционная система хоста скомпрометирована, злоумышленник может установить вредоносное приложение для выполнения тех же операций дешифрования, что и мой сервер.Net.
Обновление Думая о компрометации ОС, я понимаю, что ничего не поделаешь, если квалифицированный злоумышленник получает доступ, но ключи должны быть защищены от администратора с недовольным содержанием, т.е. это больше, чем просто открытие файла или ключа реестра для извлечения приватного ключа. ключ.
Я уверен, что эта проблема была решена уже тысячу раз, более чем рада за ответ по ссылке, но поиск по темам типа "шифрование безопасности" - это низкий уровень шума и высокий уровень шума.
3 ответа
Мне неизвестны какие-либо конкретные шаблоны проектирования в отношении безопасности информации в вашем серверном приложении.NET, однако, в конечном счете, вы можете сделать так много только для защиты любой информации, которую вы запрашиваете у пользователя, и, в частности, для хранения.
Если вы храните какие-либо пароли пользователей, которые будут использоваться для аутентификации, которую будет выполнять ваше собственное приложение, лучший способ сохранить это с помощью соленой односторонней хеш-функции. Таким образом, пользователь будет вводить пароль вручную в виде простого текста каждый раз, когда он аутентифицируется в вашем приложении, и вы немедленно хешируете этот простой текстовый пароль и сравниваете его с сохраненным вами хешированным паролем. Любой злоумышленник, даже тот, кто имеет доступ к необработанной базе данных, должен будет перебрать все ваши подсоленные хэши. Не невозможно (учитывая достаточную вычислительную мощность), но, безусловно, невероятно во всей реальности.
Если вы храните имена пользователей / пароли, которые предоставляет вам пользователь, так что ваше приложение может затем использовать эти учетные данные для автоматического "входа"/"аутентификации" в другом приложении или службе от имени пользователя, я бы предложил что вы не сделаете этого, если безопасность этих данных имеет первостепенное значение.
Проще говоря, даже если вы в конечном итоге зашифруете эти учетные данные (будь то симметричное или асимметричное шифрование), эти данные должны где-то использоваться, а для этого они должны быть дешифрованы. Это, так сказать, "слабое звено" в цепи безопасности.
Уменьшите риск компрометации конфиденциальной информации пользователя, если будет взломана операционная система хоста сервера.Net, в данном случае Data Center Edition Windows.
Если это произойдет, все ставки сняты. Хранение данных в зашифрованном виде больше ничего не значит, как будто Windows может расшифровать эти данные, так же как и злоумышленник, получив доступ к машине / ОС. Ему даже не нужно будет пытаться "экспортировать" закрытый ключ из хранилища сертификатов Windows, поскольку он может внедрить свой вредоносный код дальше по цепочке дешифрования и просто перехватывать дешифрованные данные по мере их выхода из процесса дешифрования.
Конечно, лучший способ защитить конфиденциальные данные вашего пользователя - никогда не хранить их вообще. Каждый раз запрашивайте его у пользователя, используйте его для тех целей, для которых он вам нужен, а затем немедленно избавляйтесь от него. В Великобритании стандарты данных PCI (индустрии платежных карт) принимают эту политику в отношении кодов CVV на кредитных картах. Торговцы могут хранить номера кредитных карт, но не коды CVV в своих базах данных.
Если вы должны хранить данные, то обязательно зашифруйте их, но имейте в виду, что шифрование не обязательно "защищает" данные, это просто добавляет еще один слой того, что эффективно запутывает злоумышленника, который потенциально может поставить под угрозу вашу физическую машину или операционная система.
Если вы храните данные, вам необходимо обеспечить как можно более высокий уровень безопасности периметра (т. Е. Сетевой безопасности), чтобы предотвратить возможность получения злоумышленником доступа к ОС сервера.
Экспортируйте сертификат и ключ и сохраните их на USB-ключе, который будет заперт в сундуке с сокровищами и защищен драконами,
Наряду с надежным брандмауэром и, возможно, системой IDS, вам может понадобиться и один из этих драконов для защиты вашего сервера!:)
Я не знаю, какое будет лучшее решение, но это то, что я видел в некоторых видеоиграх, особенно в играх на Steam. Сначала игра пройдет аутентификацию с использованием обычной техники закрытого ключа. Затем игра загрузит скрипт, который запускается локально. Затем скрипт каким-то образом проверит исполняемый файл, на котором он находится. Скрипт может проверить, является ли исполняемый файл той же самой игрой или изменен. Сценарий позвонит домой до начала игры. Если сценарий не вызывает home, игровой сервер выводит игру из игры.
Автор вредоносных программ должен каким-то образом обмануть сценарий, считая его игрой. Всякий раз, когда обнаруживается вредоносная программа, сценарий изменяется разработчиком. Это гарантирует, что игровая компания имеет возможность деактивировать вредоносные программы в дикой природе.
Вы можете адаптировать подобную технику к вашему приложению.
В дополнение к предложению, которое вы сами сделаете, и некоторым другим постерам, вы можете рассмотреть возможность разделения безопасности для поиска и модификации базы данных. Если одна учетная запись будет взломана, другая будет в безопасности.