8

Вопрос по sql-server-2008, sql – SQL Server выполнить олицетворение

Какая разница между ...

execute as user = 'testuser'

А ТАКЖЕ

execute as login = 'testuser'

Я выполняю процедуру кросс-базы данных под этими логинами, и она работает с exececute как логин, но не как execute как пользователь. Он говорит, что принципал сервера "testuser" не может получить доступ к базе данных & quot; xxx & quot; в контексте безопасности.

Когда яSELECT SYSTEM_USER после обеих команд я вижу, что он установлен в'testuser'

3ответа

3

Пример для выполнения как:

СОЗДАНИЕ ПРОЦЕДУРЫ dbo.MyProcedure С ВЫПОЛНЕНИЕМ ВЛАДЕЛЬЦА

В этом случае вы выдаете себя за владельца вызываемого модуля. Вы также можете выдавать себя за САМОГО ИЛИ пользователя, создающего или изменяющего модуль ИЛИ ... возбудить CALLER, что позволит модулю принимать разрешения текущего пользователя, ИЛИ ... выдавать себя за ВЛАДЕЛЬЦА, который примет разрешение владельца процедуры, называемой ИЛИ ... выдавать себя за "имя_пользователя", которое будет выдавать себя за конкретного пользователя ИЛИ ... выдавать себя за «имя_файла»; с будет выдавать себя за конкретный логин.

Установка разрешения для таких объектов, как хранимые процедуры, может быть выполнена с помощью команды «GRANT EXECUTE ON». к;
Однако вы также можете предоставить права безопасности как на уровне входа, так и на уровне пользователя. ВЫ захотите определить и предоставить ТОЛЬКО необходимые права для объектов, которые требуют доступа (например, выполнение). Рассмотрите возможность использования «ВЫПОЛНИТЬ КАК» возможность, которая позволяет выдавать себя за другого пользователя проверять разрешения, необходимые для выполнения кода, БЕЗ необходимости предоставлять все необходимые права всем базовым объектам (например, таблицам). EXECUTE AS может быть добавлен к сохраненным процессам, функциям, триггерам и т. Д.

В большинстве случаев вам нужно будет только предоставить права EXECUTE для хранимых процедур, а затем права будут предоставлены всем объектам, на которые есть ссылки в хранимых процессах. Таким образом, вам не нужно давать неявные права (например, для обновления данных или вызова дополнительных процедур). Владение цепочкой обрабатывает это для вас. Это особенно полезно для динамического SQL или если вам нужно создать задачи повышенной безопасности, такие как CREATE TABLE. EXECUTE AS - удобный инструмент для рассмотрения.

Этот пример может помочь прояснить все это:

Создайте пользователя с именем NoPrivUser с открытым доступом к базе данных (например, dbadb)

ИСПОЛЬЗОВАТЬ [мастер] ИДТИ CREATE LOGIN [NoPrivUser] с паролем = N 'ABC5%', DEFAULT_DATABASE = [dbadb], CHECK_EXPIRATION = ON, CHECK_POLICY = ON ИДТИ USE [DBAdb] ИДТИ СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ [NoPrivUser] ДЛЯ ВХОДА [NoPrivUser] ИДТИ

ПРИМЕЧАНИЕ. СОЗДАТЕЛЬ ИЛИ ВЛАДЕЛЕЦ ЭТОЙ ПРОЦЕДУРЫ ТРЕБУЕТ СОЗДАТЬ ПРАВА ТАБЛИЦЫ в целевой базе данных.

использовать DBAdb идти СОЗДАНИЕ ПРОЦЕДУРЫ dbo.MyProcedure С ВЫПОЛНЕНИЕМ ВЛАДЕЛЬЦА КАК ЕСЛИ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ОТ sys.objects WHERE object_id = OBJECT_ID (N '[dbo] .MyTable & apos;) И введите (N' U '')) CREATE TABLE MyTable (PKid int, column1 char (10)) Вставить в MyTable ЗНАЧЕНИЯ (1, «ABCDEF»)

ИДТИ

GRANT EXEC ON dbo.MyProcedure для NoPrivUser; ИДТИ

- Теперь войдите на сервер базы данных как NoPrivUser и выполните следующее.

использовать dbadb идти

EXEC dbo.MyProcedure

(Затронут 1 ряд)

Теперь попробуйте выбрать из новой таблицы, когда вы вошли в систему как NoPrivuser.

Вы получите следующее:

выберите * из MyTable идти

Сообщение 229, Уровень 14, Состояние 5, Строка 1 В разрешении SELECT было отказано для объекта «MyTable», базы данных «DBAdb», схемы «dbo».

Это ожидаемо, поскольку вы только запускали процедуру в контексте безопасности Owner, когда вошли в систему как NoPrivUser.
NoPrivUser, поскольку нет прав на фактическое чтение таблицы. Просто чтобы выполнить процедуру, которая создает и вставляет строки.

С предложением EXECUTE AS хранимая процедура запускается в контексте владельца объекта. Этот код успешно создает dbo.MyTable, и строки успешно вставляются. В этом примере пользователь «NoPrivUser» не имеет абсолютно никаких прав на изменение таблицы, чтение или изменение любых данных в этой таблице.
Он принимает только те права, которые необходимы для выполнения этой конкретной задачи, закодированной в контексте этой процедуры.

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

2

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

http://msdn.microsoft.com/en-us/library/ms181362.aspx

11

execute as login обеспечивает олицетворение для всего сервера, поскольку логины находятся на уровне сервера. Поскольку пользователи определены для каждой базы данных,execute as user олицетворение применяется только к конкретной базе данных, поэтому вы видите ошибку при пересечении баз данных.

RelatedQuestions