SQL Server повышенные разрешения с интегрированным входом - PullRequest
2 голосов
/ 07 июля 2010

У меня есть приложение, работающее в IIS, которое подключается к экземпляру SQL Server 2008 R2 с помощью встроенной проверки подлинности Windows. Это приложение выполняет простые операции чтения / записи в БД, используя набор хранимых процедур. Я могу довольно хорошо ограничить привилегии в SQL-сервере для этой комбинации логин / пользователь.

Но для небольшого подмножества приложения мне нужны «повышенные» / более мощные разрешения в базе данных ... например, создание / удаление уведомлений о событиях и, возможно, очередей и брокерских служб.

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

Я хотел бы использовать встроенную проверку подлинности Windows ... Проверка подлинности sql с двумя сочетаниями пользователя и пароля не возможна.

Есть ли рекомендуемый способ добиться этого?

  • Олицетворение в коде приложения, подключение к SQL Server с использованием встроенной защиты из олицетворенного контекста (другая учетная запись пользователя / вход в sql) не нравится, поскольку мне приходится управлять вторым логином / паролем
  • Роли приложения SQL-сервера (я полагаю, требуется пароль, предоставленный приложением) - не очень нравится, так как мне нужно хранить пароли
  • Аутентификация SQL с двумя пользователями - не вариант
  • создать выделенные хранимые процедуры для «повышенного уровня» и использовать execute as (должно сработать, однако, не уверен, смогу ли я создать хранимые процедуры в целевом БД)
  • сложная идея: запустить процесс приложения, подключиться к базе данных, ограничить токен приложения и затем открыть менее привилегированное соединение (это будет работать?)
  • использовать COM + ( а-ля переход протокола Кита Брауна ), службу WCF или второй процесс для "повышенных" частей приложения (слишком сложно)

Полагаю, есть какое-то простое и аккуратное решение, которого мне не хватает ...

Ответы [ 2 ]

3 голосов
/ 07 июля 2010

Используйте подпись кода. Все ваши «повышенные» операции выполняются из хранимых процедур, которые подписаны, а доверие основано на подписи процедуры. Это довольно эффективно и мощно, и чрезвычайно безопасно. Например, скажем, вам нужен способ, я не знаю, создать очередь и службу, связанную с контрактом http://schemas.microsoft.com/SQL/Notifications/PostEventNotification. Поэтому вам нужно запустить следующий код:

create queue myQueue;
create service myService on queue myQueue (
[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);

Это заявление потребует повышенных разрешений: CREATE QUEUE, CREATE SERVICE и ССЫЛКА на контракт EN. Вы можете встроить эти операторы в процедуру, подписать процедуру, создать пользователя из сертификата, использованного для подписания процедуры, а затем предоставить необходимые привилегии пользователю, полученному из сертификата:

create procedure usp_createQueueAndService
with execute as caller
as
begin
    create queue myQueue;
    create service myService on queue myQueue (
    [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
end
go

create certificate [certificateToSign_usp_createQueueAndService]
 ENCRYPTION BY PASSWORD = 'Password#1234'
 with subject = 'Code signing for usp_createQueueAndService';
go

ADD SIGNATURE TO OBJECT::[usp_createQueueAndService]
BY CERTIFICATE [certificateToSign_usp_createQueueAndService]
WITH PASSWORD = 'Password#1234';
go

ALTER CERTIFICATE [certificateToSign_usp_createQueueAndService]
REMOVE PRIVATE KEY;
GO

create user [certificateDerivedUser_usp_createQueueAndService]
from certificate [certificateToSign_usp_createQueueAndService];
go

grant create queue to [certificateDerivedUser_usp_createQueueAndService];
grant create service to [certificateDerivedUser_usp_createQueueAndService];
grant references on 
    contract::[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification] 
    to [certificateDerivedUser_usp_createQueueAndService];
go

Это 100% пуленепробиваемая безопасность. Все абоненты, которым предоставлено разрешение EXECUTE для процедуры, теперь могут создавать очередь и службу, поскольку самой процедуре предоставляются необходимые привилегии через подпись. Никто не может изменить процедуру, потому что ALTERing процедуры теряет подпись и, следовательно, теряет привилегии. Никто не может злоупотребить сертификатом для подписания другой процедуры, потому что закрытый ключ был утерян и утерян навсегда (закрытый ключ не нужен для проверки существующих подписей).

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

Конечно, вы можете заставить usp_createQueueAndService принимать имя очереди и службы в качестве параметров, я оставил эту часть в качестве простого упражнения для читателя. Если вы хотите поиграть с уведомлениями о событиях, такие упражнения должны быть для вас тривиальными;)

0 голосов
/ 07 июля 2010

Простое решение - одно из тех, от которых вы отказываетесь, используя учетную запись ресурса ...

Создание идентификатора пользователя сервера SQL с соответствующими разрешениями и использование этой учетной записи ресурса только из вашего приложения во времяспециальные операторы типа DDL будут самым простым и наиболее приемлемым решением.

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