2014-12-01 3 views
0

Я пытаюсь реализовать безопасность наших приложений (которые состоят в основном из веб-сайтов с использованием хранимых процедур SQL Server).Безопасность SQL Server - хранимые процедуры

Microsoft, похоже, считает, что наилучшей практикой является обертывание всех функций данных в хранимых процедурах, которые мы выполнили. Наша структура что-то вроде:

  • SQL базы данных сервера - [data1]
  • базы данных SQL Server - [webSPs]
  • PHP/Symfony веб-приложения

Все данные хранятся в таблицах в [data1] и на тот же сервер - это еще одна «база данных», которая содержит только хранимые процедуры, используемые веб-приложениями.

У SQL Server есть «webapp» для входа в систему, который, как пользователь на [webSPs], имеет разрешения только для запуска хранимых процедур в [webSPs].

Однако, поскольку эти хранимые процедуры чтения, записи, добавлять данные о [data1] таблицах, этот пользователь должен быть членом db_datawriter и db_datareader ролей базы данных в [data1].

Это все работает нормально, но похоже, что здесь есть дыра в безопасности, поскольку тогда пользователь может получить доступ к [webSPs], чтобы не только запускать хранимые процедуры, но и записывать в любую базовую таблицу - можно ли разрешить что сказать что-то вроде:

you can read/write to tables on this database but only through SPs - not directly

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

Заранее спасибо.

+5

Какова была мотивация размещения хранимых процедур * в другой * базе данных? Это, кажется, делает вещи излишне сложными, чем они должны быть .... –

+0

Пользователь не должен быть членом db_datawrite для записи данных из хранимой процедуры. Если у них есть разрешение на выполнение процедуры, они смогут записывать данные.Так что да, чтобы ответить на ваш вопрос, вы не позволяете этому пользователю писать непосредственно в таблицы, но дать им разрешение на выполнение процедур. –

+0

Шон, где таблицы находятся в другой базе данных, если пользователь не имеет явных прав на чтение и запись данных, он возвращает ошибку: «Разрешение SELECT отклонено ...» Я думаю, это связано с тем, что SP находятся в другой базе данных (согласно комментариям Марка выше) Просто интересно, есть ли способ обойти это, поскольку я хотел бы сохранить разделение, если это возможно. – PJM

ответ

0

Да, но это, откровенно говоря, боль для реализации. Вы можете использовать подписание модуля. По существу, вы:

  1. Создайте сертификат в базе данных WebSps.
  2. Резервного копирования и восстановление сертификата в базу данных Data1
  3. Создание пользователя из сертификата
  4. Grant все, что читать и писать разрешения для пользователя на основе сертификатов в data1
  5. подписывайте хранимую процедуру вы хотите использовать крест -Database с сертификатом по телефону с синтаксисом add signature

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