Есть ли у Microsoft рекомендуемый способ обработки секретов в заголовках в HttpClient? - PullRequest
1 голос
/ 07 марта 2020

Очень тесно связаны: Как защитить строки без SecureString?

Также тесно связаны: Когда мне понадобится SecureString в. NET?

Чрезвычайно тесно связаны (OP пытается достичь чего-то очень похожего): C# & WPF - Использование SecureString для клиентского HTTP-пароля HTTP

.. NET Framework имеет класс с именем SecureString . Однако даже Microsoft больше не рекомендует его использовать для новых разработок. Согласно первым связанным вопросам и ответам, по крайней мере, одной из причин этого является то, что строка в любом случае будет находиться в памяти в виде открытого текста как минимум некоторое время (даже если это очень короткий промежуток времени). По крайней мере, один ответ также расширил аргумент, что, если у них все равно есть доступ к памяти сервера, на практике безопасность, вероятно, все равно срабатывает, так что это вам не поможет. (Второй связанный вопрос и ответ подразумевают, что даже обсуждался вопрос об удалении этого из. NET Core полностью).

При этом документация Microsoft по SecureString не рекомендует замену, и консенсус по Похоже, связанные вопросы и ответы такого рода меры не были бы , которые полезны в любом случае.

Мое приложение, которое является ASP. NET Базовым приложением, делает обширным использование вызовов API для внешнего поставщика с использованием класса HttpClient. Как правило, рекомендуется для HttpClient: использовать один экземпляр, а не создавать новый экземпляр для каждого вызова.

Однако наш поставщик требует, чтобы все вызовы API включали наш API Ключ в качестве заголовка с указанным c именем. В настоящее время я надежно храню ключ, извлекаю его в Startup.cs и добавляю его в заголовки нашего HttpClient экземпляра.

К сожалению, это означает, что мой ключ API будет храниться в открытом виде в памяти в течение всего жизненного цикла. приложения. Я нахожу это особенно тревожным для веб-приложения на сервере; Несмотря на то, что сервер обслуживается корпоративными ИТ-отделами, меня всегда учили относиться даже к корпоративным сетям как к полузависимым средам и не полагаться исключительно на корпоративные брандмауэры для обеспечения безопасности приложений в таких случаях.

Есть ли у Microsoft рекомендуемая лучшая практика для подобных случаев? Это потенциальное исключение из их рекомендации против использования SecureString? (Как именно это будет работать, это отдельный вопрос). Или ответ на другие вопросы и ответы действительно верен, когда я говорю, что мне не следует беспокоиться о строках открытого текста, подобных этой памяти?

Примечание: В зависимости от ответов на этот вопрос, я может опубликовать дополнительный вопрос о том, возможно ли вообще использовать что-то вроде SecureString как часть HttpClient заголовков. Или мне придется сделать что-то хитрое, например заполнить заголовок прямо перед его использованием, а затем сразу же удалить его из памяти? (Это создаст абсолютный кошмар для одновременных вызовов). Если люди думают, что я должен сделать что-то подобное, я был бы рад создать для этого новый вопрос.

1 Ответ

4 голосов
/ 07 марта 2020

Вы слишком параноидальны.

Во-первых, если хакер получает root доступ к вашему веб-серверу, у вас НАМНОГО больше проблем, чем кражи ваших суперсекретных учетных данных веб-приложения. Путь, путь, гораздо большие проблемы. Как только хакеры окажутся на вашей стороне герметичного люка, игра окончена.

Во-вторых, как только ваша команда infose c обнаружит вторжение (если они этого не сделают, опять же, вы получите ПУТЬ больше проблемы) они скажут вам, и первое, что вы сделаете, это поменяете каждый ключ и пароль, о которых вы знаете.

В-третьих, если хакер получает root доступ к вашему веб-серверу, их первая мысль не будет «давайте возьмем дамп памяти для последующего анализа». Файл дампа довольно большой (потребуется время для передачи по проводам, и сетевой трафик c вполне может быть замечен) и (по крайней мере, на Windows) зависает процесс до его завершения (так что вы заметите свой веб приложение не отвечало) - оба из которых могут вызвать некоторые красные флаги.

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

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

...