Net Core Web API 2.2 Защита конфиденциальных данных

Я занимаюсь разработкой проекта.Net Core Web API 2.2 и стараюсь защитить его как можно лучше. Это приложение будет подключено к базе данных SQL, а также будет отправлять электронные письма с сервера, и поэтому я хотел бы выяснить, как можно защитить мои конфиденциальные данные (например, строку подключения, пароль базы данных или даже пароль электронной почты для SMTP). учетная запись).

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

Другой метод, предложенный некоторыми из вас, ребята, заключался в том, чтобы хранить все пароли для переменных среды и просто ссылаться на них в приложении. В настоящее время я изучаю эту опцию, так как мое приложение будет размещено на "виртуальном сервере Windows", к которому у меня нет прямого доступа, и, следовательно, трудно (без прямого доступа) попасть туда и настроить переменные среды (даже не уверен если бы это было возможно).

Наконец, до сих пор лучшим вариантом (в случае невозможности использовать упомянутые выше переменные) было на самом деле хранить соединения и пароли непосредственно в файле appsettings.json, но хэшировать их и дешифровать во время выполнения. Этот вариант для меня, безусловно, возможен; Однако я хотел спросить (хотя это может быть весьма субъективно), ребята, правильный ли это подход или я что-то упустил, что могло бы помочь мне лучше защитить свое приложение от внешних угроз.

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

PS Я использую VSTS-репозиторий для хранения всего кода приложения, что может быть (я предполагаю) причиной, по которой люди советуют хотя бы хешировать ваши пароли при хранении их в appsettings.json

1 ответ

Решение

appsettings.json Файл никогда не должен использоваться для секретов просто потому, что он предназначен для контроля версий. Одно это делает его плохим выбором. Тем не менее, также нет возможности шифровать что-либо в appsettings.json, Вы могли бы, я полагаю, зашифровать свои секреты с помощью других средств и просто поместить зашифрованный текст в appsettings.json вручную после факта, но тогда вам понадобится какое-то средство для расшифровки секрета позже, тогда как тогда подразумевается раскрытие ваших средств шифрования (то есть вашего личного ключа), что отчасти побеждает весь смысл. Длинный и короткий, не используйте appsettings.json,

Переменные среды являются компромиссным решением. Поскольку вы вручную устанавливаете их на сервере (не в своем контроле исходного кода), и они могут быть сделаны доступными только для определенных пользователей (ограниченный доступ), вы получаете некоторую степень безопасности. Тем не менее, они также хранятся в виде открытого текста, что означает, что если кто-то может получить доступ к серверу, чтобы просмотреть их, вся безопасность находится вне окна. Переменные окружения также могут быть установлены как часть вашего конвейера CI\D в DevOps (ранее VSTS), поэтому прямой доступ к серверу не обязательно является обязательным условием, если учетная запись службы, выполняющая развертывание, имеет необходимый доступ.

Azure Key Vault - рекомендуемый подход, поскольку это единственный встроенный поставщик конфигурации, который поддерживает шифрование, то есть ваши секреты зашифрованы в состоянии покоя и в значительной степени защищены сквозным. Однако в хранилище ключей Azure нет ничего особенного, кроме его доступности. Вы можете использовать любой тип сервиса, который позволяет безопасно хранить секреты; вам может понадобиться написать свой собственный провайдер конфигурации, чтобы настроить его.

Другие вопросы по тегам