2013-11-03 4 views
2

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

До сих пор мы использовали проприетарную базу данных, в которой данные клиента хранятся в виде файлов db (плоские файлы) в корневых каталогах клиента в файловой системе. Таким образом, разрешения операционной системы гарантируют, что приложение, используемое клиентом X, никогда не сможет извлекать данные из базы данных клиента Y. Обратите внимание, что здесь нет сервера базы данных/экземпляра/двигателя ...

Однако для моего проекта я хочу использовать базу данных SQL. Но люди безопасности выражают озабоченность по поводу ввода данных разных клиентов в одну базу данных.

Одним из вариантов является создание отдельных экземпляров базы данных для разных клиентов. Однако я не уверен, что эта идея масштабируема.

Так что мои вопросы:

1) Есть ли какой-либо механизм в MSSQL, что позволяет хранить базы данных «отдельно» в разных файлах, используемых сервером SQL?

2) Предположим, у меня есть только один экземпляр базы данных, где у меня есть базы данных клиента X и клиента Y. Как я могу убедиться, что запросы клиента X никогда не могут (случайно) получить неверное направление в базу данных клиента Y? Я не хочу полагаться на какой-то параметр в моем коде, чтобы определить, из какой базы данных выберется! :)

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

Я думаю, что это очень распространенная проблема, и для этого должно быть хорошим решением. Что делают другие компании?

Пожалуйста, дайте мне знать, если есть хорошие статьи, чтобы прочитать об этом.

ответ

1

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

Одним из возможных решений в SQL Server является создание отдельных наборов идентификаторов пользователей Windows и их сопоставление для разделения SQL-логинов для каждого клиента. Затем вы можете назначить этим входам доступ к соответствующим базам данных. Например, если вы размещаете веб-сайты для клиента X и клиента Y, вы должны установить строку (ы) подключения в web.config для веб-сайта клиента X, чтобы использовать соответствующие логины для базы данных клиента X. И наоборот для клиента Y. Это гарантирует, что независимо от того, что (за исключением жестко закодированного входа), код с сайта клиента X никогда не будет обращаться к базе данных клиента Y.

У вас может быть 32 000 баз данных на одном экземпляре SQL-сервера и наличие отдельных баз данных позволяет использовать несколько улучшенных сценариев обслуживания (например, восстановление базы данных одного клиента в случае проблемы с данными, не затрагивая всех ваших других клиентов).

http://technet.microsoft.com/en-us/library/ms143432.aspx

+0

Спасибо! Это было полезно. Мне нравится идея создания отдельных логинов SQL для каждого клиента. Но я не понимаю, почему нам нужно создавать идентификаторы окон? Еще одна вещь, о которой я не упоминаю, - это код базы данных на C++. Поэтому мне нужно будет подумать, где нужно иметь конфигурационные файлы для каждого клиента, чтобы они могли правильно создавать строки подключения перед запуском запроса. – user2948961

+0

Вам не нужно создавать логины Windows, вы также можете использовать логины SQL Server. – Szymon

+0

Ну, например, если вы использовали веб-сайты IIS и ASP.NET (просто угадывая здесь), вы могли бы использовать пулы приложений в качестве пользовательского идентификатора учетной записи Windows для конкретного клиента, который имеет только соответствующие привилегии для веб-сайта этого клиента. Если внутренний код C++, то, возможно, вы используете службы Windows, и в этом случае это по той же причине. Альтернативой является то, что вы будете использовать общий идентификатор пользователя Windows для запуска всех ваших веб-сайтов или служб? - похоже, это не соответствует вашему требованию о разделении. – NYCdotNet

Смежные вопросы