Рекомендация. Защита персональных данных в среде ASP.NET / SQL Server 2008 - PullRequest
2 голосов
/ 18 января 2011

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

Я прочитал о функции шифрования SQL Server 2008, но я не уверен, что это тот путь, по которому я хочу идти. Моя проблема в конечном итоге сводится к тому, что мы используем либо симметричные ключи, либо ассиметричные ключи, зашифрованные симметричным ключом. Таким образом, похоже, что атака с использованием SQL-инъекции может привести к утечке данных. Я понимаю, что разрешения должны предотвращать это, разрешения также должны предотвращать утечку.

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

У вас есть лучшее предложение? Какой метод вы бы порекомендовали? Что важнее почему?

Ответы [ 3 ]

3 голосов
/ 18 января 2011

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

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

Возможно, вы захотите, как вы предложили, зашифровать/ расшифровать данные в приложении и сохранить в виде байтов в базе данных.Таким образом, вы контролируете, кто может дешифровать данные и когда (например, вы можете назначить ключ для дешифрования этих данных тем немногим сотрудникам, о которых вы упомянули, и которые играют определенную роль).Вы можете заглянуть в Microsoft Security Application Block или Bouncy Castle и т. Д., Чтобы найти хорошие утилиты шифрования.Просто будьте осторожны с тем, как вы управляете ключом.

Обновление :

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

1 голос
/ 18 января 2011

Некоторые практики, которым мы следуем:

  1. Никогда не используйте динамический sql.Это совершенно не нужно.

  2. Независимо от # 1, всегда параметризуйте свои запросы.Уже одно это избавит от внедрения SQL, но есть много других точек входа.

  3. Используйте наименее привилегированную учетную запись, которую вы можете использовать для доступа к серверу базы данных.Обычно это означает, что учетная запись НЕ должна иметь возможность выполнять специальные запросы (см. # 1).Это также означает, что у него не должно быть доступа для запуска каких-либо операторов DDL (create, drop, ..).

  4. Не доверяйте веб-приложению, тем более любому входу, полученному из браузера.Дезинфицировать все.Серверы веб-приложений взламываются на регулярной основе.

  5. Мы также имеем дело с большим количеством PII и очень строго (до паранойи) в отношении того, как и кем осуществляется доступ к данным.Все, что проходит через сервер, регистрируется.Чтобы это произошло, мы разрешаем доступ к базе данных только через хранимые процедуры.Процедуры всегда проверяют, авторизована ли учетная запись пользователя для выполнения запроса.Далее они регистрируются, когда, кто и что.У нас нет массовых запросов на удаление вообще.

  6. Наши идентификаторы абсолютно неубедительны.Это для каждой таблицы в системе.

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

  8. Мы проводим проверку данных администраторов баз данных и других сотрудников службы поддержки каждые 6 месяцев.Доступ к продукции строго контролируется и активно контролируется.Мы не разрешаем подрядчикам доступ к продукции по любой причине, и все проверяется перед тем, как быть введенным в кодовую базуключи.Часто меняйте эти ключи, например раз в месяц.

  9. ВСЕ данные, передаваемые между компьютерами, зашифрованы.Kerberos между серверами и рабочими столами;SSL между IIS и браузерами.

  10. Признайте и разработайте для факта, что много кражи данных от внутренних сотрудников.Либо путем активного взлома системы, активного предоставления доступа неавторизованным пользователям, либо пассивно путем установки дерьма (например, IE 6) на свои машины.Угадайте, как взломали Google.

Главный вопрос в вашей ситуации - это определение всех частей, которым требуется доступ к PII.

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

0 голосов
/ 18 января 2011

Ваша проблема - управление ключами. Независимо от того, каким образом вы решите проблему, вы получите один простой элементарный факт: процессу службы необходим доступ к ключам для шифрования данных (важно, что это фоновая служба, поскольку это означает, что она не может получить root ключа иерархии шифрования от введенного человеком пароля всякий раз, когда это необходимо). Следовательно, компрометация процесса приводит к компрометации ключа (ключей). Есть способы запутать эту проблему, но не существует способов ее скрыть. Однако, если взглянуть на это в перспективе, эту проблему может выявить только компромисс самого процесса SQL Server, что значительно выше, чем уязвимость SQL-инъекций.

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

Я рекомендую придерживаться проверенных и проверенных подходов. Используйте симметричный ключ для шифрования данных. Используйте ключ RSA для шифрования симметричного ключа (ключей). Имейте собственный SQL Server и управляйте закрытым ключом RSA. Используйте иерархию разрешений для защиты закрытого ключа RSA (на самом деле, нет ничего лучше, что вы могли бы сделать). Используйте модуль подписи для предоставления доступа к процедурам шифрования. Таким образом, сама служба ASP даже не имеет привилегий для шифрования данных, она может сделать это только с помощью подписанной процедуры шифрования. Вашим коллегам потребуются значительные «творческие» ошибки администрирования / кодирования, чтобы скомпрометировать такую ​​схему, значительно больше, чем просто «ошибка оператора». У системного администратора будет более простой путь, но любое решение, предназначенное для обхода системного администратора, обречено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...